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

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

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

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

// ...

function custom_mail($to, $subject, $message, $additional_headers='', $additional_parameters='')
{
    $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');

    if ($login == $strEmail) {
        if ($additional_parameters != "")
            return @mail($to, $subject, $message, $additional_headers, $additional_parameters);
        return @mail($to, $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"]);

            $to = str_replace(' ', '', $to);
            $address = explode(',', $to);
            foreach ($address as $addr)
                $mail->addAddress($addr);

            $arRows = preg_split("/((\r?\n)|(\r\n?))/", $additional_headers);
            foreach ($arRows as $header) {
                if (preg_match('/Content-Type:/i', trim($header))) {
                    $mail->ContentType = trim(explode(':', $header)[1]);
                } else if (!preg_match('/From:/i', trim($header))) {
                    $mail->addCustomHeader($header);
                }
            }

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

            if(!$mail->send()) {
                return false;
            } else {
                return true;
            }
        } else {
            $additional_headers = str_replace($login, $strEmail, $additional_headers);
            if ($additional_parameters != "")
                return @mail($to, $subject, $message, $additional_headers, $additional_parameters);
            return @mail($to, $subject, $message, $additional_headers);
        }
    }
}

// ...