Для начала необходимо проверить работу почты сайта под управлением Битрикс.
Битрикс посылает почтовые шаблоны функциями CEvent::Send() и CEvent::SendImmediate().
Письмо отправляется, если Битрикс нашел активный почтовый шаблон, подходящий под это событие и соответствующий текущему сайту.
Письма, отправленные через CEvent::Send(), попадают в таблицу b_event.
Чтобы проверить таблицу, существует 2 способа.
Способ 1
Перейдите на страницу ваш_домен/bitrix/admin/perfmon_tables.php и в поле "Фильтр по имени таблицы" введите b_event, далее перейдите по точному совпадению таблицы.
Фильтр по имени таблицы
Способ 2
Письма, попавшие в 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) поменять на свои.
После этого нажмите на кнопку "ВЫПОЛНИТЬ".
Командная PHP-строка
Битриксовская отправка письма - обёртка над функцией 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
SQL запрос
Обратите внимание на колонки SUCCESS_EXEC и DUPLICATE. Иногда нужно подождать некоторое время (недолго), пока отработает запись в лог. Первый при установленном значении 'Y' говорит нам, что отправка произошла успешно. Второй, что письмо продублировано на скрытую копию ВСС (например администратору о совершенном заказе).
Что же делать, если значения 'N', а отправка простого mail() выдала 'Успешно отправлено!'?
Параметр SUCCESS_EXEC сообщает:
- Y - все письма по всем почтовым шаблонам были успешно отправлены;
- F - все письма по всем почтовым шаблонам не смогли быть отправлены;
- P - часть писем отправлена успешно, часть писем - безуспешно;
- 0 - почтовые шаблоны не были найдены;
- N - почтовое событие ещё не обрабатывалось функцией CEvent::CheckEvents.
Если там стоит 'N'
- Возможно в настройках продукта включена отправка сообщений по крону. Зайдите в файл /bitrix/php_interface/dbconn.php и проверьте, не определены ли у вас константы BX_CRONTAB и BX_CRONTAB_SUPPORT, если да - убрать их.(ОСТОРОЖНО! Будьте готовы вернуть всё в исходное состояние)
- Если после этого SUCCESS_EXEC также N, то необходимо перейти в папку /bitrix/managed_cache/ и попытаться удалить содержимое обязательно через модуль управления структурой, а не через FTP. Если возникла ошибка, исправьте проблему с доступом продукта к папкам. Результатом должно быть удаление файлов и папок из кеша через модуль управления структурой.
- Если после выполения команды CEvent::CheckEvents(); в командной строке несколько писем с N меняют статус отправки на другой, нужно добавлять и проверять cron-задачу или переключить отправку писем на хиты.
- Поставьте cron-задачу (проверьте, есть ли она вообще) или перенесите отправку на хиты.
- Код в init.php, некорректно работающий на cron. Проверьте там редиректы и пустые данные в переменной $_SERVER.
Если там стоит 'F' (функция mail() по какой-то причине вернула False)
- Может почтовый сервер не поддерживает формат письма. Тогда необходимо:
- Убрать BBC (лучше добиться, чтоб оно работало, но попробовать отключить можно)
- Убрать дублирование email в заголовке
- Установить "Конвертировать 8-битные заголовки"
- Может быть это проблемы на стороне почтовой утилиты на сервере. Если почта была настроена, но вдруг перестала отправляться, ошибку нужно искать в логах почтовой утилиты. В стандартном виртуальном окружении Битрикса он находится по адресу /home/bitrix/msmtp_default.log. Проверьте также права на /home/bitrix/.msmtprc. Возможно прав для пользователя bitrix (если стантартное виртуальное окружение) не достаточно на прочтение. Поменяйте владельца на bitrix:bitrix.
- Если писем отправляется очень много. В почтовых серверах может стоять ограничение на количество писем в минуту, час или день. Если лимит превышен, письма могут быть не доставлены. Ошибки можно увидеть в логах или узнать у техподдержки почтового сервера. Лечится увеличением пропускного лимита или уменьшением количества отправляемых писем. Например, можно убрать лишних получателей из копий, отключить лишние почтовые шаблоны.
- В почтовом шаблоне письма есть заглушка #NAME#, а ключа с таким именем нет в массиве полей в b_event:
- e-mail отправителя или получателя имеет неправильный формат;
- заглушека #NAME# не может подставиться;
- какой-то из необходимых заголовков не задан в почтовом шаблоне в административной части сайта;
- в почтовом клиенте неверно настроено соответствие заголовков;
- отправитель письма не соответствует тому, что ожидает почтовый сервер.
- Битрикс заполняет заглушку #BCC# в полях Кому и Копии только в письмах, отправляемые модулем Интернет-магазин (например, создание заказа). Если вы добавите #BCC# в Кому или Копию в шаблон регистрации пользователя или в свой кастомный, или любой другой шаблон без приставки SALE — письмо не отправится и будет иметь статус отправки F.
- Обработчики событий отправки писем сработали неверно.
- Обратите внимание на функцию 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';
SQL запрос
Если стоит "0"
- Неправильно настроен шаблон сообщения. Посмотрите правильность зополнения полей. Мало ли.
- В почтовом шаблоне снята галочка активности или нет привязки к нужному сайту.
- Обработчики событий отправки писем сработали неверно.
Если ничего не помогло
- Просите у хостера логи почтового сервера.
- По возможности проверить размер таблицы b_event (через phpmyadmin к примеру).
- Если дешевый тариф, то посмотреть использование памяти сервером.
- Возможно у хостера стоит ограничение на вес письма.
Проверка домена в настройках сайта
Для отправки писем важно, чтобы домен, с которого отправляются письма, был прописан в настройках сайта.
В Административном разделе перейдите на Настройки -> Настройки продукта -> Сайты -> Список сайтов и нажмите на id сайта, с которого идет отправка письма:
Список сайтов
На странице настроек сайта проверьте поле "Доменное имя". Если там не указан домен, с которого отправляются письма, то введите его:
Редактирование сайта
Если письмо отправилось, но вы его не видите не забудьте перепроверить спам фильтр на почте, на которую отправляли.