P

Phoenix

Темы: phoenix elixir smtp
+ ещё 3
Пример отправки писем через SMTP Mailexam на Phoenix (Elixir, библиотека Swoosh).

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)

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

  1. Установите зависимости:
mix deps.get
  1. Экспортируйте учётные данные Mailexam (или скопируйте из примера):
cp .env.example .env
export $(grep -v '^#' .env | xargs)
  1. При необходимости отредактируйте .env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
  1. Запустите сервер:
mix phx.server

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

  1. Отправьте тестовое письмо:
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.

См. также

Лицензия

Apache 2.0