Sendex

Компонент для работы с рассылками.
Бесплатно
Загрузите дополнение из админки вашего сайта.
Как загрузить?
Автор дополнения
MODX.pro
Пакетов
15
Закачек
138 271
Автор дополнения
Пакетов
15
Закачек
138 271
Версия 1.1.4-pl
Дата выпуска 26.12.2022
Загрузки 3 694
Просмотры 23 316
Внимание, этот компонент несовместим с MODX 3.
Компонент хранит три сущности в отдельных таблицах:

  • sxNewsletter — рассылка: тема, отправитель, шаблон письма и остальные параметры.
  • sxSubscriber — подписчик: email и id рассылки обязательны; id пользователя MODX сохраняется, если он был авторизован при подписке.
  • sxQueue — письмо в очереди на отправку.

В админке можно пройти весь цикл вручную: создать рассылку, добавить подписчиков, сгенерировать очередь и отправить письма. Часть шагов автоматизируется через сниппет, cron и события плагина.

Создаём рассылку:



Укажите шаблон письма (один идёт в комплекте). В шаблоне можно вызывать сниппеты.

Подписываем пользователя:



Вручную из менеджера можно подписать только пользователя сайта. Гости подписываются через сниппет на фронте. Можно добавить всю группу пользователей MODX (только активные и не заблокированные). Гостевые записи с тем же email сливаются с аккаунтом при активации или сохранении пользователя.

Генерируем письма:



Рассылка обходит подписчиков и кладёт письма в очередь. Новые строки хранят пустое тело: HTML собирается из шаблона рассылки в момент отправки. Старые строки с сохранённым HTML отправляются как есть.

Отправляем:



В сетке рассылок есть действие «Отправить подписчикам»: одним кликом вызываются addQueues и отправка очереди. Отправку можно запускать по одному письму, пакетом из админки или по cron.

Сниппет Sendex

Вызов на странице:

[[!Sendex? &id=`1`]]

Сниппет показывает форму подписки и отписки. Авторизованный пользователь нажимает кнопку. Гость подтверждает email по ссылке из письма, если включено подтверждение (&confirmEmail=1 или системная настройка sendex_confirm_email). С &confirmEmail=0 гость подписывается сразу.

По умолчанию формы работают через AJAX: assets/components/sendex/js/web/sendex.js отдаёт JSON {success, message, html} и обновляет виджет без перезагрузки страницы. Несколько виджетов на одной странице разводите через &widgetKey=.

Уже подписанному пользователю показывается кнопка отписки. Гость отписывается по ссылке из письма (code + newsletter_id в URL).

Сниппет — готовый пример. Логику подписки можно перенести в свой код через методы sxNewsletter.

Основные методы

Объект sxNewsletter

  • addQueues — добавляет письма в очередь для всех подписчиков рассылки
  • sendToSubscribersaddQueues + отправка очереди этой рассылки (то же, что кнопка в админке)
  • subscribe — подписка по id пользователя или email
  • subscribeGuest — гостевая подписка с подтверждением или без
  • subscribeGroup — массовая подписка группы пользователей
  • checkEmail — отправка проверочной ссылки гостю
  • confirmEmail — подтверждение email по hash из ссылки
  • unSubscribe — отписка по полю code из sxSubscriber
  • isSubscribed — проверка по user_id или email; возвращает id sxSubscriber или 0

Генерация очереди через API:

$modx->addPackage('sendex', MODX_CORE_PATH . 'components/sendex/model/');
require_once MODX_CORE_PATH . 'components/sendex/bootstrap.php';
sendexBootstrap($modx);

/** @var sxNewsletter $newsletter */
if ($newsletter = $modx->getObject('sxNewsletter', 1)) {
	$response = $newsletter->addQueues();
	if ($response !== true) {
		echo $response; die;
	}
}


Метод вернёт true или текст ошибки (в том числе если ни одной строки очереди не создано).

Объект sxSubscriber

Запись в таблице и есть подписка. При отписке строка удаляется. Поле code — уникальный код для ссылки отписки. Уникальность в рамках рассылки: пара (newsletter_id, email).

Объект sxQueue

  • send — отправка одного письма через sxQueueSender::sendOne

Перед отправкой строка «захватывается» (claim): параллельные cron-воркеры не отправят одно письмо дважды. При ошибке почты строка возвращается в очередь для повторной попытки. После успешной отправки строка удаляется.

Пакетная отправка (так работает cron):

$modx->addPackage('sendex', MODX_CORE_PATH . 'components/sendex/model/');
require_once MODX_CORE_PATH . 'components/sendex/bootstrap.php';
sendexBootstrap($modx);

sxQueueSender::flush($modx, array(
	'limit'     => $modx->getOption('sendex_queue_limit', null, 100, true),
	'logErrors' => true,
));


Cron-скрипт: /core/components/sendex/cron/send.php. Запуск из корня сайта:

php core/components/sendex/cron/send.php


События плагина

Подписка и отписка: sxOnBeforeSubscribe, sxOnSubscribe, sxOnBeforeUnsubscribe, sxOnUnsubscribe.
Очередь: sxOnBeforeAddQueues, sxOnAddQueues, sxOnBeforeQueueSend, sxOnQueueSend, sxOnQueueSendFailed, sxOnQueueFlushComplete.
События «Before» можно отменить через $modx->event->output('сообщение').

Обновление с 1.x

Установка и апгрейд прогоняют Phinx-миграции (core/components/sendex/migrations/). Таблицы переводятся на InnoDB и utf8mb4. В очереди поле subscriber_id ссылается на sxSubscriber.id, а не на modUser.id. После апгрейда существующие строки пересчитываются миграцией.

Что сделать на сайте

  1. Оформить шаблон письма, создать рассылку и указать шаблон в настройках.
  2. Подписать пользователей вручную, группой, через сниппет или API.
  3. По событию или по расписанию вызвать addQueues или sendToSubscribers.
  4. Отправить очередь из админки или через cron.

Документация: docs.modx.pro/komponentyi/sendex. Исходники и issue tracker: GitHub.

1.1.4-pl

  • [#37] Added functionality to export email addresses
  • Fix css bug for user group combo

1.1.3-pl

  • [#32, #33] Added parameter &msgClass for placeholder [[+class]]
  • [#31] Added messages for frontend
  • [#30] Change phptype text to string

1.1.2-pl

  • [#23] Added button for removing all letters from queue

1.1.1-pl

  • Fixed modUserProfile getting on creating subscriber

1.1.0-pl

  • Improved installation script for MODX 2.4.

1.1.0-rc

  • UI improvements.
  • Ability to add all users of the group to the newsletter.
  • Added multiselect in all grids.
  • Added subscribers count in newsletters grid.
  • Added buttons to grids for touch devices.
  • Added Font Awesome icons for MODX < 2.3.
  • [#21] Compatibility with MODX 2.3.
  • [#20] Added "send all" button to queues grid.

1.0.0-pl

  • Added multiremoving and multisending
  • [#11]Added $_GET's subscribed, unsubscribed, confirmed
  • [#1] Fixed urls of images

1.0.0-rc2

  • Various small fixes.

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

  • Fixed caching of template.

1.0.0-beta

  • Initial release.

Последние обсуждения в сообществе MODX.pro