Jump to main content Jump to doc navigation

Последний урок будет самым коротким. Неожиданно выяснилось, что мы уже всё сделали, и осталось только добавить скрипт отправки писем по расписанию.

На всякий случай напоминаю алгоритм работы компонента:

  • Создаём рассылку и указываем её свойства. Обязательно указать шаблон или сниппет.
  • Добавляем пользователей (или они добавляются сами через сайт)
  • На странице очереди писем добавляем новые, выбирая рассылку. В зависимости от того, что в ней указано, текст письма генерирует сниппет или шаблон.
  • Отправляем письма. Можно вручную из админки или скриптом по расписанию.

Всё кроме скрипта мы уже сделали.

Отправка писем по расписанию

Учитывая, что всё нужное уже прописано в классе sxQueue, остаётся только подключить модель компонента, выбрать записи и вызвать метод send().

<?php
// This is for calling from the development directory.
if (file_exists(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/config.core.php')) {
    require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/config.core.php';
}
else {
    require_once dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . '/config.core.php';
}

// Get the config and call MODX
require_once MODX_CORE_PATH . 'config/' . MODX_CONFIG_KEY . '.inc.php';
require_once MODX_CONNECTORS_PATH . 'index.php';

// Add a model
$modx->addPackage('sendex', MODX_CORE_PATH . 'components/sendex/model/');

// Choose 100 letters
$q = $modx->newQuery('sxQueue');
$q->limit($modx->getOption('sendex_queue_limit', null, 100, true));

// We send
$queue = $modx->getCollection('sxQueue');
/** @var sxQueue $email */
foreach ($queue as $email) {
    $email->send();
}

После отправки письмо удаляется, поэтому скрипт можно запускать хоть каждые 2 минуты. Нагрузки он не создаст.

Я добавил этот файл в /core/components/sendex/cron/send.php, чтобы его нельзя было вызвать из браузера. Зачем давать возможность непонятно кому отправлять ваши письма?

Добавить его в cron можно вручную (смотрите документацию своего хостинга). Обычно нужно зайти на сервер по SSH, набрать crontab -e и в редакторе добавить:

*/2  *  * * *   php /var/www/site/www/core/components/sendex/cron/send.php

Сервер будет дергать файл каждые 2 минуты, и все рассылки улетят сразу. На лабораторном тарифе MODXCloud я не смог зайти в SSH. Вероятно, доступ отключён.

Вот коммит с файлом send.php.

В принципе на этом последнее занятие закончено, но добавлю ещё немного про постановку писем в очередь через API.

Добавление писем через API

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

Ведь ситуаций и условий может быть огромное количество. Рассылка новых тикетов из раздела вопросов или новостей с шаблоном 5 из родителя 13. Всё это в интерфейсе не нарисуешь.

Поэтому автоматическое добавление писем в список мы оставляем на совести разработчика сайта. Мы уже всё для него подготовили:

  • Создать сниппет или шаблон, который сформирует тело письма
  • Создать рассылку и указать сниппет или шаблон
  • Получить объект sxNewsletter и вызвать метод addQueues

То есть всё очень просто.

На всякий случай вот код:

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

/** @var sxNewsletter $newsletter */
if ($newsletter = $modx->getObject('sxNewsletter', array('name' => 'Newsletter'))) {
    $newsletter->addQueues();
}

Этот код можно вызывать при публикации новых страниц, по расписанию или ещё как-то. В своём сниппете или шаблоне вы можете выбирать любые документы и любые условия. В общем, можно наполнять рассылку любой информацией.

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

Заключение

На этом наш курс заканчивается.

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

За всеми изменениями можно следить на GitHub.

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • JT Skaggs
  • deJaya
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$194 per month—let's make that $500!

Learn more