Сайт на 1С-Битрикс может продолжать нормально открываться, принимать заказы и сохранять формы, но перестать отправлять письма. В результате администратор не получает новые заявки, покупателю не приходит подтверждение заказа, а письмо для восстановления пароля пропадает где-то между сайтом и почтовым ящиком.
В такой ситуации не стоит сразу менять SMTP, устанавливать сторонний модуль или переписывать отправку через custom_mail().
Сначала нужно определить, на каком участке остановилось письмо:
действие на сайте → почтовое событие → почтовый шаблон → очередь → отправка → SMTP или почтовая система сервера → почтовый ящик получателя.
Когда эта цепочка проверяется по порядку, причина обычно находится намного быстрее.
С чего начать обычному владельцу сайта
Если у вас нет опыта работы с PHP, базой данных и настройкой сервера, сначала выполните три безопасные проверки:
- Отправьте тестовую заявку с сайта на свой адрес.
- Проверьте папки «Спам» и «Рассылки».
- Посмотрите, продолжают ли приходить другие системные письма: восстановление пароля, уведомления о заказах, регистрация пользователя.
Это уже помогает разделить проблему.
Если не работает только одна форма, причина чаще находится в настройке события или почтового шаблона.
Если одновременно пропали заявки, заказы, восстановление пароля и другие уведомления, проверять нужно общую систему отправки.
Перед изменением /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 полезнее:
- создать реальное тестовое событие;
- посмотреть его обработку;
- включить debug;
- проверить SMTP-журнал;
- посмотреть ответ SMTP-сервера.
Битрикс показывает успешную отправку, но письма нет
Допустим, событие обработано и SUCCESS_EXEC показывает Y, но сообщение не появилось у получателя.
На этом этапе диагностика выходит за пределы самой CMS.
Проверяем:
- журнал SMTP-провайдера;
- очередь postfix, sendmail или msmtp;
- отказ удалённого почтового сервера;
- папку «Спам»;
- SPF;
- DKIM;
- DMARC;
- репутацию IP и домена;
- корректность адреса From;
- лимиты почтового провайдера.
Важно понимать: успешная передача письма из Битрикс почтовому транспорту ещё не гарантирует попадание сообщения во «Входящие».
Почтовый сервер получателя может принять сообщение, отправить его в спам или отклонить позже по правилам антиспама.
↑ К оглавлениюПочему форма сохраняется, а письмо не приходит
Это нормальная с точки зрения архитектуры ситуация.
Сохранение результата формы и отправка уведомления — разные операции.
Например:
- пользователь отправляет форму;
- данные успешно записываются;
- создаётся почтовое событие;
- отправка письма завершается ошибкой.
Поэтому наличие заявки в административной части не подтверждает исправность почты.
Начинать нужно со свежего события и его статуса.
↑ К оглавлениюЧто не стоит делать в начале диагностики
Сразу устанавливать SMTP-модуль
Сначала определите участок сбоя. При отсутствии почтового события новый SMTP ничего не исправит.
Сразу добавлять custom_mail()
Во многих старых инструкциях встречается замена стандартной отправки собственной функцией.
Сегодня в Bitrix Framework есть штатная локальная SMTP-конфигурация, поэтому кастомный перехват нужен только при понятной технической причине.
Актуальный механизм SMTP присутствует в модуле main начиная с версии 21.900.0.
Менять несколько настроек одновременно
Если одновременно поменять шаблон, SMTP, cron и адрес отправителя, после восстановления почты останется непонятно, где находилась первоначальная причина.
Работайте последовательно:
измерили → изменили один участок → проверили снова.
Проверять только один почтовый ящик
Используйте второй адрес на другом почтовом сервисе. Это помогает быстро обнаружить фильтрацию конкретного провайдера.
↑ К оглавлениюРабочая последовательность диагностики
Когда 1С-Битрикс не отправляет письма, я обычно прохожу цепочку именно в таком порядке:
- Воспроизвожу проблему.
Создаю контролируемое тестовое событие. - Проверяю регистрацию события.
Если события нет — разбираю форму, компонент или код. - Проверяю шаблон.
Смотрю тип события, сайт, получателя, отправителя и макросы. - Проверяю обработку очереди.
Смотрю состояние b_event, cron и запуск CEvent::CheckEvents(). - Проверяю результат отправки.
Y, F, P или 0 сразу сужают область поиска. - Проверяю SMTP или почтовый транспорт сервера.
Смотрю журнал, авторизацию и ответ удалённого сервера. - Проверяю доставку.
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С-Битрикс.
Найдём участок сбоя и восстановим отправку писем.