Почтовый шлюз: задание со звёздочкой (Обратная связь и переобучение системы)

Антиспам - это конечно хорошо, но это всего лишь тупой робот с набором правил. Ошибки в настройке случаются и у наших корреспондентов.

Типовая ситуация: юзеру лень писать тему в письме из 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.

К оглавлению, Далее: Базовая настройка rspamd