Не отправляются письма методом Event::send при этом отправляются методом Event::sendImmediate

В 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:

Когда эта константа установлена в true, Битрикс переключается в режим, при котором агенты обрабатываются только через внешний cron, а не на хитах пользователей. Если cron не настроен или недоступен — агенты не работают, почтовая очередь не обрабатывается.

Решение 1: Закомментировать BX_CRONTAB_SUPPORT в dbconn.php

Самый быстрый способ восстановить отправку писем — закомментировать строку в файле /bitrix/php_interface/dbconn.php:

После этого Битрикс вернётся к режиму запуска агентов «на хитах». При каждом посещении сайта пользователем будет автоматически проверяться почтовая очередь и обрабатываться накопившиеся события. Это простое решение отлично работает на сайтах со стабильным трафиком.

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

Решение 2: Настроить cron для обработки очереди событий

Правильное решение — оставить BX_CRONTAB_SUPPORT включённым, но корректно настроить cron. Добавьте задание в crontab сервера:

Это запускает обработчик агентов каждую минуту. Убедитесь, что путь к PHP-интерпретатору указан верно (проверьте командой which php).

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

Состояние агентов можно проверить в панели управления: Настройки → Производительность → Агенты. Найдите агент с названием, содержащим «Event» или «mail». Проверьте:

  • Дату и время последнего запуска агента
  • Признак активности (должен быть включён)
  • Интервал запуска (обычно 60 секунд)

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

Проверка очереди событий в БД

Просмотреть накопившиеся в очереди письма можно напрямую в базе данных через SQL-запрос:

Поле success = 'N' означает, что письмо ещё не отправлено. Если таблица полна необработанных записей — проблема подтверждена.

Логирование и отладка проблем с отправкой писем

Для детальной диагностики включите логирование почтовых событий в Битрикс. Это делается через Настройки → Настройки продукта → Журнал событий. Выберите модуль «main» и включите запись событий типа «mail».

Также проверьте системные логи почтового сервера (Postfix, Sendmail): нередко причина в том, что сам PHP-mailer не может подключиться к SMTP. В этом случае проблема не в агентах, а в конфигурации почты — и Event::sendImmediate тоже не будет работать без SMTP-настроек.

Итог: если Event::send не работает, а Event::sendImmediate работает — почти всегда проблема в агентах. Закомментируйте BX_CRONTAB_SUPPORT для быстрого решения или настройте реальный cron для корректной работы в production-режиме.