Почтовый шлюз: задание со звёздочкой (Обратная связь и переобучение системы)
Антиспам - это конечно хорошо, но это всего лишь тупой робот с набором правил. Ошибки в настройке случаются и у наших корреспондентов.
Типовая ситуация: юзеру лень писать тему в письме из 2х pdf'ок. Антиспам про лень юзера ничего не знает и видя отсутствие Subject'а - задирает ему итоговый балл.
Ещё пример: секретарша Марина херачит рассылку на всех 200 клиентов компании одним письмом. Может ей домой побыстрее надо, или курить - не важно, получается письмо с 200 адресами. Антиспам опять отреагирует в меру своего разумения: задерёт балл такому письму.
Репутация доменов
Так вот, чтобы такого не случалось - можно привлечь к переобучению системы самих пользователей, причём не требуя от них ничего сверх их обычной работы - писать письма и отвечать на них.
Логика такая: если юзер регулярно пишет почту на какой-нибудь домен - давать этому домену определённый бонус на антиспаме. Если писать перестал - через какое-то время удалять.
Вот небольшой скриптик, который на основе логов exim'а ведёт базу "хороших" доменов, по окончании работы выгружая результат в файлик, который может быть использован в качестве domainlist'а exim'а.
Запускать в самом конце дня, но перед ротацией логов. Схему sqlite-базы смотри в самом файле, в конце. Все настройки - в начале скрипта.
Останется в антиспаме добавить правило, которое будет искать заголовок X-Known-Domain
и реагировать соответственно.
Настройки exim'а смотри ниже.
Хранилище спама
Для удобства обслуживания и контроля работы неплохо бы периодически мониторить систему в части "какие письма попадают в спам". Здесь показывается, как донастроить exim, что он откладывал копию подозрительных писем в отдельный ящик.
В данном случае ящик в виде стандартного maildir находится на пересылающем сервере. К нему можно подцепиться mutt'ом или отдавать по pop3/imap через dovecot наружу. Это очень удобно -- в почтовом клиенте рядом с "рабочей" просто заводится вторая учётка. С утра проглядел "улов" за ночь, если надо - поправил настройки, Ctrl-A, Del.
В секцию с роутерами. Порядок роутеров важен, так что их нужно вставить ДО роутера, который непосредственно доставляет почту.
no_verify
- не проверять получателя, unseen
- продолжать поиск роута дальше.
# отлавливаем подозрительное для последующего разбора
# с этим роутом совпадает всё, что а) идёт в нашу сторону, б) мы посчитали спамом в check_data
gw_possible_spam:
driver = manualroute
condition = ${if eq{$header_x-spam-status:}{Yes} {yes}{no}}
domains = +our_domains
route_list = * localhost
transport = spamarchive
no_verify
unseen
# отлавливаем заведимо "хорошие" письма (ham), с ограниченного набора хостов, для обучения байеса
gw_certainly_ham:
driver = manualroute
condition = ${if match_ip{$sender_host_address}{+relay_from_hosts} {yes}{no}}
condition = ${if match_domain{$sender_address_domain}{+our_domains} {yes}{no}}
condition = ${if <{$message_body_size}{512K} {yes}{no}}
domains = !+our_domains
route_list = * localhost
transport = hamarchive
no_verify
unseen
В секцию с транспортами:
hamarchive:
driver = appendfile
user = spamarchive
group = spamarchive
create_directory = true
maildir_format = true
directory = /usr/home/spamarchive/ham/
spamarchive:
driver = pipe
user = spamarchive
group = spamarchive
delivery_date_add
envelope_to_add
command = /usr/lib/dovecot/deliver -d spamarchive -f $sender_address
temp_errors = 64 : 69 : 70 : 71 : 72 : 73 : 74 : 75 : 78
log_output
Последний тоже можно заменить на appendfile
, но я предпочитаю отдать его dovecot'у с sieve.
Тот же dovecot потом используется для копания в архиве по imap'у, и управления правилами sieve.