Добавить возможность запрета отправки письма по OnBeforeEventSend

Рейтинг: 9.4245  
Новая
Предложил Антон Пилецкий 03.03.2013 13:58:47

Добавить возможность запрета отправки письма по OnBeforeEventSend

В файле /bitrix/modules/main/classes/general/event.php:227 заменить это
$events = GetModuleEvents("main", "OnBeforeEventSend");
while ($event = $events->Fetch())
   ExecuteModuleEventEx($event, array(&$arFields, &$db_mail_result_array)); 
вот на это
$events = GetModuleEvents("main", "OnBeforeEventSend");
while ($event = $events->Fetch())
   if(ExecuteModuleEventEx($event, array(&$arFields, &$db_mail_result_array)) === false)
      return "F"; // Fail 
Такое решение даст возможность через обработчик OnBeforeEventSend запрещать отправку  писем определенных почтовых событий при определенных условиях, заданных разработчиком.

Рейтинг: 0.1784  
Долганин Антон 03.03.2013 15:27:51
Чем вас OnBeforeEventAdd не устроил?
Рейтинг: 0.5434  
Антон Пилецкий 02.07.2013 19:54:44
Чем вас OnBeforeEventAdd не устроил?
А не устраивает оно меня тем, что при отправке уведомления через CEvent::SendImmediate() события "OnBeforeEventAdd" нет.
В отличие от него событие OnBeforeEventSend работает всегда - и по CEvent::Send() и по CEvent::SendImmediate().
Рейтинг: 0  
Доценко Артём 04.07.2013 23:54:01
как временное решение можно сбросить массив $arFields = array(); письмо не будет отправленно в таком случае (проверено на версии 8.5.1).
Но хорошо бы если б это можно было бы сделать просто с помощью return FALSE;
Рейтинг: 0  
Гусев Александр 22.07.2013 22:46:30
тут пригождалось тоже http://dev.1c-bitrix.ru/community/webdev/user/8420/blog/otpravka-pochtovykh-soobshcheniy-v-opredelennuyu-datu-i-vremya/

тогда был создан тикет №267185 в техподдержке
Рейтинг: 0.0834  
Антон Пилецкий 15.11.2013 03:39:39
Учитывая этот кейс  нужно сделать не просто обработку возвращаемых значений true/false, а устанавливать возвращаемый функцией CAllEvent::HandleEvent($arEvent)  статус отмены отправки сообщения.
Например, если обработчиком возвращается один символ из набора (Y,F,P,0,N), то завершаем выполнение функции HandleEvent и возвращаем установленный статус. Иначе, при других возвращаемых значениях, просто продолжаем выполнение функции в штатном порядке.
Рейтинг: 0  
Саянц Антон 01.04.2015 14:45:34
Когда уже решите эту проблему?
Мне тоже надо отсылать письма в определенное время.
Рейтинг: 2  
Волков Сергей 08.03.2019 08:50:22
Понимаю что время много прошло, но для истории, код сейчас выглядит так:
foreach (GetModuleEvents("main", "OnBeforeEventSend", true) as $event)
{
    if(ExecuteModuleEventEx($event, array(&$arFields, &$eventMessage, $context)) === false)
    {
        continue 2;
    }
}
Т.е. при return false; данный почтовый шаблон не будет отправлен, в итоге будет проставлен флаг 0 для события если оно одно или все шаблоны заблокируются.

Есть еще интересное событие OnBeforeMailSend, оно следующим шагом идет и там тоже можно отменить отправку.