1С-Битрикс не отправляет письма: как найти причину и восстановить отправку

Разбираем, как найти участок сбоя — от почтового события и шаблона до очереди, SMTP и доставки письма.

Сайт на 1С-Битрикс может продолжать нормально открываться, принимать заказы и сохранять формы, но перестать отправлять письма. В результате администратор не получает новые заявки, покупателю не приходит подтверждение заказа, а письмо для восстановления пароля пропадает где-то между сайтом и почтовым ящиком.

В такой ситуации не стоит сразу менять SMTP, устанавливать сторонний модуль или переписывать отправку через custom_mail().

Сначала нужно определить, на каком участке остановилось письмо:

действие на сайте → почтовое событие → почтовый шаблон → очередь → отправка → SMTP или почтовая система сервера → почтовый ящик получателя.

Когда эта цепочка проверяется по порядку, причина обычно находится намного быстрее.

С чего начать обычному владельцу сайта

Если у вас нет опыта работы с PHP, базой данных и настройкой сервера, сначала выполните три безопасные проверки:

  1. Отправьте тестовую заявку с сайта на свой адрес.
  2. Проверьте папки «Спам» и «Рассылки».
  3. Посмотрите, продолжают ли приходить другие системные письма: восстановление пароля, уведомления о заказах, регистрация пользователя.

Это уже помогает разделить проблему.

Если не работает только одна форма, причина чаще находится в настройке события или почтового шаблона.

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

Перед изменением /bitrix/.settings.php, cron, настроек PHP или почтового сервера сделайте резервную копию. Ошибка в .settings.php способна нарушить работу всего сайта.

Как устроена отправка почты в 1С-Битрикс

Стандартная почтовая система Битрикс работает через почтовые события.

Например, пользователь отправляет форму. Компонент создаёт событие с определённым типом, Битрикс находит привязанный почтовый шаблон, формирует письмо и передаёт его системе отправки.

При стандартной отложенной отправке событие регистрируется в таблице b_event. Затем CEvent::CheckEvents() обрабатывает необработанные события, создаёт письма и записывает результат выполнения в SUCCESS_EXEC.

Поэтому первая задача при диагностике звучит просто:

понять, создаётся почтовое событие или проблема возникает ещё раньше.

↑ К оглавлению

Проверяем создание почтового события

Сначала воспроизведите проблему.

Например:

  • отправьте форму обратной связи;
  • оформите тестовый заказ;
  • запросите восстановление пароля;
  • выполните другое действие, после которого должно прийти письмо.

После этого проверьте журнал почтовых событий в административной части сайта.

На техническом уровне можно посмотреть последние записи непосредственно в b_event:

SELECT
    ID,
    EVENT_NAME,
    DATE_INSERT,
    DATE_EXEC,
    SUCCESS_EXEC
FROM b_event
ORDER BY ID DESC
LIMIT 50;

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

Нового события нет

Тогда SMTP пока вообще ни при чём.

Письмо ещё не дошло до этапа отправки.

Проверяем:

  • компонент или обработчик формы;
  • тип почтового события;
  • код, который должен создавать событие;
  • настройки интернет-магазина или другого модуля;
  • ошибки PHP;
  • обработчики событий;
  • условия, при которых вызывается отправка.

Особый случай — собственный код с CEvent::SendImmediate() или D7-аналогом. Этот способ отправляет письмо сразу и не создаёт запись в b_event, поэтому отсутствие строки в таблице здесь ожидаемо.

↑ К оглавлению

Проверяем статус почтового события

Если запись появилась, смотрим поле SUCCESS_EXEC.

Официальная документация Битрикс использует следующие результаты:

  • Y — все письма успешно переданы на отправку;
  • F — отправка всех писем завершилась ошибкой;
  • P — часть писем отправилась, часть завершилась ошибкой;
  • 0 — подходящий почтовый шаблон не найден.

Это очень полезная развилка диагностики.

SUCCESS_EXEC = 0

Битрикс создал событие, но не нашёл подходящий шаблон.

Проверяем:

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

SMTP здесь менять бессмысленно. Письмо ещё даже не сформировано для отправки.

SUCCESS_EXEC = F

Письмо сформировано, но отправка закончилась ошибкой.

Переходим к SMTP, PHP mail, msmtp, журналам почтового транспорта и настройкам сервера.

События долго остаются необработанными

Проверяем механизм обработки очереди и cron.

↑ К оглавлению

Проверяем почтовый шаблон

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

Проверьте четыре вещи:

Получатель.

В поле «Кому» должен формироваться реальный адрес.

Отправитель.

Адрес отправителя особенно важен при SMTP-авторизации.

Привязка к сайту.

Шаблон должен обслуживать тот сайт, на котором создаётся событие.

Макросы.

Переменные вроде #EMAIL#, #ORDER_ID#, #NAME# должны реально передаваться при создании события.

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

