Порядок работы Почтовой Наны.

Последовательность событий при рассылке писем.

Имея верно установленный скрипт на хосте, не выдающий никаких ошибок, и зная, как правильно конфигурировать задание Крону, перед созданием реальных служб Вам необходимо чётко себе представлять, как именно будет происходить рассылка. То есть что случается при обращении крона в URL рассыльщика.

1) Включен ли скрипт?

При запуске Кроном URL рассыльщика, тот в первую очередь проверяет, включен ли скрипт.
Индикатором состояния служит самая верхняя кнопка а админке.
Она имеет два состояния, переход между которыми осуществляется нажатием этой же кнопки:

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

Subject: nanocms.name cron alarm: script is off + dispatch is not completed correctly

Не могу приступить к рассылке писем.
Скрипт стоит в режиме отладки.
Зайдите в админку и переключите скрипт в рабочий режим.

Невозможно корректно завершить работу рассыльщика.

2) Сформированы ли рассылки новостей?

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

Если такие рассылки обнаружены (одна или несколько), то происходит проверка, наступило ли время выхода хоть одной из них. Ибо время выхода рассылки может быть задано произвольно, и до наступления оного рассылка тихонько сидит в засаде, и ждёт своего звёздного часа.

Если выясняется, что этот час уже настал, рассыльщик проверяет, присутствует ли на сервере файл письма, подлежащего рассылке, а также файл со списком подписчиков, сформированный из одной или нескольких служб. И если вдруг окажется, что слать нечего или некому (какой-то из нужных файлов потерян по всё равно какой причине), это задание на рассылку уничтожается как неадекватное.

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

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

Как только список адресатов исчерпается, рассыльщик самостоятельно удалит с сервера файл письма, список получателей, задание на рассылку. Так что пожирания дискового пространства сервера ненужными файликами не случится.

Кроме того, на админский email будет отослано письмо с рапортом о завершившейся новостийной рассылке, причём на русском языке. Его смысл, суть и происхождения должны быть понятны без всяких объяснений.

Subject: nanocms.name: рассылка завершена.

16.12.2018 18:23:26 - время создания задания на рассылку.
16.12.2018 19:00:00 - дата инициации рассылки.
17.12.2018 03:22:01 - задание полностью выполнено.

Разослано писем: 2000
Шаблон ./data/postman/letters/postman.demo.1544959406.sender.php удалён с сервера.
Дубликат баз данных ./data/postman/db/postman.demo.1544959406.news.dispatch.db стёрт.

3) Включена ли хоть одно служба серийных рассылок?

Если работа с рассылками новостей никак не зависит от того, включены ли службы или выключены, то для работы с серийными рассылками необходимо, чтобы соответствующая служба была включена:

Активность служб.

    Как это работает:

    Для изменения состояния службы (с выключено на включено или наоборот) нужно:

  1. Кликнуть в её чекбокс один раз.
  2. Нажать кнопку внесения изменений ниже таблички.
включено dispatch Тестовая рассылка

    Будьте бдительны:

    Пожалуйста, помните, что тут Вы устанавливаете лишь состояние служб.
    То есть включаете отдельные службы или выключаете их.
    При этом сам скрипт независимо от состояния служб может находиться:

    1. В рабочем режиме: работают только включенные службы.
    2. В режиме сна: не работают никакие службы, ни включенные, ни выключенные.

    Также понимайте, что, отключая все службы, и переводя скрипт в рабочий режим, Вы его сильно озадачиваете. О чём он непременно будет ругаться на админский e-mail.

Если вдруг оказалось, что ни одной включенной серийной службы не сыскалось, рассыльщик побеспокоит админа письмом соответствующего содержания:

Subject: nanocms.name cron alarm: all dispatchs is off

Все серийные службы находятся в выключенном состоянии.

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

Если Вы выключаете серийную службу, то она тут же изымается из очереди.
И больше не обрабатывается рассыльщиком.

Только что включенная служба автоматически ставится в начало очереди, если она была отключена длительное время, либо включается впервые. И не меняет своего положения в очереди, если Вы отключили службу, и тут же включили её обратно.

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

4) Число отосланных писем серийной службы.

Сколько писем пошлёт рассыльщик для выбранной им службы серийных рассылок?
Не более, чем указано в настройке "Серийные службы, слать писем за раз".
Однако есть и нюансы.

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

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

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

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

При последующем запуске рассыльщика Кроном факт аварийного завершения его работы станет очевиден, и Почтовая Нана известит Администатора об этом письмом:

Subject: nanocms.name cron alarm: script is down by hoster + dispatch is not completed correctly

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

Невозможно корректно завершить работу рассыльщика.

В случае, если Вы регулярно получаете такие рапорты, то имеет место быть:

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

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

5) Напоминание о подтверждении подписки.

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

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

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

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

Естественно, та же настройка может повелеть хранить подписчиков вечно, и в этом случае они из базы, конечно же, никуда не исчезают.

6) Глупости при формировании заданий Крону.

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

Однако может встретиться ситуация, когда Вы зачем-то запускаете Кроном несколько процессов рассыльщика одновременно. Что является свидетельством полного непонимания излагаемого тут алгоритма. И, видимо, имеет целью "ускорить" рассылку.

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

Такой вариант потенциально катастрофичен, так как может привести к краху базы и потере всех подписчиков. И, если Вы получаете от рассыльщика Почтовой Наны письма вида:

Subject: nanocms.name cron alarm: not can launch the sender

Невозможно инициировать рассылку.
Вероятно, слетели права доступа.

Subject: nanocms.name cron alarm: not can terminate sender

Никак не получается корректно завершить работу рассыльщика.
Рассыльщик остановлен.

то следует срочно проверить перечень заданий Крону.