Тестируем отправку писем
Отправка тестового письма из консоли
echo "Test text" | mail -s "Test title" test@yoursite.com
Проверяем работу функции mail из PHP консоли Битрикс
if( mail("test@yoursite.com", "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’ — ошибка
Скрипт отправки почты через 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 = 'info@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 описана в документации от Битрикс
Тестируем отправку писем
Отправка тестового письма из консоли
Проверяем работу функции
mailизPHPконсоли БитриксПроверяем работу сокетов
Проверяем настройки Битрикс
Идем в
Настройки > Настройки продукта > Почтовые и СМС события > Почтовые шаблоныи просматриваем шаблоны. Убеждаемся, что в полеОт когостоит#DEFAULT_EMAIL_FROM#Идем в
Настройки > Настройки продукта > Настройки модулей > Главный модуль > Почта и СМСв полеEmail администратора сайта (отправитель по умолчанию)вписываем правильное значение почта отправителяНа всякий случай почту можно указать еще в поле
E-Mail отдела продаж:по путиНастройки > Настройки продукта > Настройки модулей > Интернет-магазин > НастройкиEmail должен совпадать во всех перечисленных случаях, плюс в настройках msmtp должен быть указан именно он
msmtp configдля простой отправки черезmail.rumsmtp configдля простой отправки черезsmtpmail.rumsmtp configдля простой отправки черезsmtpyandex.rumsmtp configдля простой отправки черезsmtpgmail.commsmtp configдля простой отправки черезsmtptimeweb.ruПолучаем список писем
Значения статусов отправки писем в колонке
SUCCESS_EXECСкрипт отправки почты через phpMailer
Устанавливаем composer
Устанавливаем phpMailer
Если команда
composerне найдена, то пытаемся установиться его глобальноДобавляем в init.php
Для отправки писем с помощью
phpMailerчерезsmtp.mail.ruконфиг должен быть следующего вида:Отладка через AddMessage2Log
В файле
dbconn.phpдобавьте строчкуdefine("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");cannot connect to localhost, port 25: Connection refused
После установки чистого Битрикс-окружения достаточно часто возникает эта ошибка. Чтобы исправить - используйте
postfixthe server sent an empty replyв логеmsmtpДобавляем в конфиг
Испрвление ошибок
Если вы пытаетесь отправить почту через
smtpкомпанииGoogleи получаете ошибку видаSMTP connect() failed, то зайдите в аккаунт гугл с которого отправляете почту. Откройте настройки, перейдите во вкладку Безопасность, найдите пункт «Ненадежные приложения, у которых есть доступ к аккаунту», перейдите в него и разрешите доступ небезопасным приложениям (ссылка)Исправляем ошибку
Mail command not foundПеревод агентов на крон
Редактируем файл
/bitrix/php_interface/dbconn.phpИногда требуется закомментировать строки подключения поддержки крона
Перейдите на страницу
Настройки > Инструменты > Командная PHP-строкаи исполните следующий код:Откроем настройки крон
Добавляем запись:
Перезагружаем
cronНастройка cron описана в документации от Битрикс