↑ К оглавлению

Проверяем очередь отправки

Стандартная почтовая система обрабатывает события через CEvent::CheckEvents(). Система выбирает необработанные записи из b_event, формирует письма, отправляет их и записывает результат.

Если новые события появляются, но очередь не уменьшается, проверьте:

  • настройки выполнения агентов;
  • cron;
  • пользователя, от имени которого запускается cron;
  • путь к PHP;
  • журнал cron;
  • ошибки PHP при запуске задания.

В конфигурациях, где почтовые события вынесены на cron, остановившийся cron способен накопить целую очередь писем.

Не стоит сразу переписывать cron по случайной инструкции из старой статьи. За годы в Битрикс менялись рекомендуемые схемы выполнения агентов и почтовых событий. Сначала посмотрите текущую конфигурацию конкретного проекта.

↑ К оглавлению

Проверяем SMTP

В актуальных версиях 1С-Битрикс можно использовать штатные локальные SMTP-подключения.

В административной части они находятся здесь:

Настройки → Настройки продукта → Почтовые и СМС события → Настройки SMTP.

При этом само наличие SMTP-подключения в админке ещё недостаточно.

Для локального SMTP ядро требует активную секцию smtp в:

/bitrix/.settings.php

Минимальная схема выглядит так:

'smtp' => [
    'value' => [
        'enabled' => true,
    ],
],

Для диагностики можно временно включить журналирование:

'smtp' => [
    'value' => [
        'enabled' => true,
        'debug' => true,
        'log_file' => '/absolute/path/mailer.log',
    ],
],

Без 'enabled' => true созданные через административную часть локальные SMTP-подключения использоваться не будут.

Параметры debug и log_file позволяют увидеть обмен с SMTP-сервером.

Не вставляйте этот фрагмент в .settings.php вслепую. Все секции файла находятся внутри одного основного массива, а ошибка синтаксиса способна вывести сайт из строя.

Что проверить в SMTP

Сверьте:

  • сервер;
  • порт;
  • логин;
  • пароль;
  • адрес отправителя;
  • тип защищённого соединения;
  • доступ сервера к внешнему SMTP.

Для порта 465 используется явный SSL-протокол, например:

ssl://smtp.yandex.ru

Для защищённой отправки используется SMTPS или STARTTLS с корректным сертификатом SMTP-сервера.

↑ К оглавлению

Почему настроенный SMTP может не использоваться

Это одна из самых неприятных ситуаций.

Администратор создаёт SMTP-подключение, тестирует логин и пароль, но системные уведомления продолжают идти другим способом или вообще не отправляются.

Причина может находиться в адресе отправителя.

Системные письма используют локальный SMTP, когда e-mail по умолчанию совпадает с адресом одного из настроенных SMTP-отправителей. При отсутствии такого совпадения система может перейти к серверной конфигурации .msmtprc.

Поэтому проверяем вместе:

  • e-mail по умолчанию в настройках сайта;
  • адрес в почтовом шаблоне;
  • адрес SMTP-отправителя;
  • учётную запись SMTP.

Например, SMTP авторизован как:

robot@example.ru

а системный шаблон отправляет от:

admin@another-domain.ru

Такую схему нельзя считать корректной только потому, что логин и пароль SMTP верные.

Почтовый провайдер также может запретить отправку от чужого адреса.

↑ К оглавлению

«Проверка системы» показывает ошибку почты

Здесь есть важная особенность.

Инструмент:

Настройки → Инструменты → Проверка системы

не является полноценным тестом локального SMTP.

Этот тест проверяет PHP-механизм отправки почты, а не локальные SMTP-подключения Битрикс.

Поэтому локальный SMTP может нормально работать, а «Проверка системы» продолжит показывать ошибку почты.

Результат этого теста нельзя использовать как единственное доказательство неисправности SMTP.

Для локального SMTP полезнее:

  1. создать реальное тестовое событие;
  2. посмотреть его обработку;
  3. включить debug;
  4. проверить SMTP-журнал;
  5. посмотреть ответ SMTP-сервера.
↑ К оглавлению

Битрикс показывает успешную отправку, но письма нет

Допустим, событие обработано и SUCCESS_EXEC показывает Y, но сообщение не появилось у получателя.

На этом этапе диагностика выходит за пределы самой CMS.

Проверяем:

  • журнал SMTP-провайдера;
  • очередь postfix, sendmail или msmtp;
  • отказ удалённого почтового сервера;
  • папку «Спам»;
  • SPF;
  • DKIM;
  • DMARC;
  • репутацию IP и домена;
  • корректность адреса From;
  • лимиты почтового провайдера.

Важно понимать: успешная передача письма из Битрикс почтовому транспорту ещё не гарантирует попадание сообщения во «Входящие».

