Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Отправка писем

Подтверждение регистрации, сброс пароля, уведомление о заказе — почти каждый сайт отправляет письма. В Symfony за это отвечает компонент Mailer: письмо описывают объектом, а способ доставки задают одной строкой настроек.

Настройка

Способ отправки записывают в .env:

MAILER_DSN=smtp://user:password@smtp.example.com:587

Для почтовых сервисов — Mailgun, Amazon SES, Postmark и других — есть готовые пакеты со своим форматом строки.

Простое письмо

use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
 
#[Route('/contact/send', name: 'contact_send', methods: ['POST'])]
public function send(MailerInterface $mailer): Response
{
    $email = (new Email())
        ->from('site@example.com')
        ->to('support@example.com')
        ->subject('Новое сообщение')
        ->text('Текст сообщения');
 
    $mailer->send($email);
 
    return $this->redirectToRoute('contact');
}

Методы письма

МетодЧто задаёт
from(), to()Отправитель и получатель
cc(), bcc()Копия и скрытая копия
replyTo()Адрес для ответа
subject()Тема
text(), html()Содержимое
attachFromPath()Вложение

Письмо из шаблона

Разметку письма удобнее хранить в Twig:

use Symfony\Bridge\Twig\Mime\TemplatedEmail;
 
$email = (new TemplatedEmail())
    ->from('site@example.com')
    ->to($user->getEmail())
    ->subject('Добро пожаловать!')
    ->htmlTemplate('emails/welcome.html.twig')
    ->context(['user' => $user]);
 
$mailer->send($email);
{# templates/emails/welcome.html.twig #}
<h1>Здравствуйте, {{ user.name }}!</h1>
<p>Спасибо за регистрацию.</p>
<a href="{{ url('profile') }}">Открыть профиль</a>

В письмах используют url(), а не path(): получателю нужен полный адрес с именем сайта.

Вложения

$email->attachFromPath('/var/www/blog/var/invoices/42.pdf', 'Счёт.pdf');

Отправитель по умолчанию

Чтобы не повторять from() в каждом письме, адрес задают в настройках:

# config/packages/mailer.yaml
framework:
    mailer:
        dsn: '%env(MAILER_DSN)%'
        envelope:
            sender: 'site@example.com'
        headers:
            From: 'Мой блог <site@example.com>'

Письма при разработке

Настоящие письма при разработке не отправляют. Два способа:

MAILER_DSN=null://null

Так письма никуда не уходят, но видны в профилировщике — на вкладке E-mails. Второй способ — программа Mailpit: она принимает письма и показывает их в браузере.

MAILER_DSN=smtp://localhost:1025

Частая ошибка

Если в проекте установлен Messenger, письма отправляются не сразу, а попадают в очередь. Без запущенного обработчика они останутся в ней навсегда, хотя код отработает без ошибок. Запустите php bin/console messenger:consume async или уберите строку SendEmailMessage из config/packages/messenger.yaml.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.