Отправка электронной почты

Реализация отправки электронных писем по протоколу SMTP. Установка эмулятора почтового сервера для локальной разработки. Подключение шаблонизатора для рендеринга HTML-писем. Генерация ссылок с API на Frontend. Unit-тесты для процедур с использованием моков.

  • 00:02:15 Обзор библиотеки Swift Mailer
  • 00:05:19 Различия отправки писем в production и develop
  • 00:08:34 Эмулятор почтового сервиса MailHog
  • 00:13:16 Ручная проверка отправки писем в консоли
  • 00:15:23 Настройка Swift Mailer в DI-контейнере
  • 00:17:45 Письмо подтверждения регистрации
  • 00:21:36 Тестирование JoinComfirmationSenderTest через моки
  • 00:27:00 Настройка отправителя from по умолчанию
  • 00:28:56 Абсолютный адрес фронтенда
  • 00:30:22 Генератор адресов FrontendUrl
  • 00:33:49 Подключение шаблонизатора Twig
  • 00:37:29 Написание писем в формате HTML
  • 00:40:50 Перенос генерации адресов в Twig-расширение
  • 00:42:52 Тест для Twig Extension
  • 00:48:27 Итоговые тесты
  • 00:51:36 Код остальных сендеров
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (30)
Arunas

Спасибо. Очень интересно. Очень хорошый урок. Здорово было, хотелось бы пасмотреть, как почта работает в реальных условиях (в продакшен) - с Яндексом или с Гуглом. Обещайте, пожалуйста, Дмитрий, что покажите, как сделать это до конца.

Ответить
Дмитрий Елисеев

Реальную почту впишем, когда будем делать деплой через CI/CD Pipeline.

Ответить
Arunas

Большое спасибо.

Ответить
Альберт

Не работает плеер, ни в хроме ни в сафари.

Ответить
Oaks

В репозитории отсутствует файл MailerCheckCommand.php

Ответить
Дмитрий Елисеев

Мы делали эту команду только для имитации работы. В самом проекте она не нужна.

Ответить
Oaks

Спасибо за ответ

Ответить
Александр

Дмитрий подскажите, пожалуйста, что то типа MailHog для sms, на SMPP протокол ? Какой пакет лучше использовать, если проект на Symfony 5, смотреть в сторону Symfony Notifier ?

Ответить
Дмитрий Елисеев

Любой, который найдёте по запросу "docker smpp". Либо взять любой SMPP симулятор и самому через свой Dockerfile завернуть в Docker.

А если работаете через сервис с API, до достаточно будет сочинить свой эмулятор этого API.

Ответить
slo_nik

Добрый вечер.

Подскажите пожалуйста, можно ли использовать mailhog для отправки писем на рабочем сервере?

Как я понимаю нужно в docker установить smtp сервер, чтобы была возможность отправлять письма. Подходит ли для этой цели mailhog?

Проект на symfony 5, использую smtp gmail.com.

Или лучше поискать на hub.docker.com другой smtp сервер для установки в docker образ?

Ответить
Дмитрий Елисеев

Нет, mailhog - это лишь девелоперский эмулятор, не умеющий отправлять письма реально. Можно найти другой полноценный почтовик.

Но весь интернет заполонили спамеры, поэтому со своим почтовиком нужно приложить много усилий по правильной настройке DKIM, SPF и PTR, чтобы не попадать в спам. А для массовых рассылок нужно добавлять особые ссылки для отписки. И после этого переписываться с поддержкой MailRu если они случайно посчитают ваш IP-адрес спамерским.

Поэтому рекомендую всё-таки для одиночных системных писем остаться на Yandex и Gmail или почтовике своего хостинга с их лимитами. А если нужна массовая рассылка, то использовать специализированные платные сервисы рассылки вроде UniSender или MailChimp. Они сами всё это делают правильно.

Ответить
slo_nik

Добрый день.

Я использую возможности symfony для отправки почты через аккаунт gmail.