Почтовый сервер получателя может принять сообщение, отправить его в спам или отклонить позже по правилам антиспама.

↑ К оглавлению

Почему форма сохраняется, а письмо не приходит

Это нормальная с точки зрения архитектуры ситуация.

Сохранение результата формы и отправка уведомления — разные операции.

Например:

  1. пользователь отправляет форму;
  2. данные успешно записываются;
  3. создаётся почтовое событие;
  4. отправка письма завершается ошибкой.

Поэтому наличие заявки в административной части не подтверждает исправность почты.

Начинать нужно со свежего события и его статуса.

↑ К оглавлению

Что не стоит делать в начале диагностики

Сразу устанавливать SMTP-модуль

Сначала определите участок сбоя. При отсутствии почтового события новый SMTP ничего не исправит.

Сразу добавлять custom_mail()

Во многих старых инструкциях встречается замена стандартной отправки собственной функцией.

Сегодня в Bitrix Framework есть штатная локальная SMTP-конфигурация, поэтому кастомный перехват нужен только при понятной технической причине.

Актуальный механизм SMTP присутствует в модуле main начиная с версии 21.900.0.

Менять несколько настроек одновременно

Если одновременно поменять шаблон, SMTP, cron и адрес отправителя, после восстановления почты останется непонятно, где находилась первоначальная причина.

Работайте последовательно:

измерили → изменили один участок → проверили снова.

Проверять только один почтовый ящик

Используйте второй адрес на другом почтовом сервисе. Это помогает быстро обнаружить фильтрацию конкретного провайдера.

↑ К оглавлению

Рабочая последовательность диагностики

Когда 1С-Битрикс не отправляет письма, я обычно прохожу цепочку именно в таком порядке:

  1. Воспроизвожу проблему.
    Создаю контролируемое тестовое событие.
  2. Проверяю регистрацию события.
    Если события нет — разбираю форму, компонент или код.
  3. Проверяю шаблон.
    Смотрю тип события, сайт, получателя, отправителя и макросы.
  4. Проверяю обработку очереди.
    Смотрю состояние b_event, cron и запуск CEvent::CheckEvents().
  5. Проверяю результат отправки.
    Y, F, P или 0 сразу сужают область поиска.
  6. Проверяю SMTP или почтовый транспорт сервера.
    Смотрю журнал, авторизацию и ответ удалённого сервера.
  7. Проверяю доставку.
    SPF, DKIM, DMARC, спам и журналы почтового провайдера.

Такой порядок намного надёжнее метода «поменяем SMTP и посмотрим».

↑ К оглавлению

Когда нужна диагностика разработчика

Помощь специалиста обычно требуется, когда:

  • события вообще не создаются;
  • очередь постоянно растёт;
  • cron настроен, но события не обрабатываются;
  • SUCCESS_EXEC регулярно показывает ошибки;
  • SMTP подключается, но системные письма используют другой транспорт;
  • часть шаблонов работает, часть перестала отправляться;
  • проблема появилась после обновления ядра, PHP или переноса на другой сервер;
  • в проекте используется собственный обработчик почты;
  • проблема возникает только при заказах, регистрации или конкретной форме;
  • SMTP-журнал содержит ошибки TLS, авторизации или соединения.

Главная задача здесь не «настроить почту ещё раз», а найти конкретный участок, где разрывается цепочка.

↑ К оглавлению

Частые вопросы

Почему 1С-Битрикс перестал отправлять письма внезапно?

Причина может находиться как в самом сайте, так и за его пределами: изменился пароль SMTP, закончился лимит отправки, остановился cron, изменился адрес отправителя, почтовый провайдер ужесточил требования или после обновления изменилась конфигурация проекта. Сначала создайте новое тестовое событие и определите этап, на котором оно останавливается.

Почему SMTP настроен, но системные письма через него не идут?

Проверьте e-mail по умолчанию и адрес SMTP-отправителя. Для системных писем 1С-Битрикс использует локальный SMTP при совпадении этих адресов; иначе в определённых конфигурациях отправка переходит к серверному msmtp.

Почему «Проверка системы» показывает ошибку, хотя почта отправляется?

Встроенный тест проверяет PHP-механизм отправки и не тестирует локальный SMTP Битрикс. Поэтому такая комбинация результатов допустима.

Что означает SUCCESS_EXEC = F?

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

Что означает SUCCESS_EXEC = 0?

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

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

После передачи сообщения почтовому транспорту начинается отдельный этап доставки. Проверяйте SMTP-журнал, спам, SPF, DKIM, DMARC, ограничения провайдера и ответ сервера получателя.

Нужна помощь с 1С-Битрикс?

Если после последовательной проверки причина остаётся неясной, можно обратиться за диагностикой 1С-Битрикс.

Найдём участок сбоя и восстановим отправку писем.

↑ К оглавлению