Перейти к основному содержанию

hMailServer — вырезаем текст из письма 2

hmailserver

В прошлом году написал статью, как вырезать текст из письма:

hMailServer — вырезаем текст из письма

Иногда требуется вырезать кусок лишнего текста, это может быть:

  • ненужный рекламный блок
  • нежелательный футер
  • чувствительная информация в виде номеров банковских карт или баланс счёта
  • любая другая ненужная информация, от которой нужно избавиться

Всё было прекрасно до определённого момента, пока отправитель не изменил HTML тело письма. В письмо была вставлена какая-то кривая картинка, которую COM API сервера не смог распознать. Всё как здесь:

https://github.com/hmailserver/hmailserver/issues/28

Разработчик hMailServer исправил ошибку, но она выстрелила снова. Симптомы следующие:

Если мы просто получаем письмо, или переадресуем его, то всё проходит успешно. Но стоит вызвать собственную функцию и попытаться получить oMessage.HTMLBody, то письмо считывается не полностью, код обрывается на середине. Мы просто теряем возможность работать с HTML телом письма. Если бы в письме сообщение дублировалось через PLAIN TEXT, то можно было бы работать с ним, однако, у нас чистый HTML.

Если мы вызываем такую функцию, то проблем нет:

Sub MailFabric(oMessage)
	if oMessage.HasBodyType("text/html") then
		dim x
		'что-то своё делаем, не трогая письмо
	end if
	oMessage.Save
End Sub

Как только мы получаем oMessage.HTMLBody и перезаписываем, то всё плохо:

Sub MailFabric(oMessage)
	if oMessage.HasBodyType("text/html") then
		oMessage.HTMLBody = oMessage.HTMLBody
	end if
	oMessage.Save
End Sub

Бубен не помог, будем добавлять танцы.

Скрипт для вырезания текста из сообщения

Раз наше COM API не работает в плане получения текста HTML, то будем писать своё. В этом нам поможет переменная oMessage.Filename, в которой содержится путь к EML файлу письма. Зная путь, мы можем сами открыть файл, распарсить его и получить вожделенный HTML. Исправим его и засунем обратно в письмо. Приступим.

Включаем скрипты: Настройки → Дополнительно → Скрипты.

mail

Сохранить.

Кнопка Показать откроет директорию с файлом скриптов. По умолчанию это C:\Program Files (x86)\hMailServer\Events\EventHandlers.vbs. Редактируем файл EventHandlers.vbs. Следует помнить, что после внесения изменений в файл нужно нажать кнопку Перезагрузить, при этом изменения внесутся в память hMailServer. Кнопка Проверка проверяет код на наличие ошибок.

Добавляем код:

 
EventHandlers.vbs

Здесь:

  • MailClean — функция удаления ненужного текста из тела письма
  • oMessage.RefreshContent() — не обязательная вещь, перечитывает содержимое письма в COM API объект.
  • TakeHTMLFromEML — функция для вытаскивания из EML тела письма, часть данных я стираю
  • Base64Decode — тело письма оказалось закодировано в Base64, декодер
  • Stream_BinaryToString — вспомогательная функция для декодирования, обратите внимание на кодировку внутри
  • StrConvert — вспомогательная функция для конвертации текста, нужна для поддержки кириллицы
  • MyPattern — регулярное выражение для поиска ненужной строки, разное, в зависимости от типа письма

Стоит обратить внимание на работу с кодировками, особенно если требуется работать с кириллицей. И не забывайте о том, что письмо может быть текстовым или HTML. TakeHTMLFromEML — здесь можно было бы использовать регулярное выражение для поиска Base64, но я пошёл по более простому пути, мне нужно было изменить только один шаблон письма от одного отправителя.

Пример настройки ящика

Настроим ящик cleantest@internet-lab.ru, Переключаемся на вкладку правила.

hmail

Добавляем новое правило, у меня уже добавлено, назвал его: "CleanTest".

hmail

Какой добавлять критерий — решать вам. Если нужно обрабатывать все сообщения, указываем Размер сообщения > 0. Если нужно чистить письма только от определённого отправителя или получателя — указываем соответствующий адрес. Критериев может быть несколько.

Добавляем действие "Выполнить скрипт".

mail

Выполняем скрипт MailClean. Сохраняем изменения. P.S. VBS скрипт у меня сохранён в UTF-8. Без BOM.

Конец

Данный пример — не панацея от всех бед. Но на конкретном примере мы показали, что некоторые недоработки COM API в hMailServer мы можем обойти, использую свои собственные руки. Очень жаль, что разработчик hMailServer почти не занимается разработкой. На форуме есть предложение взять управление эти бесплатным сервером в свои руки. В любом случае, код доступен на GitHub.

Теги

 

Похожие материалы

Cisco ESA C190 — установка второго блока питания

Cisco ESA C190 поставляется по умолчанию с одним блоком питания. С точки зрения эксплуатации и системного администрирования это не очень удобно. Если есть возможность, то лучше заказать второй блок питания.

Яндекс 360 для бизнеса станет платным

С 17 апреля 2023 года бесплатная версия Яндекс 360 для бизнеса будет отключена. Если ваша организация пользуется бесплатной версией или имеет задолженность по оплате, некоторые возможности сервисов будут ограничены.

Теги