Методы отправки писем в Битрикс: от Mail::send до почтовых событий
Отправка писем из кода Битрикса
Основное эффективное решение: \Bitrix\Main\Mail\Mail::send()
Класс Mail предоставляет универсальный метод для отправки как простых, так и сложных писем. Он автоматически использует настроенный в системе способ доставки (почтовая функция или SMTP).
Пример отправки простого письма:
use Bitrix\Main\Mail\Mail;
$result = Mail::send([
'TO' => 'user@example.com',
'SUBJECT' => 'Привет, Битрикс!',
'BODY' => 'Это тестовое сообщение.',
]);
if ($result) {
echo "Письмо отправлено успешно";
} else {
echo "Ошибка отправки";
}
Пояснение: Массив содержит ключи TO (получатель), SUBJECT (тема), BODY (тело). Можно добавить FROM, CC, BCC, CONTENT_TYPE (по умолчанию text/plain).
Типичные ошибки и решения:
- Письмо не доходит или попадает в спам. Проверить настройки почты в административной части (Настройки > Настройки продукта > Почтовые настройки). Убедиться, что указан корректный
FROM, совпадающий с доменом. - Кодировка тела письма искажена. Явно задать параметр
CHARSET(например, 'UTF-8'). - Ошибка "Mailer error". Включить отладку:
$mailer = new \Bitrix\Main\Mail\Mailer(); var_dump($mailer->getErrors());.
Как отправить простое текстовое письмо без использования API Битрикса?
Можно использовать нативную PHP-функцию mail(). Подходит для быстрых прототипов, но не рекомендуется из-за отсутствия интеграции с настройками Битрикса.
$to = 'user@example.com';
$subject = 'Тема письма';
$message = 'Текст письма';
$headers = 'From: no-reply@mysite.ru' . "\r\n" .
'Content-type: text/plain; charset=UTF-8' . "\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "Отправлено";
} else {
echo "Ошибка";
}
- Проблема: не учитываются настройки SMTP из конфига Битрикса, письма могут отправляться через локальный sendmail с ограничениями.
- Решение: перенастроить функцию
mail()через.settings.php(полеmail), но проще использовать штатный классMail.
Как настроить отправку писем через внешний SMTP-сервер?
Настройка SMTP производится в файле bitrix/.settings.php. Пример:
'mail' => [
'value' => [
'smtp' => [
'host' => 'smtp.gmail.com',
'port' => 465,
'protocol' => 'ssl',
'login' => 'user@gmail.com',
'password' => 'пароль_приложения',
],
],
],
После сохранения файла все письма, отправляемые через Mail::send(), пойдут через указанный SMTP.
- Ошибка соединения. Проверить хост, порт и протокол. Для Gmail требуется пароль приложения, а не обычный.
- Письма не отправляются. Включить логгирование: добавить
'debug' => trueв массивsmtp.
Как отправлять письма асинхронно, в фоновом режиме, не замедляя ответ пользователю?
Для этого используется агент Битрикса. Создаётся функция, которая вызывает Mail::send(), и регистрируется агент.
// в файле /local/php_interface/init.php
function sendAsyncMail($to, $subject, $body) {
\Bitrix\Main\Mail\Mail::send([
'TO' => $to,
'SUBJECT' => $subject,
'BODY' => $body,
]);
return "sendAsyncMail(\"$to\", \"$subject\", \"$body\")";
}
// регистрация агента:
\CAgent::AddAgent(
"sendAsyncMail(\"user@example.com\", \"Тема\", \"Тело\");",
"", // модуль
"N", // периодичность
60, // интервал в секундах
date("Y-m-d H:i:s"), // дата первого запуска
"Y", // активен
date("Y-m-d H:i:s") // дата последнего запуска
);
- Проблема: агент выполняется только при хите на сайт, если трафика нет, письмо задержится.
- Решение: использовать cron для вызова
cron_events.php. - Ошибка: агент не запускается – проверить, что функция возвращает строку вызова самой себя для повторения.
Как отправить письмо с использованием почтовых событий (шаблонов) CEvent?
Метод CEvent::Send() удобен, когда нужно использовать готовые шаблоны писем из административной части.
$eventName = 'MY_NEW_EVENT'; // тип события
$fields = [
'EMAIL_TO' => 'user@example.com',
'USER_NAME' => 'Иван',
];
$event = new CEvent;
$result = $event->Send($eventName, SITE_ID, $fields);
if ($result) {
echo "Событие отправлено";
} else {
print_r($event->LAST_ERROR);
}
Предварительно нужно создать тип почтового события в админке (Почтовые события > Типы почтовых событий) и шаблон для него.
- Проблема: письмо не отправляется, хотя событие обработано. Проверить, что шаблон активен и привязан к нужному сайту.
- Ошибка: неизвестный тип события – создать его кодом или вручную.
Расширенные примеры отправки писем
Пример 1. Отправка HTML-письма с вложением
use Bitrix\Main\Mail\Mail;
$filePath = $_SERVER['DOCUMENT_ROOT'] . '/upload/invoice.pdf';
$attachment = [
'CONTENT' => file_get_contents($filePath),
'FILENAME' => 'invoice.pdf',
'CONTENT_TYPE' => 'application/pdf',
];
$result = Mail::send([
'TO' => 'client@example.com',
'SUBJECT' => 'Счёт на оплату',
'BODY' => '<h1>Здравствуйте!</h1><p>Ваш счёт во вложении.</p>',
'CONTENT_TYPE' => 'text/html',
'ATTACHMENT' => [$attachment],
]);
if ($result) {
echo "Письмо с вложением отправлено";
} else {
echo "Ошибка отправки";
}
Результат: true (при успехе) или false (при ошибке).
Пример 2. Отправка письма с несколькими получателями и скрытой копией (BCC)
use Bitrix\Main\Mail\Mail;
$result = Mail::send([
'TO' => 'manager1@example.com, manager2@example.com',
'SUBJECT' => 'Уведомление для менеджеров',
'BODY' => 'Важная информация.',
'BCC' => 'archive@example.com',
]);
if ($result) {
echo "Письмо отправлено";
} else {
var_dump($result);
}
Результат: true.
Пример 3. Отправка письма с пользовательскими заголовками (Reply-To, Message-ID)
use Bitrix\Main\Mail\Mail;
$result = Mail::send([
'TO' => 'user@example.com',
'SUBJECT' => 'Ответ на обращение',
'BODY' => 'Текст ответа',
'HEADERS' => [
'Reply-To' => 'support@mysite.com',
'Message-ID' => '<msg123@mysite.com>',
],
]);
if (!$result) {
$mailer = new \Bitrix\Main\Mail\Mailer();
print_r($mailer->getErrors());
}
Результат: true при успехе. Массив ошибок при неудаче.
Пример 4. Отправка письма с использованием DKIM-подписи
Для включения DKIM необходимо настроить DNS-запись, а затем в .settings.php добавить:
'mail' => [
'value' => [
'dkim' => [
'domain' => 'mysite.com',
'private_key' => '/path/to/private.key',
'selector' => 'default',
],
],
],
Все последующие письма будут подписываться автоматически. Проверка подписи производится получателем.
Результат: подпись добавляется в заголовки письма, видно в исходном тексте письма.
Пример 5. Отправка письма с кодировкой UTF-8 и сменой имени отправителя
use Bitrix\Main\Mail\Mail;
$result = Mail::send([
'TO' => 'user@example.com',
'SUBJECT' => 'Проверка кодировки',
'BODY' => 'Сообщение на русском языке',
'FROM' => 'Иван Иванов <ivan@mysite.com>',
'CHARSET' => 'UTF-8',
]);
if (!$result) {
$errors = \Bitrix\Main\Mail\Mailer::getErrors();
foreach ($errors as $error) {
echo $error->getMessage();
}
}
Результат: true. Если ошибка, выведется сообщение (например, 'Invalid address').