S

Symfony

Темы: Symfony PHP smtp
+ ещё 3
Пример отправки писем через SMTP Mailexam на Symfony (PHP, Symfony Mailer).

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)

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

  1. Установите зависимости:
composer install
  1. Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
  1. Отредактируйте .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}
  1. Запустите сервер:
symfony server:start
# или: php -S 127.0.0.1:8000 -t public

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

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

См. также

Лицензия

Apache 2.0