Отправка писем
Подтверждение регистрации, сброс пароля, уведомление о заказе — почти каждый сайт отправляет письма. В 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.