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 |
Адрес отправителя (любой тестовый адрес) |
Быстрый старт (на хосте)
- Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
- Запустите сервер:
cargo run
Сервер слушает http://127.0.0.1:8080 по умолчанию.
- Отправьте тестовое письмо:
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.
См. также
- Руководство Mailexam для Axum (wiki)
- Пример на Actix Web — тот же mail-модуль, другой HTTP-фреймворк
- Документация API Mailexam
- Документация Axum
- Документация lettre
Лицензия
Apache 2.0