Блог

Не работает почта Битрикс

Проверить работу почты сайта под управлением Битрикс:

Битрикс посылает почтовые шаблоны функциями CEvent::Send() и CEvent::SendImmediate().

Письмо отправляется, если Битрикс нашел активный почтовый шаблон, подходящий под это событие и соответствующий текущему сайту.

Письма отправлены через CEvent::Send() попадают в таблицу b_event.

Чтоб проверить таблицу существует 2 способа 

первый: перейти на страницу

домен/bitrix/admin/perfmon_tables.php

и в поле Фильтр по имени таблицы ввести b_event. перейти по точному совпадению таблицы.

другой: описан ниже

Письма, попавшие в b_event, посылаются на агенте (хиты) или на cron (по расписанию). Отправляются не сразу.

Письма, посылаемые через SendImmediate  не попадают в b_event, а отправляются сразу.

Send и SendImmediate - обертки на функцию Битрикса bxmail, которая использует либо стандартную php-функцию mail, либо custom_mail, если она определена.

 Административный раздел->Рабочий стол->Настройки->Инструменты->Командная PHP-строка скопировать туда:
if( mail("mail_to@mail.com", "letter test", "my letter text",
"From: mail_from@mail.com
Reply-To: mail_from@mail.com
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit"
) ){
    echo 'Успешно отправлено!';
}else{
    echo 'Отправка не удалась!';
}

Поля "От кого" (mail_from@mail.com), "Кому"(mail_to@mail.com) поменять на свои.
Нажать ВЫПОЛНИТЬ.
Битриксовская отправка письма - обёртка над функцией mail().
Если "Отправка не удалась!" функция mail не работает, свяжитесь с администрацией хостинга.

  Далее нужно проверить срабатывает ли штатные события.
На D7:
 use Bitrix\Main\Mail\Event;
$arFields = array(
    "EVENT_NAME" => "ваше событие",
    "LID" => "код вашего сайта",
    "C_FIELDS" => array(
    "EMAIL"    => "mail_to@mail.com",
    "BCC"    => "mail_to@mail.com",
    "DEFAULT_EMAIL_FROM"    => "mail_from@mail.com",
    ),
    "DUPLICATE"=>"Y",
);
$result=Event::send($arFields);
if($result->GetId()){
    echo 'Успешно отправлено!';
}else{
    echo 'Отправка не удалась!';
}

Проверьте что поля "DEFAULT_EMAIL_FROM", "EMAIL", "EVENT_NAME" заполнены верно.

  Если не поддерживается D7:
$arEventFields = array(
     "EMAIL_TO"            => "mail_to@mail.com",
    "BCC"                 => "mail_to@mail.com",
   "DEFAULT_EMAIL_FROM"    => "mail_from@mail.com",
    "ORDER_LIST"    => "состав заказа",
    );
$result=CEvent::Send("ваше событие", "код вашего сайта", $arEventFields,'Y');
if(intval($result)){
    echo 'Успешно отправлено!';
}else{
    echo 'Отправка не удалась!';
}

 
Административный раздел->Рабочий стол->Настройки->Инструменты->SQL запрос пишем
   select * from b_event order by id desc

Обращаем свое внимание на колонки SUCCESS_EXEC и DUPLICATE. Иногда нужно подождать некоторое время (недолго) пока отработает запись в лог. Первый при установленном значении 'Y' говорит нам что отправка произошла успешно. Второй что письмо продублировано на скрытую копию ВСС (например администратору о совершенном заказе).
Что же делать если значения 'N', а отправка простого mail() выдала 'Успешно отправлено!' ?
Параметр SUCCESS_EXEC сообщает 
Y - все письма по всем почтовым шаблонам были успешно отправлены
F - все письма по всем почтовым шаблонам не смогли быть отправлены
P - часть писем отправлена успешно, часть писем - безуспешно
0 - почтовые шаблоны не были найдены
N - почтовое событие ещё не обрабатывалось функцией CEvent::CheckEvents

Если там стоит 'N' 

1) Возможно в настройках продукта включена отправка сообщений по крону. зайдите в файл /bitrix/php_interface/dbconn.php и проверьте не определены ли у вас константы BX_CRONTAB и BX_CRONTAB_SUPPORT, если да - убрать их.(ОСТОРОЖНО! Быть готовым вернуть всё в исходное состояние)

2) Если после этого SUCCESS_EXEC также N, то необходимо перейти в папку /bitrix/managed_cache/ и попытаться удалить содержимое обязательно через модуль управления структурой, а не через FTP. Если ошибка — исправить проблему с доступом продукта к папкам. Результатом должно быть удаление файлов и папок из кеша через модуль управления структурой. 

