Была следующая проблема:
Коробка Б24, внутри неё у пользователей настроен доступ к персональным почтовым ящикам через раздел "Почта".
-Письма от портала (Уведомления и Проверка системы) ходят нормально, цепляются настройки из
/home/bitrix/.msmtprc-Письма от имени персональных ящиков пользователей (из CRM или из раздела Почта) не отправляются, т.к. подключаемся к SMTP через настройки из .msmtprc, а отправителем ставим адрес пользователя, соответственно яндекс ругается "not owned by authorized user".
Спасибо всем, отписавшимся выше, и отдельно А.Долганину. Благодаря вам пришёл к следующему решению:
В
init.php прописываем следующий код:
Код |
---|
function custom_mail($to, $subject, $message, $additional_headers='', $additional_parameters=''){
global $DB;
if (preg_match('/^From:.*?(?<email>[^<>@\n ]+@[^<>@\n ]+)/mi', $additional_headers, $matches)) {
$fr om = $matches['email'];
// выбор соответствующих адресу отправителя параметров
$query = 'SEL ECT box.`NAME`, box.`LOGIN`, box.`PASSWORD`, box.`EMAIL` FR OM b_mail_mailbox as box WH ERE box.`EMAIL`="' . $from . '"';
$res = $DB->Query($query);
if ($arMail = $res->Fetch()) {
\Bitrix\Main\Loader::includeModule('mail');
$password = CMailUtil::Decrypt($arMail['PASSWORD']);
$additional_parameters .= ' --auth=login --from="' . $arMail['EMAIL'] . '" --user="' . $arMail['NAME'] . '" --passwordeval="echo ' . $password . '"';
}
}
if ($additional_parameters!='') {
$result = @mail($to, $subject, $message, $additional_headers, $additional_parameters);
} else {
$result = @mail($to, $subject, $message, $additional_headers);
}
return $result;
} |
Здесь мы выцепляем регуляркой значение заголовка From, находим в таблице b_mail_mailbox эту учётку и подставляем её данные в параметры командной строки для msmtp. Костыль работает, но есть некоторые особенности:
-в файле .msmtprc пароль для учётки тоже должен быть задан через passwordeval (не через password), иначе он не подменяется и msmtp пытается авторизоваться под учёткой из командной строки с паролем из файла настроек
-это будет корректно работать только если у всех пользователей и у портала один и тот же smtp-сервер, в моём случае это яндекс. Если у пользователей почты на разных серверах, то метод надо совершенствовать, например добавить в .msmtprc учётки других сервисов, в запросе джойнить таблицу b_mail_mailservices, определять из неё сервис и в параметры командной строки добавлять выбор нужной учётки.