Создание очереди электронной почты в PHP?

В настоящее время я создаю систему котировок, которая работает следующим образом:

Пользователь отправляет данные через форму -> данные отправляются в БД -> генерируется PDF -> электронная почта отправлена

Я использую htmlmimemail5 библиотека для этого и сгенерированное письмо отправляется на почтовый обмен на отдельном сервере в локальной сети.

К сожалению, негативной стороной этого является то, что сценарий php занимает около минуты, чтобы полностью выполнить, поскольку сценарий ожидает подтверждения от MX, что электронное письмо было отправлено или не удалось.

Так что я надеялся, что это возможно - иметь отдельное PHP-приложение, которое обрабатывает всю обработку электронной почты и означает, что пользователю не нужно ждать минуты и вместо этого он может перейти на следующую страницу, где он может просматривать информацию и т. Д.

Это приложение будет успешно работать в очереди электронной почты, которая была создана из запросов пользовательских процессов, и если очередь пуста, возможно, будет закрыта?

Я предполагаю, что это должна быть какая-то очередь электронной почты (например, очередь печати).

Однако, поскольку я - младший разработчик PHP, а все остальные разработчики слишком заняты, чтобы присматривать за детьми, я совершенно потерян и даже не знаю, с чего начать, или это даже правильная стратегия?

Дополнительная информация:

  • Сервер является тюрьмой BSD
  • Apache 2.2 /PHP5

Все внутренние и внешние электронные письма направляются через POSTINI, что также добавляет задержку.

Любые идеи или предложения приветствуются!:)

2 ответа

Решение

Да, это довольно просто реализовать. Вместо немедленной отправки сохраните данные электронной почты в базе данных. Иметь скрипт (работающий каждую минуту через cron или, что еще лучше, демонизированный PHP-скрипт), который принимает электронные письма в очереди и отправляет их.

Убедитесь, что в вашей базе данных есть флаги для обозначения прогресса, то есть столбец для "отправки" и один для "отправлено", чтобы ваш сценарий знал, что не нужно пытаться повторно отправить тот, который уже находится в процессе отправки.

Запустите локальный MX, который будет получать только с локального хоста и переведет на "настоящий" MX.

Другие вопросы по тегам