Чеклист по настройке почты
Быстрый ответ
- В
dbconn.php
должно быть прописаноdefine("BX_CRONTAB_SUPPORT", true);
- В cron должен запускаться скрипт
bitrix/modules/main/tools/cron_events.php
раз в минуту. - Почта должна отправляться по SMTP с помощью модуля Отправка электронной почты через SMTP
Это стабильно работающий проверенный вариант. Ниже - больше вариантов и подробности.
Чтобы почта в принципе отправлялась битриксом
Должен быть выполнен один из двух пунктов:
- Первый вариант (предпочтительный). Почта отправляется через crontab. Для этого
- в dbconn.php должна быть определена константа
define("BX_CRONTAB_SUPPORT", true);
- должен быть настроен запуск cron на хостинге, в соответствии с инструкциями, которые можно найти в Проверке системы. Строка запуска будет выглядеть примерно так:
* * * * * /usr/local/bin/php /путь_к_сайту/public_html/bitrix/modules/main/tools/cron_events.php
- в dbconn.php должна быть определена константа
- Второй вариант. Почта отправляется по хитам.
- в dbconn.php НЕ ДОЛЖНО БЫТЬ константы BX_CRONTAB_SUPPORT (установка её в false не сработает).
Чтобы почта доходила до получателя
Все пункты очень важны.
Существуют и другие варианты настройки, но они сложнее или не факт, что хорошо работают. Здесь - только проверенное.
TL;DR Идеальный вариант - почта на Яндекс.Коннекте, отправка в битриксе через SMTP, адрес отправителя (в настройках шаблона, главного модуля, сайта) должен соответствовать ящику SMTP, используемому для отправки.
Вариант 1 (простой и рабочий) - почта отправляется через SMTP
Настраивается с помощью модуля Отправка электронной почты через SMTP от Веб студия Руби.
Если почта отправляется через SMTP, она должна отправляться именно с таким адресом отправителя, который соответствует этому этому ящику SMTP. То есть, в Битриксе адрес отправителя (в настройках шаблона, главного модуля, сайта) должен соответствовать ящику SMTP, через который отправляется почта.
Ящик должен быть рабочим. О том, как сделать рабочий ящик, см. соответствующий раздел.
Вариант 2 (сложный и ломающийся) - почта отправляется через встроенный механизм Битрикс
Встроенный механизм Битрикс (который сводится в ф-ии mail() в PHP).
Для этого варианта для домена/сервера должны быть корректно настроены SPF, DKIM, обратка PTR. Это сложно делать самостоятельно, поэтому такой вариант предпочтительно использовать только когда это все уже заведомо настроено кем-то ещё, например, провайдером хостинга.
Поэтому такой вариант можно применять только если выполнены ВСЕ пункты ниже:
- Сайт должен размещаться на виртуальном хостинге с панелью управления.
- Проверенные хостинги - Sprinthost. На других пока неизвестно.
- DNS должен находиться на хостинге и иметь неизменённые настройки по умолчанию.
- Почта должна работать на хостинге (а не на яндекс.коннекте или где-то еще).
- Адрес, от которого отправляется почта, должен существовать, т. е. должен быть создан такой ящик в ПУ хостинга.
- Ящик должны либо регулярно проверять и чистить там почту, либо он должен уничтожать (возможно, после предварительной пересылки на другой ящик) все поступающие в него письма, чтобы он не переполнялся. В ПУ хостингов такая настройка как правило есть.
Так как работа почты зависит от этих условий, почта может сломаться при смене хостинга, сервера хостинга, DNS и прочего.
Как создать рабочий ящик для отправки почты по SMTP
Рабочий ящик - это такой ящик, с которого письмо отправляешь, а оно - о, чудо! - доходит до получателя (хотя бы в 99,9% случаев).
Чтобы ящик был рабочим, он должен быть создан на каком-либо сервисе, который заведомо корректно работает с почтой. Это может быть (опять же - тут только проверенные варианты, хотя возможных решений больше):
- Почта на бесплатных сервисах вида inbox.ru, gmail.com, yandex.ru и т. п. (если клиент согласен, что письма с сайта будут идти с таким адресом отправителя, например, mysite@yandex.ru, а не с домена сайта).
- На Яндекс.Коннекте - почта для домена.
- Какой-то администратор уже настроил почту для этого домена на каком-либо сервисе или своем почтовом сервере, клиент уже пользуется почтовыми ящиками и их работа всех устраивает.
- Почта на виртуальном хостинге, на котором размещается сайт. При этом, хоть почта будет отправляться через SMTP, все равно должны быть соблюдены все требования, которые указаны в разделе "Вариант 2 - почта отправляется через встроенный механизм Битрикс".
Как не будет работать или будет работать плохо
Такие варианты предпочтительно не использовать, так как они работают плохо. Вместо них лучше настроить Яндекс.Коннект или, на крайний случай, почту на бесплатном сервисе типа inbox.ru.
- В битрикс-веб-окружении - почта не будет работать, пока ее не настроишь (просто поставить sendmail недостаточно, надо настраивать SPF, Dkim, обратку PTR, что сложно).
- На произвольной VDS с ISPManager или другой панелью - в общем случае будет работать плохо, пока не будут настроены SPF, Dkim, обратка PTR, что сложно.
Дебаг
Окей, если все настроено как описано в соседнем ответе по предпочтительному варианту, или по другому варианту, но почта все еще не отправляется, вот как это можно подебажить.
Рассмотрим, как вообще идет процесс создания -> отправки письма.
- Некий метод компонента/модуля вызывает ф-ю Битрикса, инициирующую отправку письма (например,
CEvent::Send()
, но не обязательно именно её, есть альтернативы). Инициирующую - именно в такой формулировке, потому что письмо в этот момент ни отправляется, ни даже создаётся, только инициируется процесс его отправки. - В результате инициирования отправки письма Битрикс создаёт запись в таблице
b_event
, в которой указано, по какому шаблону (ID шаблона) нужно отправить письмо, и значения переменных для вставки в шаблон. - Через какое-то время (по cron или по хитам) запускается обработчик очереди сообщений (в конечном итоге ф-я
CEvent::CheckEvents()
), которая по очереди берет письма из этого списка, создает письмо по шаблону и уже реально отправляет его. - В результате отправки письма ф-ей
CEvent::CheckEvents()
у записи вb_event
меняется поле SUCCESS_EXEC: 'N' => 'Y', а также проставляетсяDATE_EXEC
. CEvent::CheckEvents()
отправляет не все письма, а только несколько из конца очереди, поэтому после запуска некоторые письма могут отправиться, а некоторые не отправиться.- Работе
CEvent::CheckEvents()
может препятствовать параметрdefine("CACHED_b_event", 3600);
вdbconn.php
(по которому нет документации). Данная запись означает, что если в процессе отправки какого-либо одного письма возникла ошибка, то в течение 3600 секунд повторных попыток отправки никаких писем более не будет. - Сбросить
CACHED_b_event
можно удалением managed_cache.
Соответственно, как дебажить.
- Смотрим таблицу
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
- Если после заполнения и отправки формы (или выполнения другого действия, которое должно отправить письмо) нет записи в таблице
b_event
, значит, компонент даже не пытался создать письмо, нужно смотреть настройки компонента. - Если запись есть и там
DATE_EXEC
не проставлен, значит, инициирование отправки письма компонентом выполнено корректно, просто еще никто не пытался отправить письмо (не вызывалсяCEvent::CheckEvents()
). Еслиdefine("BX_CRONTAB_SUPPORT", true);
, то попинать разборщик очереди можно запускомbitrix/modules/main/tools/cron_events.php
. Также, и при отсутствии, и при наличииBX_CRONTAB_SUPPORT
можно запускать разборщик очереди напрямую ф-ейCEvent::CheckEvents()
через PHP-консоль в админке. - В процессе разбора очереди нужно ожидать появления значения в
DATE_EXEC
у отправляемых сообщений и измененияSUCCESS_EXEC
сN
наY
. - Если в процессе 'N' на 'Y' не меняется, но
DATE_EXEC
проставляется, значит, происходит ошибка при отправке письма, и нужно проверять корректность настроекsendmail_path
, а лучше - настроить все через модуль SMTP как описано тут. - Если в процессе вообще ничего не меняется, то надо посмотреть, сколько вообще писем со статусом 'N', может, письма на самом деле отправляются, но из самого конца очереди и их просто не видно. Если так, что надо запустить разборщик очереди много раз подряд.
- Если при запуске точно вообще абсолютно везде ничего не меняется, значит, сработал
CACHED_b_event
, и нужно удалить managed_cache.
Кстати! Стоимость настройки отправки почты с сайта на CMS 1С-Битркис нашими специалистами - 1 400 руб.