
В прошлом году написал статью, как вырезать текст из письма:
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. Исправим его и засунем обратно в письмо. Приступим.
Включаем скрипты: Настройки → Дополнительно → Скрипты.
Сохранить.
Кнопка Показать откроет директорию с файлом скриптов. По умолчанию это C:\Program Files (x86)\hMailServer\Events\EventHandlers.vbs. Редактируем файл EventHandlers.vbs. Следует помнить, что после внесения изменений в файл нужно нажать кнопку Перезагрузить, при этом изменения внесутся в память hMailServer. Кнопка Проверка проверяет код на наличие ошибок.
Добавляем код:
Здесь:
- MailClean — функция удаления ненужного текста из тела письма
- oMessage.RefreshContent() — не обязательная вещь, перечитывает содержимое письма в COM API объект.
- TakeHTMLFromEML — функция для вытаскивания из EML тела письма, часть данных я стираю
- Base64Decode — тело письма оказалось закодировано в Base64, декодер
- Stream_BinaryToString — вспомогательная функция для декодирования, обратите внимание на кодировку внутри
- StrConvert — вспомогательная функция для конвертации текста, нужна для поддержки кириллицы
- MyPattern — регулярное выражение для поиска ненужной строки, разное, в зависимости от типа письма
Стоит обратить внимание на работу с кодировками, особенно если требуется работать с кириллицей. И не забывайте о том, что письмо может быть текстовым или HTML. TakeHTMLFromEML — здесь можно было бы использовать регулярное выражение для поиска Base64, но я пошёл по более простому пути, мне нужно было изменить только один шаблон письма от одного отправителя.
Пример настройки ящика
Настроим ящик cleantest@internet-lab.ru, Переключаемся на вкладку правила.
Добавляем новое правило, у меня уже добавлено, назвал его: "CleanTest".
Какой добавлять критерий — решать вам. Если нужно обрабатывать все сообщения, указываем Размер сообщения > 0. Если нужно чистить письма только от определённого отправителя или получателя — указываем соответствующий адрес. Критериев может быть несколько.
Добавляем действие "Выполнить скрипт".
Выполняем скрипт MailClean. Сохраняем изменения. P.S. VBS скрипт у меня сохранён в UTF-8. Без BOM.
Конец
Данный пример — не панацея от всех бед. Но на конкретном примере мы показали, что некоторые недоработки COM API в hMailServer мы можем обойти, использую свои собственные руки. Очень жаль, что разработчик hMailServer почти не занимается разработкой. На форуме есть предложение взять управление эти бесплатным сервером в свои руки. В любом случае, код доступен на GitHub.