Битрикс не отправляется почта или попадает в спам
Последние записи
Тестируем отправку писем
Отправка тестового письма из консоли
echo "Test text" | mail -s "Test title" test@test.ru
Проверяем работу функции mail
из PHP
консоли Битрикс
if( mail("test@test.ru", "Subject", "Text") ){
echo 'Успешно отправлено!'; }
else{
echo 'Отправка не удалась!';
}
Проверяем работу сокетов
$fp = fsockopen("ssl://smtp.mail.ru", 465, $errno, $errstr, 30);
if (!$fp)
echo "Error: $errstr ($errno)\n";
else
echo "Connected";
fclose ($fp)
Проверяем настройки Битрикс
Идем в Настройки > Настройки продукта > Почтовые и СМС события > Почтовые шаблоны
и просматриваем шаблоны. Убеждаемся, что в поле От кого
стоит #DEFAULT_EMAIL_FROM#
Идем в Настройки > Настройки продукта > Настройки модулей > Главный модуль > Почта и СМС
в поле Email администратора сайта (отправитель по умолчанию)
вписываем правильное значение почта отправителя
На всякий случай почту можно указать еще в поле E-Mail отдела продаж:
по пути Настройки > Настройки продукта > Настройки модулей > Интернет-магазин > Настройки
Email должен совпадать во всех перечисленных случаях, плюс в настройках msmtp должен быть указан именно он
msmtp config
для простой отправки через mail.ru
account default
logfile /home/bitrix/.msmtp.log
host mail.bitrixsoft.com
port 25
from user@email.com
auth off
msmtp config
для простой отправки через smtp
mail.ru
account default
logfile /home/bitrix/msmtp_default.log
host smtp.mail.ru
port 587
from no-reply@default.ru
keepbcc off
auth on
user no-reply@default.ru
password default
tls on
tls_starttls on
tls_certcheck off
msmtp config
для простой отправки через smtp
yandex.ru
account default
logfile /var/log/msmtp.log
host smtp.yandex.ru
port 587
from usr@yandex.ru
keepbcc on
auth on
user usr@yandex.ru
password PAss
tls on
tls_starttls on
msmtp config
для простой отправки через smtp
gmail.com
account default
tls on
tls_certcheck off
auth on
host smtp.gmail.com
port 587
user YOUR_EMAIL
from YOUR_EMAIL
password YOUR_PASSWORD
msmtp config
для простой отправки через smtp
timeweb.ru
# smtp account configuration for default
account default
logfile /home/bitrix/msmtp_default.log
host smtp.timeweb.ru
port 465
from YOUR_EMAIL
aliases /etc/aliases
keepbcc off
auth on
user YOUR_EMAIL
password YOUR_PASSWORD
tls on
tls_starttls off
tls_certcheck off
Получаем список писем
select * from b_event
where event_name like 'SALE_NEW_ORDER'
order by date_insert desc
Значения статусов отправки писем в колонке SUCCESS_EXEC
‘Y’ — означает успешная отправка;
‘N’ или 0 — письмо не отправлено;
‘F’ — ошибка
Как прикрепить файл к стандартному почтовому шаблону Битрикс
$FILES = [];
foreach ($_FILES as $file)
if (!empty($file['tmp_name'])
$FILES[]=CFile::SaveFile($file);
CEvent::Send('SUBSCRIBE_CONFIRM', SITE_ID, $eventFields, 'Y', '', $FILES);
Скрипт отправки почты через phpMailer
Устанавливаем composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Устанавливаем phpMailer
composer require phpmailer/phpmailer
Если команда composer
не найдена, то пытаемся установиться его глобально
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
Добавляем в init.php
require '/var/www/YOUR_SITE/vendor/autoload.php';
use Bitrix\Main\Application;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
//Перехват генерации почтового события с возможностью его отмены
AddEventHandler("main", "OnBeforeEventAdd", array("OnBeforeEventAddClass", "OnBeforeEventAddHandler"));
class OnBeforeEventAddClass
{
function OnBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
{
$connection = Bitrix\Main\Application::getConnection('default');//Получаем соединение с БД
//Получаем шаблон письма
$recordset = $connection->query("select SUBJECT, MESSAGE, MESSAGE_PHP from b_event_message where ACTIVE = 'Y' AND EVENT_NAME = '".$event."'")->fetchAll();
$fields = $arFields;
AddMessage2Log($arFields, "arFields");
if(isset($recordset[0]['MESSAGE'])){//Проверяем есть ли шаблон
$mask = $recordset[0]['MESSAGE'];
$subject = $recordset[0]['SUBJECT'];
foreach ($fields as $key => $value){
if(!is_array($value) && strpos($key, '~') === false){//Исключаем из замены массивы и символы ~
//Заменяем все возможные паттерны
$mask = preg_replace('~\#'.$key.'\#~', $value, $mask);
$subject = preg_replace('~\#'.$key.'\#~', $value, $subject);
}
}
$mask = preg_replace('~\#SITE_NAME\#~', COption::GetOptionString("main", "site_name", $GLOBALS["SERVER_NAME"]), $mask);
$mask = preg_replace('~\#SERVER_NAME\#~', COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]), $mask);
$mask = preg_replace('~\#DEFAULT_EMAIL_FROM\#~', COption::GetOptionString("main", "email_from", "admin@".$GLOBALS["SERVER_NAME"]), $mask);
$subject = preg_replace('~\#SITE_NAME\#~', COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]), $subject);
$subject = preg_replace('~\#SERVER_NAME\#~', COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]), $subject);
if($mask) {//Ести тело сформировано, то запускаем отправку
if(isset($fields['RS_USER_EMAIL'])){
if (filter_var($fields['RS_USER_EMAIL'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['RS_USER_EMAIL'];
}
}
if(isset($fields['EMAIL'])){
if (filter_var($fields['EMAIL'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL'];
}
}
if(isset($fields['EMAIL_RAW'])){
if (filter_var($fields['EMAIL_RAW'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL_RAW'];
}
}
if(isset($fields['EMAIL_BUYER'])){
if (filter_var($fields['EMAIL_BUYER'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL_BUYER'];
}
}
if(isset($fields['EMAIL_TO'])){
if (filter_var($fields['EMAIL_TO'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL_TO'];
}
}
if(!$email){
$email = 'default@email.ru';
}
if($email && filter_var($email, FILTER_VALIDATE_EMAIL)){
$cl = new OnBeforeEventAddClass;
if($cl->custom_mail($email, $subject, $mask,'','')){//Отправляем письмо
//AddMessage2Log($event, "Сообщение было отправлено");
}else{
//AddMessage2Log($event, "Ошибка. Сообщение отправлено не было");
}
}else{
//AddMessage2Log($event, "Ошибка. Почта не найдена. Почта:");
}
return false;
}else{
//AddMessage2Log($event, "Ошибка. Нет тела письма");
}
}else{
//AddMessage2Log($event, "Ошибка. Не найден шаблон письма");
}
}
public function custom_mail($to, $subject, $message, $additionalHeaders = '', $additional_parameters)
{
// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);
$mail->IsSMTP(true); // enable SMTP
$mail->SMTPDebug = 3; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for GMail
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465; // set the SMTP port for the GMAIL server
$mail->Username = 'email'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->CharSet = 'UTF-8';
$mail->addAddress($to);
$mail->setFrom('default@email.ru');
//Set the subject line
$mail->Subject = $subject;
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML($message);
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
$d_message='';
//preg_match('/From: (.+)\n/i', $additionalHeaders, $matches);
//list(, $from) = $matches;
$from = 'admin@YOUR_SITE';
$d_message.='$from - '.$from.' +++ '; $d_message.='$to - '.$to.' +++ ';
$d_message.='$subject - '.$subject.' +++ ';
$d_message.='$message - '.$message.' +++ ';
$mail->setFrom($from);
$mail->addAddress($to, ''); // Add a recipient
//$mail->addReplyTo($from, '');
//$mail->AddBCC($from);
//$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
//$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
$mail->Subject = $subject;
if($message != strip_tags($message)) {
$mail->isHTML(true);
}
$mail->Body = $message;
// $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if(!$mail->send()) {
AddMessage2Log($mail->ErrorInfo, "Mailer Error");
return false;
} else {
return true;
}
}
}
//Перехват письма непосредственно перед отправкой
AddEventHandler('main', 'OnBeforeEventSend', Array("OnBeforeEventSendClass", "my_OnBeforeEventSend"));
class OnBeforeEventSendClass
{
function my_OnBeforeEventSend($arFields, $arTemplate)
{
//получим сообщение
}
}
Для отправки писем с помощью phpMailer
через smtp.mail.ru
конфиг должен быть следующего вида:
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
$mail->IsSMTP(true); // enable SMTP
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for GMail
$mail->Host = 'ssl://smtp.mail.ru';
$mail->Port = 465; // set the SMTP port for the GMAIL server
$mail->Username = 'USER_NAME'; // SMTP username
$mail->Password = 'USER_PASSWORD'; // SMTP password
Отладка через AddMessage2Log
В файле dbconn.php
добавьте строчку define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");
cannot connect to localhost, port 25: Connection refused
После установки чистого битрикс окружения достаточно часто вижу эту ошибку. Чтобы исправить - используйте postfix
yum install postfix
service postfix start
chkconfig postfix on
the server sent an empty reply
в логе msmtp
Добавьте в конфиг
tls_starttls off
Борьба с ошибками
Если вы пытаетесь отправить почту через smtp
компании Google
и получаете ошибку вида SMTP connect() failed
, то зайдите в аккаунт гугл с которого отправляете почту. Откройте настройки, перейдите во вкладку Безопасность, найдите пункт «Ненадежные приложения, у которых есть доступ к аккаунту», перейдите в него и разрешите доступ небезопасным приложениям (ссылка)
Боремся с ошибкой Mail command not found
yum install sendmail
yum -y install mailx
service sendmail start
Перевод агентов на крон
Правим файл /bitrix/php_interface/dbconn.php
Иногда требуется закомментировать строки подключения поддержки крона
define('BX_CRONTAB', true);
define('BX_CRONTAB_SUPPORT', true);
Перейдите на страницу Настройки > Инструменты > Командная PHP-строка
и исполните следующий код:
COption::SetOptionString("main", "agents_use_crontab", "Y");
echo COption::GetOptionString("main", "agents_use_crontab", "N");
Откроем настройки крон
crontab -u bitrix -e или crontab -e
Добавим запись:
*/1 * * * * php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php >/dev/null 2>&1
Перезагружаем cron
systemctl restart crond.service
Настройки cron хорошо описаны в документации
Более подробно можно изучить вопрос в официально документации:
Комментарии