Phoenix + Mailexam
Минимальный пример Phoenix, который отправляет тестовое письмо через SMTP Mailexam с помощью Swoosh.
Основан на руководстве Mailexam для Phoenix.
Что понадобится
- Аккаунт Mailexam и проект с SMTP-учётными данными.
- Elixir 1.15+ и Erlang/OTP 26+.
Из приветственного письма или личного кабинета Mailexam:
| Переменная | Описание |
|---|---|
MAILEXAM_LOGIN |
SMTP-логин (например, xxxxx) |
MAILEXAM_PASSWORD |
SMTP-пароль (пара к логину) |
| Host |
{MAILEXAM_LOGIN}.mailexam.ru (задаётся в config/runtime.exs) |
Быстрый старт (на хосте)
- Установите зависимости:
mix deps.get
- Экспортируйте учётные данные Mailexam (или скопируйте из примера):
cp .env.example .env
export $(grep -v '^#' .env | xargs)
- При необходимости отредактируйте
.env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
- Запустите сервер:
mix phx.server
По умолчанию сервер слушает http://127.0.0.1:4000.
- Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:4000/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'
Письмо появится в личном кабинете Mailexam → ваш проект → входящие.
Альтернатива через IEx
iex -S mix
Mailexam.TestEmail.deliver("user@example.test", "Phoenix + Mailexam", "Тест Mailexam из Phoenix")
Переменные окружения
| Переменная | Обязательна | По умолчанию | Описание |
|---|---|---|---|
MAILEXAM_LOGIN |
да | — | SMTP-логин; также используется для имени хоста |
MAILEXAM_PASSWORD |
да | — | SMTP-пароль |
MAILEXAM_PORT |
нет | 587 |
SMTP-порт (587, 2525 или 25) |
MAIL_FROM |
нет | noreply@example.test |
Адрес отправителя |
PORT |
нет | 4000 |
Порт HTTP |
Для портов 587 и 2525 STARTTLS включён (tls: :always). Для порта 25 — отключён.
Структура проекта
.
├── mix.exs
├── config/runtime.exs # Mailexam SMTP через Swoosh.Adapters.SMTP
├── lib/mailexam/mailer.ex
├── lib/mailexam/test_email.ex
├── lib/mailexam_web/controllers/mail_controller.ex
├── config/routes via router.ex # POST /mail/test
├── .env.example
├── Dockerfile # только для локальной отладки
└── docker-compose.yml
Docker (отладка)
Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте через mix phx.server (см. выше).
cp .env.example .env
# отредактируйте .env с учётными данными Mailexam
docker compose up --build
Затем вызовите тот же endpoint на проброшенном порту:
curl -X POST http://127.0.0.1:4000/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'
Внутри контейнера сервер слушает 0.0.0.0:4000.
CI
Задайте эти секреты в окружении CI:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
После отправки письма в тесте проверьте доставку через API Mailexam.
Типичные проблемы
Ошибка TLS или аутентификации
- Хост должен быть
{логин}.mailexam.ru, где{логин}совпадает сMAILEXAM_LOGIN. - Логин и пароль должны быть из одного проекта Mailexam.
Порт 587
- Требуется
tls: :always, а не:never.
Таймаут SMTP или ошибка :smtp_response
- Убедитесь, что
gen_smtpесть в зависимостях и переменные заданы доmix phx.server.
Письмо не в кабинете
- Откройте входящие того же проекта Mailexam.
- В dev включите debug-логи:
config :logger, level: :debug.
См. также
- Руководство Mailexam для Phoenix (wiki)
- Пример на Django — похожая SMTP-настройка через config
- Swoosh SMTP adapter
- Документация API Mailexam
Лицензия
Apache 2.0