Minimal Phoenix example that sends test mail through Mailexam SMTP via Swoosh.
Based on the Mailexam Phoenix guide.
- A Mailexam account and a project with SMTP credentials.
- Elixir 1.15+ and Erlang/OTP 26+.
From your Mailexam welcome email or dashboard:
| Variable | Description |
|---|---|
MAILEXAM_LOGIN |
SMTP login (for example, xxxxx) |
MAILEXAM_PASSWORD |
SMTP password (paired with the login) |
| Host | {MAILEXAM_LOGIN}.mailexam.ru (built in config/runtime.exs) |
- Install dependencies:
mix deps.get- Export Mailexam credentials (or copy from the example file):
cp .env.example .env
export $(grep -v '^#' .env | xargs)- Edit
.envif needed:
MAILEXAM_LOGIN=YOUR_LOGIN
MAILEXAM_PASSWORD=YOUR_PASSWORD
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test- Run the server:
mix phx.serverThe server listens on http://127.0.0.1:4000 by default.
- Send a test message:
curl -X POST http://127.0.0.1:4000/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Test","body":"Hello"}'The message appears in the Mailexam dashboard → your project → inbox.
iex -S mixMailexam.TestEmail.deliver("user@example.test", "Phoenix + Mailexam", "Mailexam test from Phoenix")| Variable | Required | Default | Description |
|---|---|---|---|
MAILEXAM_LOGIN |
yes | — | SMTP login; also used to build the host name |
MAILEXAM_PASSWORD |
yes | — | SMTP password |
MAILEXAM_PORT |
no | 587 |
SMTP port (587, 2525, or 25) |
MAIL_FROM |
no | noreply@example.test |
Sender address (any test address is fine) |
PORT |
no | 4000 |
HTTP listen port |
For ports 587 and 2525, STARTTLS is enabled (tls: :always). For port 25, it is disabled.
.
├── mix.exs
├── config/runtime.exs # Mailexam SMTP via 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 # for local debugging only
└── docker-compose.yml
Docker is provided for local debugging. For day-to-day development, run the app on the host with mix phx.server (see above).
cp .env.example .env
# edit .env with your credentials
docker compose up --buildThen call the same endpoint on the mapped port:
curl -X POST http://127.0.0.1:4000/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Test","body":"Hello"}'Inside the container the server binds to 0.0.0.0:4000.
Set these secrets in your CI environment:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"After sending a message in a test, verify delivery via the Mailexam API.
TLS or authentication failed
- Host must be
{login}.mailexam.ru, where{login}matchesMAILEXAM_LOGIN. - Login and password must come from the same Mailexam project.
Port 587
- Requires
tls: :always, not:never.
SMTP timeout or :smtp_response error
- Ensure
gen_smtpis in dependencies and variables are set beforemix phx.server.
Message not in the dashboard
- Open the inbox of the same Mailexam project.
- In dev, enable debug logs:
config :logger, level: :debug.