Модифицируем заголовки в email сообщениях. Демо-версия
Запись от 30.11.2016
Случилось так, что отправляемые файлы в CEvent::Send() почтовики пытаются показать инлайном, то есть в теле письма.
Например, если отправляется txt, csv или даже xls файлы, то эти вложения, скорее всего, появятся в теле письма. Но проблема в том, что некоторые из них, если весь контент вложения умещается в тексте письма не показывают списка прикрепленных файлов и не дают его скачать.
Если разобраться подробнее, то выяснится, что современные email-сообщения, как правило, состоят из множества сущностей (entity) типа mime. Обычно у таких писем есть служебный заголовок MIME-Version: 1.0. Каждая сущность относится к своей части письма. Например, для текстовых частей это text/plain или text/html, а для вложений уже определенные типы соответствующих файлов, например image/png или application/excel.
А проблема в том, что в CEvent::Send() сгенерированные текстовые файлы определяются как text/html, что и приводит к описанной выше проблеме.
Я нашел два решения этой проблемы:
Остается второй вариант, и тут нам поможет обработка событий.
На мой взгляд, получилось не совсем тривиально, поэтому сохраню обработчик тут.
Конкретно этот меняет заголовок у файлов xls с text/html на тип, который не будет читаться почтовиками и откроется в Excel-е.
Например, если отправляется txt, csv или даже xls файлы, то эти вложения, скорее всего, появятся в теле письма. Но проблема в том, что некоторые из них, если весь контент вложения умещается в тексте письма не показывают списка прикрепленных файлов и не дают его скачать.
Если разобраться подробнее, то выяснится, что современные email-сообщения, как правило, состоят из множества сущностей (entity) типа mime. Обычно у таких писем есть служебный заголовок MIME-Version: 1.0. Каждая сущность относится к своей части письма. Например, для текстовых частей это text/plain или text/html, а для вложений уже определенные типы соответствующих файлов, например image/png или application/excel.
А проблема в том, что в CEvent::Send() сгенерированные текстовые файлы определяются как text/html, что и приводит к описанной выше проблеме.
Я нашел два решения этой проблемы:
- Добавить к сущностям MIME относящимся к вложениям заголовок Content-Disposition: Attachment;
- Подменить тип файла сущности MIME.
Остается второй вариант, и тут нам поможет обработка событий.
На мой взгляд, получилось не совсем тривиально, поэтому сохраню обработчик тут.
Конкретно этот меняет заголовок у файлов xls с text/html на тип, который не будет читаться почтовиками и откроется в Excel-е.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('main', 'OnBeforeMailSend', 'onBeforeMailSendHandler');
function onBeforeMailSendHandler(\Bitrix\Main\Event $event) {
$arEventParams = $event->getParameters();
foreach($arEventParams as $iMailKey=>$arMailParams) {
if($arMailParams['HEADER']['X-EVENT_NAME'] === 'MAIL_TYPE_CODE') {
foreach($arMailParams['ATTACHMENT'] as $iAttacmentKey=>$arAttachment) {
$arFileData = pathinfo($arAttachment['NAME']);
if($arFileData['extension'] === 'xls') {
$arEventParams[$iMailKey]['ATTACHMENT'][$iAttacmentKey]['CONTENT_TYPE']
= 'application/vnd.ms-excel';
}
}
}
}
foreach($arEventParams as $iMailKey=>$arMailParams) {
$event->addResult(
new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS, $arMailParams
)
);
}
}