Недавно столкнулся с тем, что битрикс не имеет штатных средств, для прикрепления файла к письму. В интернете нашел вот этот пост https://dev.1c-bitrix.ru/community/web...blog/1623/ И вот этот модуль http://marketplace.1c-bitrix.ru/solut...attaching/ Решение описанное в первом блоге мне понравилось, но хотелось бы управлять прикреплением файлов из шаблона письма. Это позволило бы добавить файлы к шаблонам, которые используются в стандартных компонентах системы без кастомизации этих компонентов. По моей задумке к письму нужно добавить заголовок Add-File, а содержание этого заголовка должно быть таким
#CARD#=>card.jpg; #CARD2#=>card2.jpg;
#CARD# - это путь к файлу на диске card.jpg - это то как будет называться файл после прикрепления к письму [spoiler] Тогда в самом письме к прикрепленным файлам можно было бы обращаться вот так:
Чтобы перехватить данные перед самой их отправкой и подключить файлы нужно всего лишь объявить функцию и именем custom_mail. В первом приближении она должна повторять функционал того что идет после нее в функции bxmail чтобы не нарушать работу системы после ее объвления.
Для этого нужно обычное письмо преобразовать в письмо, состоящее из нескольких сущностей. Тип письма определен в заголовке Content-Type.
Content-Type:text/plain; charset=… - текстовый шаблон
Content-Type:text/html; charset=… - html шаблон письма
Content-Type: multipart/mixed; boundary="разделитель”; - письмо состоящее из нескольких частей
Разделитель это то, что отделяет одну часть письма от другой в теле сообщения. При этом тело сообщения должно выглядеть примерно так:
-- разделитель
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit Два перехода на новую линию (eol)
Тело письма. Два перехода на новую линию (eol)
-- разделитель
Content-Type: application/octet-stream;name="card.jpg"
Content-Disposition:attachment;filename="card.jpg"
Content-Transfer-Encoding: base64 Два перехода на новую линию (eol)
Файл, разложенный по основанию 64. Два перехода на новую линию (eol)
Учитывая все вышесказанное не сложно написать функцию, которая преобразует формат письма перед отправкой. Сразу прикреплю ее код к посту.
Кода получилось немного. Его можно просто скопировать в файл bitrix\php_interface\init.php Или скопировать в отдельный файл /bitrix/php_interface/include/classes/custom_mail.php и подключать его только когда происходит событие отправки письма. Тогда в файл bitrix\php_interface\init.php можно написать вот так.
AddEventHandler('main', 'OnBeforeEventAdd', 'includeCustomMail');
function includeCustomMail($event, $lid, $arFields) {
if ($event == 'MY_TYPE') {
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/include/classes/custom_mail.php');
}
}
В итоге для подключения файла к письму достаточно в письмо вставить строку Преимущества: Можно подключать файлы из почтового шаблона. Недостатки: Каждое письмо будет дополнительно обрабатываться перед отправкой
Подскажите, как нужно правильно прописать вызов этой функции если мне например нужно приаттачивать логотип сайта в шапку письма, которое отправляется пользователю и админу при оформлении заказа в ИМ ?
Для преобразования списка товаров в заказе, я использую вот такое событие OnOrderNewSendEmail и свою функцию ModifyOrderSaleMails
т.е вот так: AddEventHandler('sale', 'OnOrderNewSendEmail', 'ModifyOrderSaleMails');
Как мне вызывать вашу функцию что бы приаттачить логотип и он отображался в письме?
Прикрепление файла к шаблонам письма нового заказа. Поиск выводить на эту старую тему, так что оставлю тут на будущее.
//получаем свойство с файлом
AddEventHandler("sale", "OnOrderNewSendEmail", "modifySendingSaleData");
function modifySendingSaleData($orderID, &$eventName, &$arFields) {
// получаем свойства заказа
$orderProps = CSaleOrderPropsValue::GetOrderProps($orderID);
//находим свойство с файлом
while ($arProps = $orderProps->Fetch()) {
if ($arProps['CODE'] == 'MY_ATTACH') {
$arFields['MY_ATTACH'] = $arProps['VALUE']; //тут будет ID файла
break; //если больше не нужно добавлять свойств, то останавливаем перебор
}
}
}
//прикрепление файла к письму
AddEventHandler("main", "OnBeforeEventAdd", "onBeforeEventAddHandler");
function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
{
if ($event === 'SALE_NEW_ORDER') { //событие создания заказа, прикрепляем ко всем шаблонам этого события
if (!is_array($files)) $files = [];
foreach ($arFields as $key => $field) { //находим поле с ID нашего файла
if ($key == 'MY_ATTACH' && boolval($field)) {
$files[] = $field;
break;
}
}
}
}
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».