Отложенная отправка писем
Письмо о заказе можно отправлять немного позже, когда уже пришла информация о оплате или когда менеджер проверил заказ.
Как сделать?
Агенты должны выполняться на крон (желательно раз в 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 минут - отправляем
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.