3) если после виполения команды CEvent::CheckEvents(); в командной строке несколько писем с N меняют статус отправки на другой нужно добавлять и проверять cron-задачу или переключить отправку писем на хиты.

 4) Поставить cron-задачу(проверить есть ли она вобще) или перенести отправку на хиты.
 5) Код в init.php, некорректно работающий на cron. Проверьте там редиректы и пустые данные в  переменной $_SERVER.
 

Если там стоит 'F'(функция mail() по какой-то причине вернула False) 

1)Может почтовый сервер не поддерживает формат письма.
Убрать BBC(добиваемся чтоб оно работало, но попробовать отключить можно)
Убрать дублирование email в заголовке
Установить Конвертировать 8-битные заголовки

  2)Может быть это проблемы на стороне почтовой утилиты на сервере.
Если почта была настроена, но вдруг перестала отпарвляться, ошибку нужно искать в логах почтовой утилиты. В стандартном виртуальном окружении Битрикса это /home/bitrix/msmtp_default.log
проверьте также права на 
 /home/bitrix/.msmtprc
возможно прав для пользователя bitrix (если стантартное виртуальное окружение) не достаточно на прочтение. Поменяйте владельца на bitrix:bitrix

  3) Если писем отправляется очень много.

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

4) В почтовом шаблоне письма есть заглушка #NAME#, а ключа с таким именем нет в массиве полей в b_event.

e-mail отправителя или получателя имеет неправильный формат;

- заглушека #NAME# не может подставиться;

- какой-то из необходимых заголовков не задан в почтовом шаблоне в административной части сайта;

- в почтовом клиенте неверно настроено соответствие заголовков;

- отправитель письма не соответствует тому, что ожидает почтовый сервер.

- Битрикс заполняет заглушку #BCC# в полях Кому и Копии только в письмах, отправляемые модулем Интернет-магазин (например создание заказа).Если вы добавите #BCC# в Кому или Копию в шаблон регистрации пользователя или в свой кастомный, или любой другой шаблон без приставки SALE — письмо не отправится и будет иметь статус отправки F.


5) Обработчики событий отправки писем сработали неверно.
6) Обратите внимание на функцию custom_mail. Если она определена значит заменяет стандартную mail. Даже если она отработала корректно (отослались письма) статус может быть F или 0. Проверьте тариф используемого SMTP, проверьте логины, пароли а также адрес отправителя. Обычно используют класс PhpMailer. Включите дебаг, посмотрите ошибки.
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$from = 'адрес отправителя';
$mail = new PHPMailer(true);
$mail->SMTPDebug = 1; // включаем дебаг
$mail->isSMTP(); // включаем SMTP
$mail->Host = ''; // SMTP сервер
$mail->SMTPAuth = true; // включаем авторизацию
$mail->Username = $from; // SMTP логин
$mail->Password = ''; // SMTP пароль
$mail->SMTPSecure = 'ssl'; // включаем шифрование
$mail->Port = 465; // используемый TCP порт

//Recipients
$mail->setFrom($from, 'Арт-Деко'); //от кого
$mail->addAddress(''); //кому
// Content
$mail->CharSet = "UTF-8"; //кодировка
$mail->isHTML(true); // формат письма HTML
$mail->Subject = '=test=';
$mail->Body = '=test body=';
$mail->send();
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/mail_log.log',serialize($mail->ErrorInfo).PHP_EOL,FILE_APPEND);

Если стоит NULL 
API работает только с записями, у которых значение "N", попробуем исправить сам столбец таблицы.
Административный раздел->Рабочий стол->Настройки->Инструменты->SQL запрос пишем
  alter table b_event modify SUCCESS_EXEC char(1) not null default 'N';

 
Если стоит "0"
1) Неправильно настроен шаблон сообщения. 
Посмотрите правильность зополнения полей. Мало ли.
2) В почтовом шаблоне снята галочка активности или нет привязки к нужному сайту.
3) Обработчики событий отправки писем сработали неверно.

Если ничего не помогло, просите у хостера логи почтового сервера.
По возможности проверить размер таблицы b_event (через phpmyadmin к примеру).
Если дешевый тариф то посмотреть использование памяти сервером.
Возможно у хостера стоит ограничение на вес письма.

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

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



Вам нужен сайт? С чего начать?

Проконсультируем, найдем оптимальное решение, подготовим индивидуальное предложение.