в веб-приложении php5, получая адрес электронной почты от пользователя и вставляя его в базу данных, но хотите отправить электронное письмо без участия пользователя, ожидающего завершения электронного письма. используя gmail, иногда занимает несколько секунд.
думая о fopen( "http://self.com/mailer.php", "r" )
, где mailer.php
будет выполнять фактическую рассылку. будет ли это работать?
Есть два подхода, которые хорошо работали для меня в прошлом.
Очередь электронной почты базы данных
Создайте таблицу «email_queue» в своей базе данных или все остальное, что вы используете для постоянного хранения. Каждая запись содержит все, что вам нужно, чтобы отправить электронное письмо (например, тема, получатель, отправитель, тело и т. Д.) И поле «отправлено». Чтобы отправить электронное письмо, вы добавляете запись в эту таблицу с помощью вспомогательного класса.
Затем вы создаете скрипт cli php, который читает из фильтрации таблицы очередей для записей, для которых установлен флаг отправки 0, отправляет электронное письмо и, наконец, устанавливает флаг отправки в 1. Этот скрипт должен запускаться в задании cron, но поскольку вы вероятно, хотите запускать его чаще, чем одну минуту, вы можете использовать что-то вроде Frequent-cron . Запланированная задача должна выполняться только на одном веб-сервере, если у вас много (и предполагается, что ваше постоянное хранилище является общим).
Локальная очередь электронной почты
У меня также был некоторый успех при настройке локального сервера постфикса на каждом веб-сервере для доставки почты с использованием внешней службы smtp. Цель здесь – получить постфикс, чтобы как можно быстрее принять электронное письмо (потому что оно локально), а затем доставить его через внешний SMTP-сервер в другом процессе. Postfix будет выступать в качестве промежуточной очереди.
Мне лично нравится первое решение, потому что оно дает вашему приложению больше информации о доставке электронной почты для ведения статистического анализа и т. Д.
Надеюсь, это поможет.