Отправка писем по API Bitrix

1С-Битрикс
Задача: Отправить письмо через API Bitrix
Довольно часто необходимо отправлять письма администратору, а что делать, если использовать не очень хороший компонент веб-форм нет возможности или желания? Правильно! Будем слать все через API
Итак, первое, что необходимо сделать — создать почтовое событие и почтовый шаблон.
Переходим в Настройки -> Настройки продукта -> Почтовые и СМС события -> Типы событий
Жмакаем — «Добавить тип» в моем примере — заполняю так:
Тип события: QUICK_ORDER
Вид события: Почтовое событие
Сохраняем и переходим в Переходим в Настройки -> Настройки продукта -> Почтовые и СМС события ->Почтовые шаблоны.
Жмакаем — «Добавить шаблон» в моем примере — заполняю так:
Тип почтового события: QUICK_ORDER
Выбираем сайт и язык.
От кого:#DEFAULT_EMAIL_FROM#
Кому: %email кому будет приходить письмо%
Тема: Быстрый заказ
Новое сообщение с сайта #SITE_NAME#!
Имя клиента: #CUSTOMER_NAME#
Телефон клиента: #CUSTOMER_PHONE#Детали заказа:
#ORDER_DETAIL#
Теперь к обработчику:
htmlspecialcharsEx($_POST['customer_name']), "CUSTOMER_PHONE" => htmlspecialcharsEx($_POST['customer_phone']), "ORDER_DETAIL" => htmlspecialcharsEx($_POST['order_detail']), ); $result = CEvent::Send($EVENT_TYPE, $SITE_ID, $arFeedForm ); echo json_encode($result);
Я использую ajax для формы, поэтому у меня в ответ летит json.
Как видите, ключи в массиве arFeedForm выступают маркерами в сообщении. Вот и все! Если вы сделали все правильно, но при следующей отправке формы Вы получите письмо на почту.
Отправка почты средствами битрикс

