Symfony + Mailexam
Минимальный пример Symfony, который отправляет тестовое письмо через SMTP Mailexam с помощью Symfony Mailer.
Основан на руководстве Mailexam для Symfony.
Что понадобится
- Аккаунт Mailexam и проект с SMTP-учётными данными.
- PHP 8.2+ и Composer.
Из приветственного письма или личного кабинета Mailexam:
| Переменная | Описание |
|---|---|
MAILEXAM_LOGIN |
SMTP-логин (например, xxxxx) |
MAILEXAM_PASSWORD |
SMTP-пароль (пара к логину) |
| Хост |
{MAILEXAM_LOGIN}.mailexam.ru (используется в MAILER_DSN) |
Быстрый старт (на хосте)
- Установите зависимости:
composer install
- Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
- Отредактируйте
.env— укажитеMAILEXAM_LOGIN,MAILEXAM_PASSWORDи случайныйAPP_SECRET:
APP_SECRET=ваш-случайный-секрет
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
MAILER_DSN=smtp://${MAILEXAM_LOGIN}:${MAILEXAM_PASSWORD}@${MAILEXAM_LOGIN}.mailexam.ru:${MAILEXAM_PORT}
- Запустите сервер:
symfony server:start
# или: php -S 127.0.0.1:8000 -t public
По умолчанию сервер слушает http://127.0.0.1:8000.
- Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:8000/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'
Письмо появится в личном кабинете Mailexam → ваш проект → входящие.
Переменные окружения
| Переменная | Обязательна | По умолчанию | Описание |
|---|---|---|---|
MAILEXAM_LOGIN |
да | — | SMTP-логин; поддомен хоста в MAILER_DSN
|
MAILEXAM_PASSWORD |
да | — | SMTP-пароль |
MAILEXAM_PORT |
нет | 587 |
SMTP-порт (587, 2525 или 25) |
MAIL_FROM |
нет | noreply@example.test |
Адрес отправителя |
MAILER_DSN |
да | — | DSN Symfony Mailer (см. .env.example) |
APP_SECRET |
да | — | Секрет приложения Symfony (любая случайная строка для локальной разработки) |
HTTP_HOST |
нет | 127.0.0.1 |
Адрес привязки HTTP (Docker) |
HTTP_PORT |
нет | 8000 |
Порт HTTP (Docker) |
Если пароль содержит @, : или /, закодируйте его через rawurlencode() или задайте MAILER_DSN вручную одной строкой в .env.local.
Структура проекта
.
├── composer.json
├── config/packages/mailer.yaml
├── src/Controller/MailController.php
├── public/index.php
├── .env.example
├── Dockerfile # только для локальной отладки
└── docker-compose.yml
Docker (отладка)
Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте (см. выше).
cp .env.example .env
# отредактируйте .env с учётными данными и APP_SECRET
docker compose up --build
Затем вызовите тот же endpoint на проброшенном порту:
curl -X POST http://127.0.0.1:8000/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'
Внутри контейнера сервер слушает 0.0.0.0:8000, чтобы работало проброс портов.
CI
Задайте эти секреты в окружении CI:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
MAILER_DSN: "smtp://${MAILEXAM_LOGIN}:${MAILEXAM_PASSWORD}@${MAILEXAM_LOGIN}.mailexam.ru:587"
После отправки письма в тесте проверьте доставку через API Mailexam.
Для unit-тестов без реальной отправки используйте null://null как DSN почты в тестовом окружении.
Типичные проблемы
Authentication failed / connection refused
- Проверьте
MAILER_DSN: хост{логин}.mailexam.ru, логин и пароль должны быть парой из одного проекта Mailexam.
Ошибка из-за символов в пароле
- Закодируйте пароль в DSN или задайте полную строку DSN вручную в
.env.local.
Кеш конфигурации
- После изменения
.env:php bin/console cache:clear.
Письмо не в кабинете
- Откройте входящие того же проекта Mailexam.
См. также
- Руководство Mailexam для Symfony (wiki)
- Пример на Laravel, Magento и Yii — другие PHP-фреймворки
- Документация Symfony Mailer
- Документация API Mailexam
Лицензия
Apache 2.0