29 сентября 2022
4931
С сайта на Bitrix не отправляется почта. Как разобраться, в чем проблема и сделать, чтобы почта нормально отправлялась?

Чеклист по настройке почты

Быстрый ответ

  1. В dbconn.php должно быть прописано define("BX_CRONTAB_SUPPORT", true);
  2. В cron должен запускаться скрипт bitrix/modules/main/tools/cron_events.php раз в минуту.
  3. Почта должна отправляться по SMTP с помощью модуля Отправка электронной почты через SMTP

Это стабильно работающий проверенный вариант. Ниже - больше вариантов и подробности.

Чтобы почта в принципе отправлялась битриксом

Должен быть выполнен один из двух пунктов:

  1. Первый вариант (предпочтительный). Почта отправляется через crontab. Для этого
    • в dbconn.php должна быть определена константа define("BX_CRONTAB_SUPPORT", true);
    • должен быть настроен запуск cron на хостинге, в соответствии с инструкциями, которые можно найти в Проверке системы. Строка запуска будет выглядеть примерно так: * * * * * /usr/local/bin/php /путь_к_сайту/public_html/bitrix/modules/main/tools/cron_events.php
  2. Второй вариант. Почта отправляется по хитам.
    • в dbconn.php НЕ ДОЛЖНО БЫТЬ константы BX_CRONTAB_SUPPORT (установка её в false не сработает).

Чтобы почта доходила до получателя

Все пункты очень важны.

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

TL;DR Идеальный вариант - почта на Яндекс.Коннекте, отправка в битриксе через SMTP, адрес отправителя (в настройках шаблона, главного модуля, сайта) должен соответствовать ящику SMTP, используемому для отправки.

Вариант 1 (простой и рабочий) - почта отправляется через SMTP

Настраивается с помощью модуля Отправка электронной почты через SMTP от Веб студия Руби.

Если почта отправляется через SMTP, она должна отправляться именно с таким адресом отправителя, который соответствует этому этому ящику SMTP. То есть, в Битриксе адрес отправителя (в настройках шаблона, главного модуля, сайта) должен соответствовать ящику SMTP, через который отправляется почта.

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

Вариант 2 (сложный и ломающийся) - почта отправляется через встроенный механизм Битрикс

Встроенный механизм Битрикс (который сводится в ф-ии mail() в PHP).

Для этого варианта для домена/сервера должны быть корректно настроены SPF, DKIM, обратка PTR. Это сложно делать самостоятельно, поэтому такой вариант предпочтительно использовать только когда это все уже заведомо настроено кем-то ещё, например, провайдером хостинга.

Поэтому такой вариант можно применять только если выполнены ВСЕ пункты ниже:

  1. Сайт должен размещаться на виртуальном хостинге с панелью управления.
  2. Проверенные хостинги - Sprinthost. На других пока неизвестно.
  3. DNS должен находиться на хостинге и иметь неизменённые настройки по умолчанию.
  4. Почта должна работать на хостинге (а не на яндекс.коннекте или где-то еще).
  5. Адрес, от которого отправляется почта, должен существовать, т. е. должен быть создан такой ящик в ПУ хостинга.
  6. Ящик должны либо регулярно проверять и чистить там почту, либо он должен уничтожать (возможно, после предварительной пересылки на другой ящик) все поступающие в него письма, чтобы он не переполнялся. В ПУ хостингов такая настройка как правило есть.

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

Как создать рабочий ящик для отправки почты по SMTP

Рабочий ящик - это такой ящик, с которого письмо отправляешь, а оно - о, чудо! - доходит до получателя (хотя бы в 99,9% случаев).

Чтобы ящик был рабочим, он должен быть создан на каком-либо сервисе, который заведомо корректно работает с почтой. Это может быть (опять же - тут только проверенные варианты, хотя возможных решений больше):

  1. Почта на бесплатных сервисах вида inbox.ru, gmail.com, yandex.ru и т. п. (если клиент согласен, что письма с сайта будут идти с таким адресом отправителя, например, mysite@yandex.ru, а не с домена сайта).
  2. На Яндекс.Коннекте - почта для домена.
  3. Какой-то администратор уже настроил почту для этого домена на каком-либо сервисе или своем почтовом сервере, клиент уже пользуется почтовыми ящиками и их работа всех устраивает.
  4. Почта на виртуальном хостинге, на котором размещается сайт. При этом, хоть почта будет отправляться через SMTP, все равно должны быть соблюдены все требования, которые указаны в разделе "Вариант 2 - почта отправляется через встроенный механизм Битрикс".

