Как задержать доставку почты? - PullRequest
4 голосов
/ 29 марта 2010

В настоящее время я изучаю функции электронной почты Drupal, такие как drupal_mail и hook_mail, и hook_mail_alter, и передо мной возникла проблема, когда мне нужно будет иметь возможность ставить в очередь электронные письма для отложенной доставки. Например, уведомление о регистрации события, которое нужно ждать в течение часа после того, как событие было зарегистрировано пользователем. И это электронное письмо содержит данные, специфичные для пользователя, поэтому оно не может быть просто шаблонным электронным письмом ...

Я использую модуль MailQ , главным образом для его возможностей ведения журнала, но мне интересно, можно ли его (или что-то еще) изменить для добавления настраиваемой функции задержки?

Есть идеи?

======================

Некоторые дополнительные мысли:

В D6 есть 2 модуля, которые полезны для организации очередей электронной почты, MailQ и очереди заданий (в списке Никита ниже). Они оба имеют функциональность почтовой очереди, которая может быть очень полезна, и оба имеют разные подходы, сильные и слабые стороны - из беглого расследования. Например: MailQ имеет отличную функцию регистрации, с очень полезным интерфейсом администратора для работы с категориями почты, такими как постановка в очередь, отправка, отправка, ошибка и т. Д. И вы можете установить, сколько писем отправлять при каждом запуске cron.

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

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

Но написание такой вещи выходит за рамки моих скудных талантов, поэтому мне просто нужно написать небольшой пользовательский модуль, который активируется cron и который будет искать помеченные контакты с датой создания не менее часа в прошлого, и найдите способ записать соответствующую информацию непосредственно в таблицу БД MailQ.

Кажется, что происходит некоторое столкновение, когда моя новая функция запускается cron, а также функция MailQ, запускаемая одним и тем же запуском cron, поэтому я пытаюсь разобраться, как расставить приоритеты cron MailQ поверх моей функции - чтобы моя функция добавляла данные таблицы ПОСЛЕ запуска MailQ.

1 Ответ

0 голосов
/ 02 августа 2013

Это не самое элегантное решение, но я кое-что сделал в D6, прежде чем узнал о транзакционных почтовых службах с hook_mail_alter, где я загрузил параметры электронной почты в таблицу базы данных, установил значение сообщения на ноль, чтобы оно не отправлялось после hook, а затем задание cron, выполняемое каждые 5 минут, проверяет таблицу и отправляет пару сообщений за раз, если таковые имеются, в ожидании. Как только оно отправлено, я переключил статус на отправлено. Вы получите сообщение об ошибке, сообщающее, что электронное письмо не удалось отправить.

Но с помощью этого метода вы можете либо вызвать что-то вроде Mailgun / Mandrill и отправить запланированное электронное письмо внутри ловушки, либо поместить его в таблицу базы данных с полем отметки времени, например strtotime ('+ 2 недели'), а затем получить Задача cron проверяет таблицу каждые x минут и отправляет, когда соблюдены условия отметки времени. hook_mail_alter дает вам поле для идентификации сообщения, так что вы можете иметь переключатель, который будет перехватывать только определенные электронные письма, если вы хотите.

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

...