Отправка писем из CRM Битрикс24 через SMTP указанной в почте пользователя

Перенесли коробочный Битрикс24 на VMBitrix. На VMBitrix настроили отправку почты по умолчанию через внешний SMTP с авторизацией. У сотрудников в CRM перестала работать отправка почты (писало ошибку: «Операция создания письма отменена»). Причина в том, что отправляя через SMTP яндекса нельзя во From (заголовок отправителя) вписывать e-mail отличный от логина. Сделали свой обработчик отправки.

Обработчик отправки проверяет e-mail отправителя и если его находит в таблице доступов к SMTP, то отправляет через него при помощи библиотеки PHPMailer. В остальных случаях почта отправителя подменяется на основной e-mail указанный в настройках главного модуля и VMBitrix.

Пример кода добавленного в php_interface/init.php:

<?php

// ...

function custom_mail($to, $subject, $message, $additional_headers='', $additional_parameters='')
{
    $toAr = [];
    // поиск e-mail получателей
    if (!preg_match('/^[a-z0-9]+([\.\-][a-z0-9]+)*@[a-z0-9]+([\.\-][a-z0-9]+)*[\.\-][a-z0-9]+$/i', $to)) {
        $arTo = [];
        if (preg_match('/[a-z0-9]+([\.\-][a-z0-9]+)*@[a-z0-9]+([\.\-][a-z0-9]+)*[\.\-][a-z0-9]+/i', $to)) {
            preg_match_all('/[a-z0-9]+([\.\-][a-z0-9]+)*@[a-z0-9]+([\.\-][a-z0-9]+)*[\.\-][a-z0-9]+/i', $to, $arTo);
            $toAr = $arTo[0];
        } else $toAr[] = $to;
    } else $toAr[] = $to;

    $matches = [];
    preg_match(
        "/[a-z0-9]+([\.\-][a-z0-9]+)*@[a-z0-9]+([\.\-][a-z0-9]+)*[\.\-][a-z0-9]+/i",
        $additional_headers,
        $matches
    );
    list($login) = $matches;
    $strEmail = COption::GetOptionString('main','email_from');
    $contentType = null;

    if (preg_match('/Content-Type:/', $additional_headers)) {
        $ex = preg_split("/((\r?\n)|(\r\n?))/", $additional_headers);
        $additional_headers = "";
        foreach ($ex as $v) {
            if (preg_match('/(Content-Type:)/', $v)) {
                $additional_headers .= trim($v) . "\n";
                $contentType = trim(explode(':', $v)[1]);
            } else if (preg_match('/(Content-Transfer-Encoding:)/', $v))
                $additional_headers .= trim($v) . "\n";
        }
    } else $additional_headers = '';

    if ($login == $strEmail) {
        if ($additional_parameters != "")
            return @mail(implode(',', $toAr), $subject, $message, $additional_headers, $additional_parameters);
        return @mail(implode(',', $toAr), $subject, $message, $additional_headers);
    } else {
        require_once __DIR__ . '/lib/PHPMailer/src/PHPMailer.php';
        require_once __DIR__ . '/lib/PHPMailer/src/SMTP.php';
        require_once __DIR__ . '/lib/PHPMailer/src/Exception.php';

        Bitrix\Main\Loader::includeModule('mail');
        $acc = CMailbox::GetList(
            ['TIMESTAMP_X' => 'DESC'],
            ['LID' => SITE_ID, 'ACTIVE' => 'Y', 'LOGIN' => $login]
        )->Fetch();

        if (isset($acc) && is_array($acc) && count($acc) > 0) {
            $mail = new PHPMailer\PHPMailer\PHPMailer();
            $mail->isSMTP();
            $mail->SMTPAuth = true;
            $mail->SMTPDebug = 0;

            $mail->Host = 'smtp.yandex.ru';
            $mail->Port = 587;
            $mail->Username = $acc["LOGIN"];
            $mail->Password = $acc["PASSWORD"];
            $mail->SMTPSecure = $mail::ENCRYPTION_STARTTLS;

            if (strlen($acc["USERNAME"]) > 3) $mail->setFrom($acc["LOGIN"], $acc["USERNAME"]);
            else $mail->setFrom($acc["LOGIN"]);

            foreach ($toAr as $to) $mail->addAddress($to);

            if (isset($contentType)) $mail->ContentType = $contentType;

            $mail->Subject = $subject;
            $mail->Body = $message;

            if(!$mail->send()) return false;
            else return true;
        } else {
            if ($additional_parameters != "")
                return @mail(implode(',', $toAr), $subject, $message, $additional_headers, $additional_parameters);
            return @mail(implode(',', $toAr), $subject, $message, $additional_headers);
        }
    }
}

// ...