Евгений Никитин Евгений Никитин

Русский English

Когда вам следует отправлять письма через очередь в Drupal

Для начала давайте разберемся, как сайт отправляет письма.

Есть два основных способа отправки писем:

  1. через PHP функцию mail(). Эта функция отправит ваше письмо в sendmail на сервере, откуда оно уйдет к получателю.
  2. используя удаленный SMTP сервер.

Обычно, после того, как пользователь нажал на кнопку отправки формы, PHP скрипт соединяется с почтовым сервером. Если соединение установлено успешно, то письмо передается на сервер и, таким образом, оно отправляется. В случае, если почтовый сервер недоступен (а причины могут быть разные: проблема с серверами, с соединением), то письмо отправлено не будет. Все это время, пока PHP скрипт пытается соединится с почтовым сервером, пользователь сайта будет видеть загружающееся окно, и ждать, пока соединение не отвалится по таймауту. Если соединится так и не получится, то в итоге он увидит сообщение об ошибке и ему придется отправлять форму еще раз. Иначе сообщение пропадет.

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

В Drupal в этом вам поможет модуль Queue Mail. Письма, созданные на сайте, добавляются в очередь. Они будут отправлены во время следующего запуска крона.

В Queue Mail есть возможность настроить:

  • категории писем, которые отправлять через очередь;
  • количество раз сколько нужно пытаться отправить письмо прежде, чем оно будет удалено из очереди;
  • время между отправкой писем. Эта возможность поможет настроить частоту отправки писем, что бывает полезно если вы отправляете много писем и хотите, чтобы ваш сервер не посчитали спамерским.

Поэтому, использовать очередь при отправке почты стоит если:

  • Нужно повысить скорость работы сайта - пользователям не придется ждать пока сообщение отправится во время отправки формы. Например разница между отправкой письма сразу через mail(), и вариантом с отложенной отправкой достигает 2 раз (по моим замерам если письма уходят сразу среднее время 11.76 миллисекунды, если мы кладем письма в очередь - 5.57 миллисекунды). Если отправляем письма через удаленный SMTP сервер, то там отправка происходит намного дольше
  • Необходимо улучшится “user experience” сайта - пользователям не придется отправлять форму еще раз если есть проблемы с отправкой почты.
  • Вы хотите сделать сайт более надежным - письма будут отправлены, как только восстановится возможность отправлять почту.
  • Вам нужно больше возможностей по конфигурированию отправки почты.