В прошлом у меня хорошо работали два подхода.
База данных электронной почты
Создайте таблицу «email_queue» в своей базе данных или что-либо еще, что вы используете для постоянного хранения. Каждая запись содержит все, что вам нужно для отправки электронного письма (например, тема, получатель, отправитель, тело и т. Д.) И поле флага «отправлено». Чтобы отправить электронное письмо, вы добавляете запись в эту таблицу с помощью вспомогательного класса.
Затем вы создаете сценарий cli php, который читает из таблицы очередей фильтрацию записей, для которых флаг отправления установлен в 0, отправляет электронное письмо и, наконец, устанавливает флаг отправления равным 1. Этот сценарий должен запускаться в задании cron, но поскольку вы, вероятно, хотите запускать его чаще, чем за одну минуту, вы можете использовать что-то вроде Frequent-cron . Запланированное задание должно выполняться только на одном веб-сервере, если их много (и предполагается, что ваше постоянное хранилище используется совместно).
Локальная очередь электронной почты
У меня также был некоторый успех при настройке локального сервера postfix на каждом веб-сервере для доставки почты с использованием внешней службы smtp. Цель в том, чтобы получить постфикс, который бы принимал электронную почту как можно быстрее (потому что она была локальной), а затем доставлял ее через внешний SMTP-сервер в другом процессе. Postfix будет выступать в качестве промежуточной очереди.
Мне лично нравится первое решение, потому что оно дает вашему приложению больше информации о доставке электронной почты для ведения статистического анализа и т. Д.
Надеюсь, это поможет.