Исправляем промашку Битрикс с пустым полем "To:" в емейлах

Где-то в ноябре 2019 Битрикс выпустил очередное обновление и с сайта перестали приходить сообщения о новых заказах, случившихся оплатах и прочие шаблонные сообщения.
Копание в коде показало, что в метод send() класса Mail (файл /bitrix/modules/main/lib/mail/mail.php) был добавлен метод для проверки валидности данных перед отправкой емейла. Полезное дело, но при пустом поле "То:" данные считались не валидными и емейл не оправлялся. Невзирая на то, есть что-либо в полях "СС:" и/или "BCC:" (копия и скрытая копия).
Т.е. совершенно нормальный с точки зрения любого почтовика емейл с пустым "То:" и заполненным "СС:" и/или "BCC:" оставался не отправленным. Его не получал клиент, которому не особо и надо, раз не ввел емейл, но его не получали и те, кто был прописан в шаблоне в СС и BCC.
Техподдержка приняла проблему, на чем все и закончилось.
В принципе, можно решить проблему и штатным путем - сдублировать все почтовые шаблоны с заполненным "СС/BСС" по два раза - один для клиента, второй для копии. Но как-то некрасивенько...

Решение:
Вешаемся на событие OnBeforeMailSend и если "To" пусто, то "передвигаем" адрес из "CC" или "BCC" в "To".

В файле /local/php_interface/init.php добавляем код:



\Bitrix\Main\EventManager::getInstance()->addEventHandler('main', 'OnBeforeMailSend', 'onBeforeMailSendHandler');
function onBeforeMailSendHandler(\Bitrix\Main\Event $event)
    {
    $arEventParams = $event->getParameters();
    if (empty($arEventParams[0]['TO']))
        {
        if (!empty($arEventParams[0]['HEADER']['CC']))
            {
            $arCC = explode(',', $arEventParams[0]['HEADER']['CC']);
            $arEventParams[0]['TO'] = array_shift($arCC);
            $arEventParams[0]['HEADER']['CC'] = implode(',', $arCC);
            }
        elseif (!empty($arEventParams[0]['HEADER']['BCC']))
            {
            $arBCC = explode(',', $arEventParams[0]['HEADER']['BCC']);
            $arEventParams[0]['TO'] = array_shift($arBCC);
            $arEventParams[0]['HEADER']['BCC'] = implode(',', $arBCC);
            }
        }
    return new Bitrix\Main\EventResult($event->getEventType(), $arEventParams[0]);
    }