Отложенная отправка писем

Алексей Будагов,

Письмо о заказе можно отправлять немного позже, когда уже пришла информация о оплате или когда менеджер проверил заказ.

Как сделать?

Агенты должны выполняться на крон (желательно раз в 5 минут)

*/5 * * * * /usr/bin/php -f /home/bitrix/www/local/php_interface/cron_events.php

Добавляем обработчик события отправления нового письма, если с момента заказа не прошло 10 минут, то останавливаем отправку и добавляем новый агент для обновления статуса отправки с "неудачная отправка" на "необходимо отправить".

AddEventHandler("main", "OnBeforeEventSend", array("FTeaEvents", "sendOrderEmail"));

class FTeaEvents
{
	/**
	* Отложенная отправка письма о заказе
	*/
	function sendOrderEmail (&$arFields, $arTemplate)
	{
		if ($arTemplate['EVENT_NAME'] == "SALE_NEW_ORDER" && $arFields['ORDER_REAL_ID'] > 0) {
			if (strtotime($arFields['ORDER_DATE'])+10*60 > time()) {
				CAgent::AddAgent("FTeaEvents::updateOrderEmail();");
				return false;
			}
		}
	}

	public static function updateOrderEmail ()
	{
		global $DB, $CACHE_MANAGER;
		$DB->Query("UPDATE b_event SET SUCCESS_EXEC = 'N' WHERE SUCCESS_EXEC = 'F';", true);
		$DB->Query("UPDATE b_event SET SUCCESS_EXEC = 'N' WHERE SUCCESS_EXEC = '0';", true);
		$CACHE_MANAGER->Clean("events");
	}

}

Таким образом получаем: при попытке отправить, если условие по времени не выполняется, письмо отмечается как "неудачно отправленное" и система забывает про него. При следующем "заходе" cron`а выполняется функция updateOrderEmail() которая меняет статус на "необходимо отправить" и система пытается повторно отправить письмо. А т.к. cron выполняется раз в 5 минут, то попыток будет не много и письмо отправится только через 10-15 минут.

Вместо проверки по времени можно использовать проверку по свойству заказа, например "Заказ проверен". Можно комбинировать условия, если заказ не проверен и прошло больше 20 минут - отправляем

Опубликовано 24 Мая 2017 | Обновлено 19 Сентября 2017
делаюИМ, разработчику, костыли

Возврат к списку

Комментарии
Алексей Будагов
Алексей Будагов
18 Июн 2018
В целом, история себя не оправдала. Появилось слишком много глюков, т.к. система к такому "хардкору" не готова) Иного варианта пока нет.