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