A

Axum

Темы: axum rust smtp
+ ещё 2
Пример отправки писем через SMTP Mailexam на Rust с фреймворком Axum (библиотека lettre).

Axum + Mailexam

Минимальный пример Axum, который отправляет тестовое письмо через SMTP Mailexam с помощью lettre.

Основан на руководстве Mailexam для Axum.

Что понадобится

  • Rust 1.70+
  • Аккаунт Mailexam с SMTP-учётными данными для проекта

Из приветственного письма или личного кабинета Mailexam:

Переменная Описание
MAILEXAM_LOGIN SMTP-логин (хост: {login}.mailexam.ru)
MAILEXAM_PASSWORD SMTP-пароль (пара к логину)
MAILEXAM_PORT SMTP-порт (по умолчанию 587, STARTTLS)
MAIL_FROM Адрес отправителя (любой тестовый адрес)

Быстрый старт (на хосте)

  1. Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
  1. Запустите сервер:
cargo run

Сервер слушает http://127.0.0.1:8080 по умолчанию.

  1. Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:8080/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

При успехе endpoint возвращает ok. Письмо появится в личном кабинете Mailexam → ваш проект → входящие.

Переменные окружения

Переменная Обязательна По умолчанию Описание
MAILEXAM_LOGIN да SMTP-логин; также используется для имени хоста
MAILEXAM_PASSWORD да SMTP-пароль
MAILEXAM_PORT нет 587 SMTP-порт (587, 2525 или 465)
MAIL_FROM нет noreply@example.test Адрес отправителя
BIND_ADDR нет 127.0.0.1 Адрес привязки HTTP
PORT нет 8080 Порт HTTP

Для порта 587 транспорт использует STARTTLS через AsyncSmtpTransport::starttls_relay.

Структура проекта

.
├── Cargo.toml
├── src/
│   ├── main.rs   # HTTP-сервер и POST /mail/test
│   └── mail.rs   # конфигурация SMTP Mailexam и send_test через lettre
├── .env.example
├── Dockerfile         # только для локальной отладки
└── docker-compose.yml

Docker (отладка)

Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте через cargo run (см. выше).

cp .env.example .env
# отредактируйте .env с учётными данными Mailexam

docker compose up --build

Затем вызовите тот же endpoint на проброшенном порту:

curl -X POST http://127.0.0.1:8080/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Внутри контейнера сервер слушает 0.0.0.0:8080, чтобы работало проброс портов.

CI

Задайте эти секреты в окружении CI:

variables:
  MAILEXAM_LOGIN: $MAILEXAM_LOGIN
  MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
  MAILEXAM_PORT: "587"
  MAIL_FROM: "noreply@example.test"

После отправки письма в тесте проверьте доставку через API Mailexam.

Типичные проблемы

Ошибка TLS или подключения

  • Хост должен быть {login}.mailexam.ru, где {login} совпадает с MAILEXAM_LOGIN.
  • Логин и пароль должны быть из одного проекта Mailexam.
  • Для порта 587 используйте starttls_relay, а не SMTPS на 465.

Письмо не в кабинете

  • Откройте входящие того же проекта Mailexam.
  • Проверьте ответ обработчика: ошибки SMTP возвращаются из send_test.

См. также

Лицензия

Apache 2.0