В 1С-Битрикс существуют два метода отправки почтовых событий: Event::send и Event::sendImmediate. Если письма не доходят при использовании Event::send, но исправно отправляются через Event::sendImmediate — это симптом конкретной проблемы с настройкой агентов или кронтаба. Разберём причину и методы её устранения.
В чём разница между Event::send и Event::sendImmediate
Event::sendImmediate отправляет письмо немедленно, прямо в момент вызова метода. Это синхронная операция: выполнение кода ждёт, пока сообщение не будет передано почтовому серверу. Такой подход прост, но замедляет работу сайта при массовых рассылках.
Event::send работает асинхронно. Вместо немедленной отправки метод добавляет событие в очередь — таблицу b_event в базе данных. Письма из этой очереди отправляются агентом Битрикс по расписанию. Именно поэтому, если агенты не запускаются — письма накапливаются в очереди и никуда не уходят.
Почему Event::send зависит от агентов и кронтаба
Агенты в Битрикс — это аналог cron-задач внутри самой CMS. По умолчанию они запускаются «на хитах»: при каждом визите пользователя на сайт Битрикс проверяет, не пора ли выполнить какой-то агент. В числе таких агентов — задача обработки почтовой очереди.
Если сайт настроен на работу с реальным cron (рекомендуемый режим для нагруженных проектов), то агенты запускаются только через cron, а не на хитах. Константа BX_CRONTAB_SUPPORT как раз включает этот режим. Если при этом cron по каким-то причинам не работает — агенты не запускаются, и письма не уходят.
Что делает константа BX_CRONTAB_SUPPORT
Константа BX_CRONTAB_SUPPORT определяется в файле /bitrix/php_interface/dbconn.php:
|
1 |
define("BX_CRONTAB_SUPPORT", true); |
Когда эта константа установлена в true, Битрикс переключается в режим, при котором агенты обрабатываются только через внешний cron, а не на хитах пользователей. Если cron не настроен или недоступен — агенты не работают, почтовая очередь не обрабатывается.
Решение 1: Закомментировать BX_CRONTAB_SUPPORT в dbconn.php
Самый быстрый способ восстановить отправку писем — закомментировать строку в файле /bitrix/php_interface/dbconn.php:
|
1 |
// define("BX_CRONTAB_SUPPORT", true); |
После этого Битрикс вернётся к режиму запуска агентов «на хитах». При каждом посещении сайта пользователем будет автоматически проверяться почтовая очередь и обрабатываться накопившиеся события. Это простое решение отлично работает на сайтах со стабильным трафиком.
Обратите внимание: если в очереди скопилось много писем, сразу после снятия комментария они начнут отправляться, что может создать небольшую нагрузку на почтовый сервер.
Решение 2: Настроить cron для обработки очереди событий
Правильное решение — оставить BX_CRONTAB_SUPPORT включённым, но корректно настроить cron. Добавьте задание в crontab сервера:
|
1 |
* * * * * /usr/bin/php -f /home/b/b98563a8/site/public_html/bitrix/modules/main/tools/cron_events.php > /dev/null 2>&1 |
Это запускает обработчик агентов каждую минуту. Убедитесь, что путь к PHP-интерпретатору указан верно (проверьте командой which php).
Проверка настройки агентов в Битрикс
Состояние агентов можно проверить в панели управления: Настройки → Производительность → Агенты. Найдите агент с названием, содержащим «Event» или «mail». Проверьте:
- Дату и время последнего запуска агента
- Признак активности (должен быть включён)
- Интервал запуска (обычно 60 секунд)
Если дата последнего запуска не обновляется — агенты точно не работают.
Проверка очереди событий в БД
Просмотреть накопившиеся в очереди письма можно напрямую в базе данных через SQL-запрос:
|
1 2 3 4 5 |
SELECT id, event_name, c_date, success FROM b_event WHERE success = 'N' ORDER BY c_date DESC LIMIT 20; |
Поле success = 'N' означает, что письмо ещё не отправлено. Если таблица полна необработанных записей — проблема подтверждена.
Логирование и отладка проблем с отправкой писем
Для детальной диагностики включите логирование почтовых событий в Битрикс. Это делается через Настройки → Настройки продукта → Журнал событий. Выберите модуль «main» и включите запись событий типа «mail».
Также проверьте системные логи почтового сервера (Postfix, Sendmail): нередко причина в том, что сам PHP-mailer не может подключиться к SMTP. В этом случае проблема не в агентах, а в конфигурации почты — и Event::sendImmediate тоже не будет работать без SMTP-настроек.
Итог: если Event::send не работает, а Event::sendImmediate работает — почти всегда проблема в агентах. Закомментируйте BX_CRONTAB_SUPPORT для быстрого решения или настройте реальный cron для корректной работы в production-режиме.
