Назад

Отправка почтовых событий в Битрикс D7: пошаговое руководство

Главная
Блог
Отправка почтовых событий в Битрикс D7: пошаговое руководство

Отправка писем в Bitrix CMS — важная часть бизнес-логики сайта. В этой статье рассмотрим, как правильно отправлять почтовые события через D7 API, включая работу с вложениями, обработку ошибок и мультиязычные шаблоны.

1. Классический способ (CEvent::Send)

Устаревший, но рабочий метод через ядро CEvent:

$arEventFields = [
    "EMAIL_TO" => "client@example.com",
    "ORDER_ID" => 482,
    "USER_NAME" => "Иван Иванов"
];

CEvent::Send("ORDER_CREATED", "s1", $arEventFields);

Параметры:

  • ORDER_CREATED — код почтового события (настраивается в админке).

  • s1 — ID сайта.

  • $arEventFields — массив полей для подстановки в шаблон.

Недостатки:

  • Нет поддержки D7.

  • Нет удобной обработки ошибок.

  • Менее гибкий, чем современные методы.

2. Современный метод (Bitrix\Main\Mail\Event)

Рекомендуемый способ для новых проектов:

use Bitrix\Main\Mail\Event;

$result = Event::send([
    "EVENT_NAME" => "ORDER_CREATED",
    "LID" => "s1", // ID сайта
    "C_FIELDS" => [
        "EMAIL" => "client@example.com",
        "ORDER_ID" => 482,
        "USER_NAME" => "Иван Иванов"
    ]
]);

if (!$result->isSuccess()) {
    $errors = $result->getErrors();
    // Логирование ошибок
}

Преимущества:

  • Поддержка D7 и современных стандартов PHP.

  • Возможность проверки успешности отправки.

  • Гибкость в передаче данных.

3. Мгновенная отправка (sendImmediate)

Если письма не отправляются из-за задержек агентов:

Event::sendImmediate([
    "EVENT_NAME" => "TEST_EVENT",
    "LID" => "s1",
    "C_FIELDS" => [
        "EMAIL" => "test@example.com",
        "MESSAGE" => "Это тестовое письмо"
    ]
]);

Когда использовать?

  • Для тестирования шаблонов.

  • В критичных по времени процессах (например, подтверждение оплаты).

4. Отправка вложений (файлов)

Чтобы добавить файлы к письму:

Event::send([
    "EVENT_NAME" => "INVOICE_SENT",
    "LID" => "s1",
    "C_FIELDS" => [
        "EMAIL" => "client@example.com",
        "INVOICE_ID" => 1001
    ],
    "FILE" => [
        $_SERVER["DOCUMENT_ROOT"] . "/upload/invoices/invoice_1001.pdf",
        // Можно передать несколько файлов
    ]
]);

Важно:
Файлы должны быть доступны для чтения сервером.

5. Мультиязычные письма (LANGUAGE_ID)

Если сайт мультиязычный, можно указать язык письма:

Event::send([
    "EVENT_NAME" => "WELCOME_EMAIL",
    "LID" => "s1",
    "LANGUAGE_ID" => "en", // или "ru", "de" и т.д.
    "C_FIELDS" => [
        "EMAIL" => "user@example.com",
        "NAME" => "John"
    ]
]);

6. Динамическое изменение шаблона

Можно переопределить текст письма прямо в коде:

Event::send([
    "EVENT_NAME" => "NEWSLETTER",
    "LID" => "s1",
    "C_FIELDS" => [
        "EMAIL" => "subscriber@example.com"
    ],
    "MESSAGE_REPLACE" => [
        "subject" => "Новый заголовок письма",
        "body" => "<p>Это кастомный HTML-контент письма.</p>"
    ]
]);

7. Отправка нескольким получателям

Если нужно разослать письма с разными данными:

$recipients = [
    ["email" => "user1@example.com", "name" => "Алексей"],
    ["email" => "user2@example.com", "name" => "Мария"]
];

foreach ($recipients as $recipient) {
    Event::send([
        "EVENT_NAME" => "PERSONAL_NOTIFICATION",
        "LID" => "s1",
        "C_FIELDS" => [
            "EMAIL" => $recipient["email"],
            "NAME" => $recipient["name"]
        ]
    ]);
}

Типичные ошибки и решения

Проблема Решение
Письма не отправляются Проверить SMTP-настройки в админке (Настройки > Почта).
Переменные не подставляются Убедиться, что ключи в C_FIELDS совпадают с шаблоном.
Письма уходят с задержкой Использовать sendImmediate() или проверить работу агентов.
Ошибки при отправке вложений Проверить права доступа к файлам.

Заключение

Для новых проектов рекомендуется использовать D7 API (Bitrix\Main\Mail\Event), так как он:

  • Поддерживает современные стандарты.

  • Позволяет обрабатывать ошибки.

  • Дает больше гибкости (вложения, мультиязычность, динамические шаблоны).

Классический метод (CEvent::Send) стоит применять только в legacy-проектах. Для мгновенной отправки используйте sendImmediate(). Всегда тестируйте шаблоны перед использованием в продакшене.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи