[EmailQueue] - Очередь писем


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


В админке сделано относительно удобное управление очередью.
Для отправки писем из очереди поставите в cron файл core/components/emailqueue/cron/send.php с нужной периодичностью.
Настройки:
emailqueue_limit — сколько писем отправлять за раз.
emailqueue_store_days — сколько дней письма хранить в очереди.
Для помещения писемь в очередь используйте примерно такой код:
if (!$EmailQueue = $modx->getService('emailqueue', 'EmailQueue', $modx->getOption('emailqueue_core_path', null,
	$modx->getOption('core_path') . 'components/emailqueue/') . 'model/emailqueue/', array())) {
	return;
}
$data1 = array(
	'sender_package'=>'UserTest', //дополнение отправитель письма
	'to'=>$invite->user_email, //емаил
	'subject'=>$modx->lexicon('usertest_invite_subject',array('test_name' => $test->name)), // тема письма
	'body'=>$modx->getChunk('tpl.UserTest.InviteEmail',array('test_name' => $test->name,'link'=>$invite->url)), // тело письма
	'date'=>date("Y-m-d H:i:s"), // дата в очереди. Нужно чтоб письма удалялись по истечении срока хранения.
);
if($modx->getOption('usertest_invite_email_from', null, false))
	$data1['from'] = $modx->getOption('usertest_invite_email_from'); //необязательно
if($modx->getOption('usertest_invite_email_from_name', null, false))
	$data1['from_name'] = $modx->getOption('usertest_invite_email_from_name'); //необязательно
$queue_email->fromArray($data1);
if($queue_email->save())
	$modx->log(modX::LOG_LEVEL_INFO,"Приглашение на $email добавлено в очередь писем!");
Дополнительно можно задать:
$queue_email->reply_to // обратный адрес 
$queue_email->attachments //полные имена приклепляемых файлов через запятую
Компонент доступен в Modstore https://modstore.pro/packages/alerts-mailing/emailqueue.

Думаю небольшие компоненты для разработчиков лучше делать бесплатными. Так что компонетнт по крайней мере пока бесплатный :). Но от доната не откажусь. Кто захочет поблагодарить Номер кошелька Яндекс 410011280920822

Гитхаб https://github.com/touol/EmailQueue
10 июня 2018, 08:44    Александр   
8    268 +12