Как в этом случае сделать возможным отправки писем.

MAILER_URL=gmail://my_email:my_password@default

Установлен пакет symfony/google-mailer v5.1.10

При отправке писем таким способом тоже велик шанс попасть в спам?

Ответить
Дмитрий Елисеев

Если через Gmail, то всё нормально.

Ответить
slo_nik

Да, но всё равно нужен smtp сервер в docker устанавливать?

Ответить
Дмитрий Елисеев

Зачем?

Ответить
slo_nik

А как в этом случае тогда настроить, чтобы уходили письма с сайта?

Опять же, не до конца понимаю как это будет работать.

Сейчас именно так настроено в docker контейнере, но письма не уходят.

Но если я укажу в настойках mailhog использовать порт 25 - всё работатет.

 mailer:
    image: mailhog/mailhog
   ports:
       - "25:1025"
Ответить
Дмитрий Елисеев

Для разработки настраиваете:

MAILER_URL=smtp://mailer:1025

для отправки в Mailhog-эмулятор.

А на продакшене подставляете реальные данные:

MAILER_URL=gmail://email:password@default

для реально отправки через Gmail.

Ответить
slo_nik

Именно так настроено, но почта не уходит.

Для разработки в mailhog уходит, но на реальный адрес нет.

Ответить
Дмитрий Елисеев

Это уже проблема в Google. Либо вы в настройках ящика в Gmail отправку по SMTP не зазрешили, либо в поле FROM писем неверный адрес подставляете.

Ответить
slo_nik

В gmail проблем нет, доступ разрешил.

Проверю from, возможно в нём ошибка.

Ответить
Дмитрий Елисеев

Во FROM должен быть именно тот же ваш Gmail-адрес из MAILER_URL. Чужие адреса подставлять нельзя.

Ответить
slo_nik

Проблема решилась.

Но включить доступ к аккаунту оказалось недостаточно.

Понадобилось ещё подтверждать доступ по ссылке https://accounts.google.com/DisplayUnlockCaptcha

Как я понял, это требуется если из нескольких мест пытаешься получить доступ к аккаунту. Хотя могу и ошибаться.

Ответить
slo_nik

Если получится настроить dkim, spf, ptr и подобрать полноценный почтовик, то появится отправлять почту со своего сервера используя своё доменное имя для почтовых адресов?

Ответить
Дмитрий Елисеев

Если получится, то появится. Но вместо этого намного проще создать почту для своего домена в Яндекс Connect или Google Workspace.

Ответить
Владимир

Дмитрий, как Вы и сказали, для хороших емейлов необходимо использовать таблицы, инлайновые стили. Но, как показывает практика, очень утомительно каждый раз прописывать их в каждом шаблоне.

Можно попробовать использовать плагин для вставки инлайновых стилей. https://github.com/tijsverkoyen/CssToInlineStyles

Ну или готовый плагин для swiftmailer (лучше самому написать 1 класс). https://github.com/OpenBuildings/swiftmailer-css-inliner

Может кому-то будет полезно. Или есть лучше способы обработки?

Ответить
Дмитрий Елисеев

Шаблонов писем обычно не так уж и много, чтобы на них утомиться. А так да, конвертер интересный.

Ответить
Тимур

Дмитрий, имеет ли смысл вместо прямого использования Swift_Mailer, для начала написать какой нибудь свой адаптер со своим интерфейсом над ним? Как быть в будущем при замене библиотеки, когда будет создано большое количество сервисов по типу JoinConfirmationSender?

Ответить
Дмитрий

Подскажите, в каком случае следует использовать ssmtp/msmtp в docker контейнере?

Ответить
Дмитрий Елисеев

Если в контейнере запускаете shell-скрипт, который умеет отправлять письма через sendmail. Тогда можно вместо sendmail установить и настроить msmtp или exim, чтобы он отправлял письма через SMTP.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Yandex
MailRu
GitHub
Google