Битрикс не отправляется почта или попадает в спам
Rus
Eng
Битрикс не отправляется почта или попадает в спам
Решаю сложные технические задачи для Bitrix и 1С: от аудита чужого кода до разработки сайтов и настройки сложных интеграций с гарантией результата
Рекомендую

Хостинг для сайта

Если выбираете хостинг под проект — советую Timeweb. Современная инфраструктура, широкий выбор тарифов от стартовых до VPS под нагрузку, отзывчивая техподдержка, которая отвечает по существу, а не отписками. Я сам держу на нём часть своих проектов и рекомендую клиентам.

Перейти Партнёрская ссылка. Для вас цена не меняется.

Тестируем отправку писем

Отправка тестового письма из консоли

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)

Правильный конфиг msmtp и пароль приложения

Если вы уверены, что настроили конфиг верно, но письма не отправляются, то причина скорей всего в необходимости использования пароля приложения

Давайт проверим и отправим тестовое письмо из консоли с подробным логированием. Не забудьте заменить domen.ru

echo -e "To: info@domen.ru\nSubject: Test from msmtp\n\nThis is a test message." | msmtp --debug -a default info@domen.ru

Если вы были правы и кофниг настроен верно, то скорее всего вы увидите такую (или похожую) ошибку среди ответа:

535 5.7.0 NEOBHODIM parol prilozheniya https://help.mail.ru/mail/security/protection/external / Application password is REQUIRED

Мы были правы и нам требуется пароль приложения. Произошло это потому что почтовые сервисы перешли на повышенный уровень безопасности и требуют использовать в качестве пароля пароль приложения, а не обычный пароль от ящика. Как его создать — смотрите в документации вашего почтового сервиса.

И это касается всех крупных игроков на рынке почтовых приложений. Правда у каждого свои условия и тарификация.

Но даже если вы уже выпустили пароль приложения, письма могут по-прежнему не отправляться. Например, Mail.ru с середины 2026 года отключил отправку почты по SMTP для внешних сервисов на бесплатных тарифах. Да, можно перейти на платный тариф — но лично мне больше нравится вариант с качественным бесплатным сервисом.

Внимание: бесплатная альтернатива сервисам отправки почты по smtp

Если вы столкнулись с ошибками авторизации при отправке писем через smtp.mail.ru (например, 535 5.7.0 NEOBHODIM parol prilozheniya), и стандартные методы решения не помогают — обратите внимание на альтернативный сервис smtp.bz.

Он позволяет отправлять до 500 писем в сутки бесплатно, прост в настройке и не требует создания паролей приложений. Достаточно указать host, port, user и password из личного кабинета сервиса в вашем конфиге msmtp.

Подходит как для BitrixVM, так и для других систем, использующих SMTP-отправку. Партнёрская ссылка, для вас цена не меняется

Проверяем настройки Битрикс

Идем в Настройки > Настройки продукта > Почтовые и СМС события > Почтовые шаблоны и просматриваем шаблоны. Убеждаемся, что в поле От кого стоит #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.bz

account default
logfile /home/bitrix/msmtp_default.log
host connect.smtp.bz
port 587
from no-reply@domain.ru
keepbcc off
auth on
user no-reply@domain.ru
password PASSWORD
tls on
tls_certcheck 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);

Скрипт отладки отправки почты через smtp

// Настройки подключения
$smtp_host = 'smtp.yandex.ru';
$smtp_port = 587; // Обычно 587 для TLS/STARTTLS или 465 для SSL
$smtp_user = 'EMAIL';
$smtp_pass = 'APP_PASSWORD';
$timeout   = 10;

function parse_smtp_response($stream, $expected_code) {
    $response = '';
    while ($line = fgets($stream, 515)) {
        $response .= $line;
        // Если 4-й символ пробел, значит это последняя строка ответа сервера
        if (isset($line[3]) && $line[3] == ' ') {
            break;
        }
    }

    $code = substr($response, 0, 3);
    if ($code != $expected_code) {
        throw new Exception("Неожиданный ответ сервера: " . trim($response));
    }
    return $response;
}

try {
    // Подключение к серверу
    $socket = stream_socket_client("tcp://$smtp_host:$smtp_port", $errno, $errstr, $timeout);
    if (!$socket) {
        throw new Exception("Ошибка подключения ($errno): $errstr");
    }

    // Читаем приветствие (ожидаем код 220)
    parse_smtp_response($socket, '220');

    // Приветствуем сервер (EHLO)
    fwrite($socket, "EHLO localhost\r\n");
    parse_smtp_response($socket, '250');

    // Активация шифрования (STARTTLS) для порта 587
    // Если вы сразу подключились на порт 465, этот шаг нужно пропустить
    fwrite($socket, "STARTTLS\r\n");
    parse_smtp_response($socket, '220');

    // Включаем шифрование на существующем потоке
    if (!stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
        throw new Exception("Не удалось запустить TLS шифрование.");
    }

    // Повторное приветствие EHLO уже внутри защищенного канала
    fwrite($socket, "EHLO localhost\r\n");
    parse_smtp_response($socket, '250');

    // Аутентификация (LOGIN)
    fwrite($socket, "AUTH LOGIN\r\n");
    parse_smtp_response($socket, '334'); // Сервер просит логин

    // Отправляем логин в Base64
    fwrite($socket, base64_encode($smtp_user) . "\r\n");
    parse_smtp_response($socket, '334'); // Сервер просит пароль

    // Отправляем пароль в Base64
    fwrite($socket, base64_encode($smtp_pass) . "\r\n");
    parse_smtp_response($socket, '235'); // Код 235 означает успешный вход!

    echo "Успех! Подключение и аутентификация на SMTP-сервере прошли корректно.";

    // Закрываем сессию
    fwrite($socket, "QUIT\r\n");
    fclose($socket);

} catch (Exception $e) {
    echo "Ошибка проверки SMTP: " . $e->getMessage();
    if (isset($socket) && is_resource($socket)) {
        fclose($socket);
    }
}

Скрипт отправки почты через 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 хорошо описаны в документации

 

Более подробно можно изучить вопрос в официально документации:

Александр Тихий
Автор статьи

Александр Тихий

Fullstack-разработчик · 1С-Битрикс

Разрабатываю и развиваю интернет-магазины и корпоративные порталы на 1С-Битрикс. Интеграции с 1С, highload-нагрузки, безопасность по 152-ФЗ.


Комментарии

Комментариев еще нет, Вы можете стать первым кто его оставит

Оставьте комментарий

На сайте используется система премодерирования комментариев, поэтому ваше сообщение будет опубликовано лишь после одобрения модератором

Вы отвечаете на комментарий пользователя

Отправить

ОБРАТНАЯ СВЯЗЬ

Напишите мне

Напишите мне, чтобы обсудить задачу. Работаю удаленно, официально (самозанятый), стоимость часа — 1800 ₽, в день могу уделять проекту 3–4 часа. Отвечаю быстро, консультация бесплатная.

Во время отправки произошла ошибка, пожалуйста попробуйте еще раз через некоторое время
Сообщение отправлено успешно

Телефоны

+7(993) 007-18-96

Email

info@tichiy.ru

Адрес

Россия, г. Москва

Отправляя форму Вы автоматически подтверждаете, что ознакомились и принимаете Политику конфиденциальности сайта