Отправка писем средствами системы 1С-Битрикс. при помощи класса «\Bitrix\Main\Mail\Event».
Отправка простого сообщения по почтовому событию «USER_INFO» для сайта «s1» по расписанию:
\Bitrix\Main\Mail\Event::send(array(
"EVENT_NAME" => "USER_INFO",
"LID" => "s1",
"C_FIELDS" => array(
"EMAIL" => "test@mysite.ru",
"USER_ID" => 235
),
));
Отправка простого сообщения по почтовому событию «USER_INFO» для сайта «s1» (мгновенная):
\Bitrix\Main\Mail\Event::sendImmediate(array(
"EVENT_NAME" => "USER_INFO",
"LID" => "s1",
"C_FIELDS" => array(
"EMAIL" => "test@mysite.ru",
"USER_ID" => 235
),
));
Мгновенная отправка на почту отправленного на сервер файла вложением:
$fileId = false;
if($_FILES['file'])
$fileId = \CFile::SaveFile($_FILES['file'],"mailatt");
\Bitrix\Main\Mail\Event::sendImmediate(array( // or send
"EVENT_NAME" => "VM_SERVICE_REQUEST",
"LID" => "s2",
"C_FIELDS" => array(
"EMAIL" => $arCompany["PROPERTIES"]["EMAIL"]["VALUE"],
"COMPANY_NAME" => $arCompany["NAME"],
"MESSAGE" => $request->getPost("MESSAGE"),
"USER_NAME" => $USER->GetFullName(),
"USER_EMAIL" => $USER->GetEmail(),
),
"FILE" => array($fileId), // нужно сохранять сначала, из документации к CEvent::send: Массив id файлов, которые используются классом CFile. Либо можно передать массив абсолютных путей до файлов.
));
if($fileId)
CFile::Delete($fileId);
См. также:
- Если почта не уходит с сайта
- Отправка SMS средствами системы
Отправка почты
Основана на почтовых событиях. Отправка письма через инициацию почтового события:
$arEventFields = array( 'USER_TO' => 'email@site.ru', 'MESSAGE' => 'Mail text', 'SUBJECT' => 'Mail subject' ); $arrSite = 's1'; CEvent::Send('CUSTOM_MAIL_EVENT', $arrSite, $arEventFields, 'N');
‘N’ — чтобы не слать копию на «ящик для всех исходящих писем».
Если в шаблоне письма стоит сайт «en», а у нас текущий сайт «ru», письмо на «en» не отправится!
Протолкнуть не отправленные email \Bitrix\Main\Mail\EventManager::executeEvents();
Пример простой проверки отправки письма
$_SERVER["DOCUMENT_ROOT"] = dirname(__DIR__); // в каталоге 1 уровня (не корень) define("LANGUAGE_ID", "s1"); // ID сайта define("NO_KEEP_STATISTIC", true); define("NOT_CHECK_PERMISSIONS", true); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); CModule::IncludeModule("iblock"); $eventName = "NEW_USER_CONFIRM"; // название события $arFields = array( 'EMAIL' => 'email@site.ru' ); $arrSite = 's1'; // ID сайта $event = new CEvent; $event->Send($eventName, $arrSite, $arFields, "N"); echo 'Done'.PHP_EOL;
Формирование тела письма
Кроме подстановок типа #USER_ID# в шаблоне компонента возможно использовать PHP-код:
EventMessageThemeCompiler::includeComponent( "bitrix:tasks.task.mail", "", array( "ID" => "", "RECIPIENT_ID" => "", "USER_ID" => "", "ENTITY" => "COMMENT", "ENTITY_ACTION" => "ADD", "URL" => "", "EMAIL_TO" => "" )); ?>
Отправка письма с вложением
CEvent::Send принимает шестым параметром массив id файлов
// файл, который будет приложен к письму $filePath = '/path/to/file.txt'; $fileId = CFile::SaveFile( array( "name" => "filename.txt", // имя файла, как оно будет в письме // "size" => filesize($filePath), // работает и без указания размера "tmp_name" => $filePath, // собственно файл // "type" => "", // тип, не ясно зачем "old_file" => "0", // ID "старого" файла "del" => "N", // удалять прошлый? "MODULE_ID" => "", // имя модуля, работает и так "description" => "", // описание // "content" => "содержимое файла" // если указать, то вместо файла будет указанный текст ), 'mails', // относительный путь от upload, где будут храниться файлы false, // ForceMD5 false // SkipExt ); $event = new CEvent; $event->SendImmediate($eventName, $arrSite, $arFields, "N", '', array($fileId)); // отправляем немедленно (так как файл будет удален(?)) CFile::Delete($fileId); // удаляем файл
Send
Метод создает почтовое событие которое будет в дальнейшем отправлено в качестве E-Mail сообщения. Возвращает идентификатор созданного события. Статический метод.
Параметры
| Параметр | Описание | С версии |
|---|---|---|
| event | Идентификатор типа почтового события. | |
| lid | Идентификатор сайта, либо массив идентификаторов сайта. | |
| fields | Массив полей типа почтового события идентификатор которого задается в параметре event_type. Массив имеет следующий формат: array(«поле»=>»значение» [, . ]). | |
| duplicate | Отправить ли копию письма на адрес указанный в настройках главного модуля в поле «E-Mail адрес или список адресов через запятую на который будут дублироваться все исходящие сообщения«. Необязательный. По умолчанию «Y». |
|
| message_id | Идентификатор почтового шаблона по которому будет отправлено письмо. Если данный параметр не задан, либо равен «», то письма будут отправлены по всем шаблонам привязанным к типу почтового события, идентификатор которого задается в параметре event_type, а также привязанных к сайту(ам) идентификатор которого указан в параметре site. Необязательный. По умолчанию — «». |
3.1.7 |
| files | Массив идентификаторов файлов, которые используются классом CFile. Либо можно передать массив абсолютных путей до файлов. |
Если передать в files массив абсолютных путей, то система скопирует файл, и создаст запись в таблице b_event.
Если вы, например, сохраняете файл в инфоблок, и передаете в CEvent::Send путь к файлу вместо id, то файл будет сохранен еще раз.
При передаче файла через CEvent::Send имя файла будет хэшем независимо от настроек главного модуля, поэтому, что бы в письме было нормальное имя файла, нужно всегда передавать массив идентификаторов.
Смотрите также
Примеры использования
$CONTRACT_ID, "MESSAGE" => $mess, "EMAIL_TO" => implode(",", $EMAIL_TO), "ADMIN_EMAIL" => implode(",", $ADMIN_EMAIL), "ADD_EMAIL" => implode(",", $ADD_EMAIL), "STAT_EMAIL" => implode(",", $VIEW_EMAIL), "EDIT_EMAIL" => implode(",", $EDIT_EMAIL), "OWNER_EMAIL" => implode(",", $OWNER_EMAIL), "BCC" => implode(",", $BCC), "INDICATOR" => GetMessage("AD_".strtoupper($arContract["LAMP"]."_CONTRACT_STATUS")), "ACTIVE" => $arContract["ACTIVE"], "NAME" => $arContract["NAME"], "DESCRIPTION" => $description, "MAX_SHOW_COUNT" => $arContract["MAX_SHOW_COUNT"], "SHOW_COUNT" => $arContract["SHOW_COUNT"], "MAX_CLICK_COUNT" => $arContract["MAX_CLICK_COUNT"], "CLICK_COUNT" => $arContract["CLICK_COUNT"], "BANNERS" => $arContract["BANNER_COUNT"], "DATE_SHOW_FROM" => $arContract["DATE_SHOW_FROM"], "DATE_SHOW_TO" => $arContract["DATE_SHOW_TO"], "DATE_CREATE" => $arContract["DATE_CREATE"], "CREATED_BY" => $CREATED_BY, "DATE_MODIFY" => $arContract["DATE_MODIFY"], "MODIFIED_BY" => $MODIFIED_BY ); $arrSITE = CAdvContract::GetSiteArray($CONTRACT_ID); CEvent::Send("ADV_CONTRACT_INFO", $arrSITE, $arEventFields); ?>
Новинки документации в соцсетях:
