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