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

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

hmailserver

Задачку мне подкинули, вырезать из входящего письма часть текста. Задачка обычная, иногда требуется вырезать кусок лишнего текста, это может быть:

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

В hMailServer есть возможность писать собственные скрипты. Напишем такой скрипт, который регулярным выражением будет находить какой-то текст и вырезать его. Таким же способом можно не вырезать текст, а заменять его другим.

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

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

mail

Сохранить.

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

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

  • Public oApp
    Public Const user = "Admin"
    Public Const pwd = "MySuperPuperPa$$word"
    
    Sub MailClean(oMessage)
    	'объект для работы с приложением hMailServer
    	set oApp = CreateObject("hMailServer.Application")
    	call oApp.Authenticate(user, pwd)
    
    	dim MyPattern, objRegExp
    
    	'регулярное выражение для вырезания строки из тела письма
    	MyPattern = "Ваш баланс [0-9]\d*,[0-9]{1,2}\."
    
    	'мы пишем здесь на UTF-8, а hMailServer работает с ISO-8859-1, переводим нашу регулярку в другую кодировку
    	MyPattern = StrConv(MyPattern,"UTF-8","ISO-8859-1")
    
    	'объект для регулярного выражения [Global = True] ищет все вхождения, если нужно вырезать только первое, сто ставим false
    	Set objRegExp = CreateObject("VBScript.RegExp")
    	objRegExp.Pattern = MyPattern
    	objRegExp.Global = True
    
    	'если письмо в HTML, то правим oMessage.HTMLBody
    	if oMessage.HasBodyType("text/HTML") then oMessage.HTMLBody = objRegExp.Replace(oMessage.HTMLBody, "")
    
    	'если письмо текстовое, то правим oMessage.Body
    	if oMessage.HasBodyType("text/plain") then oMessage.Body = objRegExp.Replace(oMessage.Body, "")
    
    	oMessage.Save
    End Sub
    
    Function StrConv(Text,SourceCharset,DestCharset)
    	Set Stream=CreateObject("ADODB.Stream")
    	Stream.Type=2
    	Stream.Mode=3
    	Stream.Open
    	Stream.Charset=DestCharset
    	Stream.WriteText Text
    	Stream.Position=0
    	Stream.Charset=SourceCharset
    	StrConv=Stream.ReadText
     End Function

hmail

Здесь:

  • oApp — объект для hMailServer.Application, вынесен в глобальные для использования в других функциях
  • user — администратор hMailServer, вынесен в глобальные для использования в других функциях
  • pwd — пароль администратора hMailServer, вынесен в глобальные для использования в других функциях
  • MailClean — функция удаления ненужного текста из тела письма
  • StrConvert — вспомогательная функция для конвертации текста, нужна для поддержки кириллицы
  • MyPattern — регулярное выражение для поиска ненужной строки

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

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

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

hmail

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

hmail

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

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

mail

Выполняем скрипт MailClean. Сохраняем изменения.

Конец

На этом всё, самое сложное было разобраться с кодировками. Для дебага я записывал в файл промежуточные данные и смотрел какие кодировки получаются. Код дебага был в три раза больше итоговой функции.

P.S. VBS скрипт у меня сохранён в UTF-8.

Теги

 

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

Тестовый вирус EICAR

Для проверки антивирусов существует специальный тестовый командный файл eicar.com. Файл не содержит фрагментов вирусного кода, поэтому его безопасно пересылать. Большинство антивирусов реагируют на него как на вирус, обычно указывая соответствующее название, к примеру EICAR-AV-Test.

Теги