Письма и почтовые события в 1С-Битрикс: что проверять

В 1С-Битрикс отправка письма часто проходит через почтовые события. Форма может успешно сохраниться, заявка появится в админке, но письмо менеджеру не придёт. Причина может быть в шаблоне события, настройках SMTP, адресе отправителя, очереди отправки, спам-фильтрах или обработчике формы.

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

Проверить почтовое событие

Сначала нужно понять, какое событие должна создавать форма. В административной части проверяют типы почтовых событий и почтовые шаблоны. Если код вызывает CEvent::Send, в нём обычно видно EVENT_NAME.

CEvent::Send(
    'FORM_FEEDBACK',
    SITE_ID,
    [
        'NAME' => $name,
        'PHONE' => $phone,
        'EMAIL' => $email,
    ]
);

Если EVENT_NAME не совпадает с типом события в админке, шаблон не найдётся. Также нужно проверить SITE_ID: шаблон может быть привязан не к тому сайту.

Проверить шаблон письма

Почтовый шаблон должен быть активен. В нём должны быть корректные поля “Кому”, “От кого”, тема и тело письма. Частая ошибка — в шаблоне используются макросы, которые не передаются из формы.

#NAME#
#PHONE#
#EMAIL#

Если в коде передали USER_PHONE, а шаблон ждёт PHONE, в письме будет пусто. Само письмо при этом может отправиться.

Очередь почты

В Битрикс письма могут попадать в очередь. Если очередь не обрабатывается, письмо создано, но не отправлено. Нужно проверить настройки и работу агентов или cron, которые отвечают за отправку.

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

Если SUCCESS_EXEC = N или записи копятся, нужно смотреть ошибку отправки и работу агентов.

SMTP

Если используется SMTP, нужно проверить host, port, encryption, логин и пароль. На некоторых проектах отправка через mail() работает нестабильно, поэтому SMTP обычно предпочтительнее.

Проверять подключение нужно с сервера сайта:

nc -vz smtp.example.ru 465
openssl s_client -connect smtp.example.ru:465

Для порта 587:

openssl s_client -starttls smtp -connect smtp.example.ru:587

From и Reply-To

Письмо не стоит отправлять от адреса пользователя, который он ввёл в форме. Лучше отправлять от доменного адреса, а email пользователя ставить в Reply-To. Иначе письмо может попасть в спам или быть отклонено.

CEvent::Send(
    'FORM_FEEDBACK',
    SITE_ID,
    [
        'EMAIL_FROM' => 'no-reply@example.ru',
        'EMAIL_TO' => 'manager@example.ru',
        'REPLY_TO' => $email,
    ]
);

Конкретные поля зависят от шаблона. Главное — чтобы From был доменным и совпадал с почтовыми настройками.

SPF, DKIM и DMARC

Если письмо технически отправлено, но попадает в спам, нужно проверить DNS домена. SPF должен разрешать выбранный SMTP-сервис, DKIM должен подписывать письма, DMARC задаёт политику обработки.

dig example.ru TXT
dig _dmarc.example.ru TXT

DKIM selector берётся из почтового сервиса. Его нельзя угадать по домену.

Форма и валидация

Иногда письмо не отправляется потому, что форма не проходит валидацию или обработчик даже не доходит до CEvent::Send. Нужно проверить отправку запроса в Network и добавить временное логирование.

\Bitrix\Main\Diag\Debug::writeToFile(
    $_POST,
    'feedback form',
    '/local/logs/feedback.log'
);

На рабочем сайте не стоит логировать лишние персональные данные надолго. Такой лог нужен только для короткой диагностики.

Чек-лист диагностики

  1. Проверить, какой EVENT_NAME создаёт форма.
  2. Проверить активность почтового шаблона.
  3. Проверить SITE_ID шаблона.
  4. Сравнить макросы шаблона с полями, переданными из кода.
  5. Проверить b_event и SUCCESS_EXEC.
  6. Проверить работу агентов или cron отправки.
  7. Проверить SMTP с сервера сайта.
  8. Проверить From, Reply-To, SPF, DKIM и папку “Спам”.

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

Комментарии (0)

Пока нет комментариев. Будьте первым!