Отправка писем из 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);
}
}
}
// ...