Недавно столкнулся с тем, что битрикс не имеет штатных средств, для прикрепления файла к письму.
В интернете нашел вот этот пост
И вот этот модуль
Решение описанное в первом блоге мне понравилось, но хотелось бы управлять прикреплением файлов из шаблона письма. Это позволило бы добавить файлы к шаблонам, которые используются в стандартных компонентах системы без кастомизации этих компонентов.
По моей задумке к письму нужно добавить заголовок Add-File, а содержание этого заголовка должно быть таким
#CARD# - это путь к файлу на диске
card.jpg - это то как будет называться файл после прикрепления к письму
[spoiler]
Тогда в самом письме к прикрепленным файлам можно было бы обращаться вот так:
Или можно передать в заголовок письма Add-File одно поле, а в нем уже будут описаны все подключенные файлы в виде
Реализация
Битрикс отправляет письма при помощи функции bxmail описанной в файле \bitrix\modules\main\tools.php. Сама функция выглядит вот так
Чтобы перехватить данные перед самой их отправкой и подключить файлы нужно всего лишь объявить функцию и именем custom_mail.
В первом приближении она должна повторять функционал того что идет после нее в функции bxmail чтобы не нарушать работу системы после ее объвления.
Немного о том, как прикрепить файл к письму
Для этого нужно обычное письмо преобразовать в письмо, состоящее из нескольких сущностей. Тип письма определен в заголовке Content-Type.
Разделитель это то, что отделяет одну часть письма от другой в теле сообщения. При этом тело сообщения должно выглядеть примерно так:
Учитывая все вышесказанное не сложно написать функцию, которая преобразует формат письма перед отправкой.
Кода получилось немного. Его можно просто скопировать в файл bitrix\php_interface\init.php
Или скопировать в отдельный файл /bitrix/php_interface/include/classes/custom_mail.php и подключать его только когда происходит событие отправки письма.
Тогда в файл bitrix\php_interface\init.php можно написать вот так.
В итоге для подключения файла к письму достаточно в письмо вставить строку
Преимущества: Можно подключать файлы из почтового шаблона.
Недостатки: Каждое письмо будет дополнительно обрабатываться перед отправкой
В интернете нашел вот этот пост
И вот этот модуль
Решение описанное в первом блоге мне понравилось, но хотелось бы управлять прикреплением файлов из шаблона письма. Это позволило бы добавить файлы к шаблонам, которые используются в стандартных компонентах системы без кастомизации этих компонентов.
По моей задумке к письму нужно добавить заголовок Add-File, а содержание этого заголовка должно быть таким
#CARD#=>card.jpg; #CARD2#=>card2.jpg; |
#CARD# - это путь к файлу на диске
card.jpg - это то как будет называться файл после прикрепления к письму
[spoiler]
Тогда в самом письме к прикрепленным файлам можно было бы обращаться вот так:
<img src="card.jpg" border="0" alt=""> <img src="card2.jpg" border="0" alt=""> |
Или можно передать в заголовок письма Add-File одно поле, а в нем уже будут описаны все подключенные файлы в виде
/var/www/html/img/1.jpg=>card.jpg; /var/www/html/img/2.jpg=>card2.jpg; |
Реализация
Битрикс отправляет письма при помощи функции bxmail описанной в файле \bitrix\modules\main\tools.php. Сама функция выглядит вот так
function bxmail($to, $subject, $message, $additional_headers="", $additional_parameters="" ) {
if(function_exists("custom_mail" ))
return custom_mail($to, $subject, $message, $additional_headers, $additional_parameters);
if($additional_parameters!="" )
return @mail($to, $subject, $message, $additional_headers, $additional_parameters);
return @mail($to, $subject, $message, $additional_headers);
} |
Чтобы перехватить данные перед самой их отправкой и подключить файлы нужно всего лишь объявить функцию и именем custom_mail.
В первом приближении она должна повторять функционал того что идет после нее в функции bxmail чтобы не нарушать работу системы после ее объвления.
function custom_mail ($to, $subject, $message, $additional_headers, $additional_parameters) {
if($additional_parameters!="" )
return @mail($to, $subject, $message, $additional_headers, $additional_parameters);
return @mail($to, $subject, $message, $additional_headers);
} |
Немного о том, как прикрепить файл к письму
Для этого нужно обычное письмо преобразовать в письмо, состоящее из нескольких сущностей. Тип письма определен в заголовке 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');
}
} |
В итоге для подключения файла к письму достаточно в письмо вставить строку
Преимущества: Можно подключать файлы из почтового шаблона.
Недостатки: Каждое письмо будет дополнительно обрабатываться перед отправкой