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

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.

Теги

 

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

Gmail — сообщение не было зашифровано

Отправляю с корпоративного почтового сервера письма на Gmail с использованием TLS, а они помечаются красным значком "Без шифрования" и хинтом: Сообщение не было зашифровано.

Теги