Комментарии ()

  1. Дмитрий 10 июня 2018, 16:00 # +1
    Скоро придется отправить 4000 писем пользователям сайта, который переношу с WP, и как раз об этом думал, как же решить это. Большое спасибо за компонентище!
    1. Александр 10 июня 2018, 16:22 # +1
      Надеюсь скоро опубликуют. Рад что вам пригодиться. Забыл только очистку всей очереди добавить :(, но попозже добавлю. Если вам быстрее компонент надо будет могу выслать по почте.
      1. Дмитрий 10 июня 2018, 16:43 # 0
        да не, не раньше, чем через 2 недели нужно будет)
    2. tvset 11 июня 2018, 19:16 # 0
      Очень здорово! очень нужно, спасибо автор!
      Тоже со временем воспользуюсь, возьму на заметку.
      1. Василий Столейков 13 июня 2018, 16:05 # 0
        Спасибо большое!
        Использовал для этих целей очереди Sendex, добавлял туда письма и дёргал очередь через крон. Ваше дополнение удобнее и видна статистика отправленных писем.
        1. Александр 13 июня 2018, 17:49 # +2
          Еще дополнение на модерации и его еще в глаза никто не видел, а уже 3 спасибо :). Всем пожалуйста. Сейчас думаю на всякий случай в гитхаб выложу. Вдруг кому-то уже надо.
        2. Александр 13 июня 2018, 18:03 # +2
          Выложил на гитхаб
          1. Иван Бондаренко 18 июня 2018, 14:40 # 0
            Александр, обнови пост. Компонент доступен в Модстор — modstore.pro/packages/alerts-mailing/emailqueue
            1. Александр 18 июня 2018, 16:21 # 0
              Спасибо. Как-то из головы вылетело.
            2. Василий Столейков 18 июня 2018, 18:34 # 0
              Какая-то странная дата отправки на демо-сайте: -1-11-30 00:00:00
              1. Александр 18 июня 2018, 18:53 # +1
                Это такая дата по умолчанию была. Так 0000-00-00 00:00:00 mysql записывает. Модераторы модсторе тоже сказали это поменять. В новой версии по умолчанию дата отправки null и в поле пусто. Сейчас обновил компонент на демо, чтоб вас это не смущало.
                1. Василий Столейков 18 июня 2018, 18:56 # 0
                  Да, спасибо, пустота будет лучше нулей и непонятных дат.
                  Я обычно даты в свои таблицы записываю в unix-формате и никаких проблем с этим. Пример беру с дат в таблице ресурсов, там все они в unix-е.
                  1. Василий Столейков 18 июня 2018, 18:58 # 0
                    Да, и ещё не сразу понял назначение двух одинаковых кнопок с самолётиками в панели с кнопками над таблицей, запутало как-то.
                    1. Александр 18 июня 2018, 19:10 # 0
                      Хм… плохо у меня с дизайном :(. Воображения на картинки не хватает. Если есть идеи какие значки повешать на эти действия, напишите плиз :). Если писать словами, то в 1 слово не обойдешься и ширины экрана в итоге не хватит.
                      1. Василий Столейков 18 июня 2018, 19:15 # 0
                        А что если сделать кнопки выпадающим списком как в других компонентах:

                        Тогда и текстом можно будет нормально написать, и сколько угодно кнопок туда напихать по мере развития компонента.
                        Хотя бы для некоторых кнопок.
                        1. Александр 18 июня 2018, 19:26 # 0
                          Хорошая идея. Только выпадающие списки я такие еще не делал. посмотрю как там в этом компоненте сделано.
                          Развития компонента пока не планируется :). В смысле, а есть куда его развивать? Рассылки все равно лучше делать через специализированные сервисы. Хостеры, если блокируют письма, то ничего не сообщают и не понятно ушло письмо или нет. Этот компонент на случай если сервис еще не имеет смысла подключать.
                          1. Василий Столейков 18 июня 2018, 19:31 # 0
                            а есть куда его развивать?
                            Есть!

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

                            Это можно например реализовать так: отдельное поле template в таблице, в который можно будет указывать id существующего шаблона или чанка. В форме можно это селектом сделать самоподгружающим эти эти элементы, но на первое время и простое поле тоже сойдёт, главное чтобы работало. В самом шаблоне чтобы были доступны переменными (желательно через Fenom если установлен) все поля письма. Ну и если шаблон указан, то отправляется письмо красиво оформленное, если нет, то простой текст.

                            Для многих это довольно важно, т.к. кастомизация, сохранения брендового стиля и т.д.
                            1. Александр 18 июня 2018, 19:50 # 0
                              Ну тут идея компонента не совсем такая :). В очереди хранятся уже готовые письма. А письма в очередь добавляются кодом, в котором как раз письмо красиво и оформляется.
                              'body'=>$modx->getChunk('tpl.UserTest.InviteEmail',array('test_name' => $test->name,'link'=>$invite->url)),
                              Создание и редактирование писем в компоненте это просто на всякий случай. Чтоб протестировать компонент или просто отправку писем. Посмотреть что вообше в очереди лежит.
                              1. Василий Столейков 18 июня 2018, 20:20 # 0
                                Просто дело в том, что при редактировании письма код не очень-то и подредактируешь, будет каша. Тогда уже лучше редактор кода привязать к полю редактирования в админке…
                                Спасибо за объяснение, забыл про getChunk (что компонент больше для разработчиков) и сосредоточился на удобстве формы из админки…
                        2. Василий Столейков 18 июня 2018, 19:25 # 0
                          Например для кнопки «Восстановить письма с ошибками в очереди» больше подойдёт значок icon-refresh.
                          Кнопки Ошибки и Все непонятно что делают, просят больше описания действий. Ну и значков просят, а то высота кнопок прыгает.
                          Две кнопки удалить — тоже можно было бы их в выпадалку запрятать и текст написать.

                          Я просто не сразу заметил, что у кнопок есть подсказка при наведении, да и не всегда она у меня срабатывает, видно потому что навешана на иконку значка, а не на всю кнопку.
                          1. Александр 18 июня 2018, 19:32 # 0
                            Кнопки Ошибки и Все — это не кнопки вообще. Это подписи что следующие кнопки к Ошибкам относяться и к всем письмам. Мда… замученный у меня дизайн получился. Буду выпадающим списком делать, но не пока занят через неделю думаю сделаю.
                            1. Василий Столейков 18 июня 2018, 19:33 # 0
                              Ок, я тебе только идей подкинул для рихтовки, а так молодец — компонент очень классный и очень нужный! Буду его использовать на многих сайтах.
                        3. Александр 18 июня 2018, 19:15 # 0
                          В новой версии еще и 2 значка удаления. 1 удаляет письма с ошибками. Другой очищает всю очередь.
                          1. Василий Столейков 18 июня 2018, 19:17 # 0
                            Не, это будет путаница однозначно!
                            Лучше в выпадающий список запрятать некоторые кнопки.
                    Вы должны авторизоваться, чтобы оставлять комментарии.