Как не будет работать или будет работать плохо

Такие варианты предпочтительно не использовать, так как они работают плохо. Вместо них лучше настроить Яндекс.Коннект или, на крайний случай, почту на бесплатном сервисе типа inbox.ru.

  1. В битрикс-веб-окружении - почта не будет работать, пока ее не настроишь (просто поставить sendmail недостаточно, надо настраивать SPF, Dkim, обратку PTR, что сложно).
  2. На произвольной VDS с ISPManager или другой панелью - в общем случае будет работать плохо, пока не будут настроены SPF, Dkim, обратка PTR, что сложно.

Дебаг

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

Рассмотрим, как вообще идет процесс создания -> отправки письма.

  1. Некий метод компонента/модуля вызывает ф-ю Битрикса, инициирующую отправку письма (например, CEvent::Send(), но не обязательно именно её, есть альтернативы). Инициирующую - именно в такой формулировке, потому что письмо в этот момент ни отправляется, ни даже создаётся, только инициируется процесс его отправки.
  2. В результате инициирования отправки письма Битрикс создаёт запись в таблице b_event, в которой указано, по какому шаблону (ID шаблона) нужно отправить письмо, и значения переменных для вставки в шаблон.
  3. Через какое-то время (по cron или по хитам) запускается обработчик очереди сообщений (в конечном итоге ф-я CEvent::CheckEvents()), которая по очереди берет письма из этого списка, создает письмо по шаблону и уже реально отправляет его.
  4. В результате отправки письма ф-ей CEvent::CheckEvents() у записи в b_event меняется поле SUCCESS_EXEC: 'N' => 'Y', а также проставляется DATE_EXEC.
  5. CEvent::CheckEvents() отправляет не все письма, а только несколько из конца очереди, поэтому после запуска некоторые письма могут отправиться, а некоторые не отправиться.
  6. Работе CEvent::CheckEvents() может препятствовать параметр define("CACHED_b_event", 3600); в dbconn.php (по которому нет документации). Данная запись означает, что если в процессе отправки какого-либо одного письма возникла ошибка, то в течение 3600 секунд повторных попыток отправки никаких писем более не будет.
  7. Сбросить CACHED_b_event можно удалением managed_cache.

Соответственно, как дебажить.

  1. Смотрим таблицу b_event, к примеру, таким запросом (покажет последние 10 записей в этой таблице):
select ID, EVENT_NAME, MESSAGE_ID, DATE_INSERT, DATE_EXEC, SUCCESS_EXEC, C_FIELDS from b_event order by id desc limit 10\G
  1. Если после заполнения и отправки формы (или выполнения другого действия, которое должно отправить письмо) нет записи в таблице b_event, значит, компонент даже не пытался создать письмо, нужно смотреть настройки компонента.
  2. Если запись есть и там DATE_EXEC не проставлен, значит, инициирование отправки письма компонентом выполнено корректно, просто еще никто не пытался отправить письмо (не вызывался CEvent::CheckEvents()). Если define("BX_CRONTAB_SUPPORT", true);, то попинать разборщик очереди можно запуском bitrix/modules/main/tools/cron_events.php. Также, и при отсутствии, и при наличии BX_CRONTAB_SUPPORT можно запускать разборщик очереди напрямую ф-ей CEvent::CheckEvents() через PHP-консоль в админке.
  3. В процессе разбора очереди нужно ожидать появления значения в DATE_EXEC у отправляемых сообщений и изменения SUCCESS_EXEC с N на Y.
  4. Если в процессе 'N' на 'Y' не меняется, но DATE_EXEC проставляется, значит, происходит ошибка при отправке письма, и нужно проверять корректность настроек sendmail_path, а лучше - настроить все через модуль SMTP как описано тут.
  5. Если в процессе вообще ничего не меняется, то надо посмотреть, сколько вообще писем со статусом 'N', может, письма на самом деле отправляются, но из самого конца очереди и их просто не видно. Если так, что надо запустить разборщик очереди много раз подряд.
  6. Если при запуске точно вообще абсолютно везде ничего не меняется, значит, сработал CACHED_b_event, и нужно удалить managed_cache.

Кстати! Стоимость настройки отправки почты с сайта на CMS 1С-Битркис нашими специалистами - 1 400 руб.
Позвоните нам!
Личный кабинет
Вам будет доступна история заказов, управление рассылками, свои цены и скидки для постоянных клиентов и прочее.
Ваш логин
Ваш пароль
Работаем для вас с 9:30 до 18:30
Ждем писем!
г. Санкт-Петербург, Краснопутиловская ул., 69