Перейти к содержанию

Symfony

Инструкция для приложений на Symfony 6.4 / 7.x. Mailexam подключается через Symfony Mailer и DSN smtp:// в .env.

Что понадобится

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • Symfony-приложение (Skeleton или Webapp).

Скопируйте из приветственного письма (или кабинета) для вашего проекта:

  • ВАШ_ЛОГИН — SMTP-логин (например, xxxxx);
  • ВАШ_ПАРОЛЬ — SMTP-пароль (уникальная пара к логину);
  • хост — ВАШ_ЛОГИН.mailexam.ru (совпадает с логином).

1. Зависимости

Если Mailer ещё не установлен:

composer require symfony/mailer

В шаблоне Symfony Webapp пакет обычно уже подключён.

2. Переменные окружения

Файл .env (или .env.local, не коммитьте секреты):

MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test

###> symfony/mailer ###
MAILER_DSN=smtp://${MAILEXAM_LOGIN}:${MAILEXAM_PASSWORD}@${MAILEXAM_LOGIN}.mailexam.ru:${MAILEXAM_PORT}
###< symfony/mailer ###

Хост в DSN — ВАШ_ЛОГИН.mailexam.ru, логин и пароль — из письма.

Адрес отправителя

MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam, а не реальному получателю.

Спецсимволы в пароле

Если в пароле есть @, :, / и другие символы DSN, закодируйте пароль для URL (rawurlencode) или задайте MAILER_DSN вручную в .env.local одной строкой.

Альтернативные порты

MAILEXAM_PORT=587
MAILEXAM_PORT=2525
MAILEXAM_PORT=25

3. Конфигурация Mailer

Файл config/packages/mailer.yaml (создаётся Flex автоматически):

framework:
    mailer:
        dsn: '%env(MAILER_DSN)%'

Дополнительных транспортов для Mailexam не требуется.

4. Отправка тестового письма

Через контроллер

// src/Controller/MailController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Attribute\Route;

final class MailController extends AbstractController
{
    #[Route('/mail/test', name: 'mail_test', methods: ['POST'])]
    public function test(MailerInterface $mailer): JsonResponse
    {
        $from = $_ENV['MAIL_FROM'] ?? 'noreply@example.test';

        $mailer->send(
            (new Email())
                ->from($from)
                ->to('user@example.test')
                ->subject('Symfony + Mailexam')
                ->text('Тест Mailexam из Symfony')
        );

        return $this->json(['status' => 'ok']);
    }
}

Запуск и проверка:

symfony server:start
# или: php -S 127.0.0.1:8000 -t public
curl -X POST http://127.0.0.1:8000/mail/test

Через консоль

php bin/console mailer:test user@example.test --from=noreply@example.test

(команда доступна, если установлен symfony/mailer и настроен DSN.)

Письмо появится в кабинете Mailexam → ваш проект → входящие.

5. Локальная разработка и CI

Среда Рекомендация
local .env.local с MAILER_DSN
CI Секреты MAILEXAM_LOGIN, MAILEXAM_PASSWORD; соберите MAILER_DSN в job

Пример для GitLab 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"

Для unit-тестов без реальной отправки в config/packages/test/mailer.yaml:

framework:
    mailer:
        dsn: 'null://null'

6. Типичные проблемы

Authentication failed / connection refused

  • Проверьте MAILER_DSN: хост {логин}.mailexam.ru, логин и пароль — пара из письма.
  • Логин в URL пользователя DSN должен совпадать с поддоменом хоста.

Ошибка из-за символов в пароле

  • Используйте rawurlencode для пароля в DSN или задайте полную строку DSN вручную в .env.local.

Письмо не в кабинете

  • Убедитесь, что в test не переопределён null://null transport.
  • Смотрите входящие того же проекта Mailexam.

Кэш конфигурации

  • После смены .env: php bin/console cache:clear.

См. также