Модифицируем заголовки в email сообщениях. Демо-версия

Случилось так, что отправляемые файлы в CEvent::Send() почтовики пытаются показать инлайном, то есть в теле письма.
Например, если отправляется txt, csv или даже xls файлы, то эти вложения, скорее всего, появятся в теле письма. Но проблема в том, что некоторые из них, если весь контент вложения умещается в тексте письма не показывают списка прикрепленных файлов и не дают его скачать.

Если разобраться подробнее, то выяснится, что современные email-сообщения, как правило, состоят из множества сущностей (entity) типа mime. Обычно у таких писем есть служебный заголовок MIME-Version: 1.0. Каждая сущность относится к своей части письма. Например, для текстовых частей это text/plain или text/html, а для вложений уже определенные типы соответствующих файлов, например image/png или application/excel.

А проблема в том, что в CEvent::Send() сгенерированные текстовые файлы определяются как text/html, что и приводит к описанной выше проблеме.

Я нашел два решения этой проблемы:
  1. Добавить к сущностям MIME относящимся к вложениям заголовок Content-Disposition: Attachment;
  2. Подменить тип файла сущности 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
			)
		);
	}

}