|
|||||||||||||||||||||||||||||||||||
Автор: Mr. Black
|
Почтовый фильтр за 5 минут Спам не дает забыть о себе большинству пользователей интернета. Многие программеры озабочены решением проблемы спама. Среди них как известные производители ПО, так и индивидуальные кодеры, однако до сих пор не существует идеальное техническое решение, т. е. такой фильтр, который бы убивал весь спам, но пропускал все хорошие письма. Приходится искать и выбирать лучший для конкретного случая фильтр. Я тоже не предлагаю идеальное решение, но я подхожу к решению этой проблемы творчески и хочу поделиться своими соображениями. Любые программы имеют ограниченные возможности настройки. Если же мы пишем прогу сами, да еще на таком богатом высокоуровневыми функциями языке, как JavaScript, то возможности по изменению ее алгоритма практически безграничны. Изменать скрипт легко, и его не нужно компилировать, а можно сразу запускать. Работа со строкаим, массивами и регурарными выражениями в JavaScript не вызывает такого геморроя, как в С++. Остается, пожалуй, главный вопрос: как в JavaScript получать почту по протоколу POP3? ANPOP Components ANPOP - это набор из нескольких COM-компонентов для работы с РОР3, в т. ч. через SSL/TLS. Их можно использовать в программах на С++, VB, VBScript и JavaScript и в любых средах, поддерживающих COM и ActiveX. Одно неприятно: эти компоненты шароварные. Скачать их можно тут: http://www.emailarchitect.com/webapp/download/anpop.exe, вместе с ними устанавливается и документация. Разберем архитектуру ANPOP. Объект POPMAIN содержит методы для подключения к РОР3-серверу, отключения от него, получение списка писем, их размеров и, наконец, скачивания самих писем. Все письмо возвращается в виде одной строки, содержащей все заголовки и само письмо в том формате и той кодировке, в которой оно пришло. Для разбора письма (извлечения из него каждого заголовка и каждого вложения) нужен объект POPMSG. Объект MSGSTORE служит для управления почтовыми ящиками на локальной машине. Объекты Pop3Request и Pop3Queue используются для передачи заданий на скачивание писем от одного процесса или потока к другому. Вот, как все это работает.
Вот вам простейший шаблон почтового фильтра. Нужно еще каким-то образом получать письма почтовым клиентом, а не просто сохранять в папку. Тут есть два способа. Первый - нужен POP3-сервер, который будет брать EML-файлы из нашей папки. Второй - не удалять нужные письма с сервера, а спам удалять, а затем почтовым клиентом получить то, что не удалено. Сохранять в этом случае наш скрипт ничего не должен, хотя можно сохранять подозрительные письма, удаленные с сервера. О методах фильтрации спама. Самым простым и в то же время эффективным методом является метод Байеса. Суть его в том, что есть слова, которые встречаются в основном, в спаме, а есть слова, которых спамеру не знают. Нужен словарь, в котором будут записаны частоты вхождения различных слов в спаме и в хороших письмах. При получении письма нужно получить данные из словаря для всех слов, содержащихся в письме и на основании этих данных сделать вывод о том, как классифицировать это письмо. Словарь для каждого пользователя индивидуальный, поэтому его неоткуда взять в готовом виде. Словарь вначале пуст, но в процессе работы программы он должен пополняться. Говорят, что программа самообучается. Делается это так: если прграмма классифицировала письмо не тек, как вам того хотелось, вы выбираете команду "переклассифицировать", и новые данные заносятся в словарь. У этого метода есть рад недостатков, и самый очевидный из них в том, что учитываются только вхождения слов, а не их порядок. Одними и теми же словами можно сказать о разных вещах. Более сложный метод - метод шинглов. Из текста выбираются не отдельные слова, а более длинные подстроки (шинглы) по каким-то сложным правилам. Шинглы могут охватывать не весь текст или, наоборот, перекрываться. В словарь заносятся данные не по словам, а по шинглам. Поскольку шинглы длинные, обычно хранят не сами шинглы, а их хэшы. Наконец, самые навороченные методы разбирают текст на основе знания языка и понимают, о чем там говориться, а не высчитывают какие-то статистичесие характеристики. Подробнее читать тут: http://www.spamtest.ru/varticles.html?id=0036 - "Статистические (вероятностные) методы фильтрации спама" http://www.spamtest.ru/varticles.html?id=0032 - "Детектирование массовых рассылок на Яндекс.Почте" Работаем с реестром. Теперь о таких немаловажных деталях, как сохранение инфы, с которой работает наш скрипт. Сохранять нам нужно, главным образом, ту инфу, по которой мы фильтруем письма, например, частоты вхождения слов в спамерских и неспамерских письмах. Еще мы будем сохранять идентификаторы обработанных писем, чтобы не обрабатывать одни и те же письма несколько раз в том случае, если мы их не удаляем с сервера. Самым простым вариантом будет использование системного реестра. Специально для использования в скриптах в Windows существует объект Wscript.Shell, в котором есть функции для работы с реестром, ярлыками, специальными папками Windows и тд. Допустим, что частоты вхождения слова в спамерских и неспамерских письмах лежат в одном DWORD - значении, имя которого соответствует этому слову. Тогда процедура оценки текста может выглядеть так:
Число, которое возвращает эта функция, можно рассматривать как вероятность того, что данное письмо - спам. Теперь напишем процедуру переклассификации письма
Работаем с файлами Поскольку ни один метод фильтрации не совершенен, антиспамерский фильтр должен поддерживать черные и белые списки адресов, тем и фрагментов текста. Еще лучше, если в списках будут не просто подстроки, а регулярные выражения, тем более, что для этого в скрипте нужно изменить всего одну строчку. А храниться эти списки должны в файлах, потому что юзер должен их редактировать вручную. Для работы с файлами из скриптов в системе тоже есть обекты. Называется Scripting.FileSystemObject. Пусть в каждой строке файла будет по одному регулярному выражению. Напишем функцию, которая будет возвращать true, если заданная строка соответствует хотя бы одному выражению из списка.
И вот как может выглядеть обработка письма:
Заключение. Мы рассмотрели только простейший метод фильтрации, поэтому скрипты, представленные в этой статье, в исходном виде бесполезны, и это только шаблон, на основе которого Вы, сможете написать почтовый фильтр, который будет использовать Ваш метод. Кроме того, файлы и реестр не годятся для хранения больших баз данных. Данные можно хранить в MDB-файле, и работать с ними через объекты ADODB. Кроме анализа самого письма можно использовать данные RBL и WHOIS о хостах, через которые прошло письмо, если найдутся какие-нибудь ActiveX-оъекты для работы с этими службами. Скрипты из статьи
|
|
| ||||||||||||||||||||||||||||||||