Pull to refresh

Amavis::Custom — раскрась сам

Reading time2 min
Views8.5K
  amavisd-new является достаточно широко распространенным продуктом для кормления с рук spamassassin-а и clamav-а. Не смотря на это, некоторые возможности настройки освещены явно недостаточно. По крайней мере, автор уже раздумывал про написание собственной заплатки, пока случайно не наткнулся в коде на хук Amavis::Custom.
  Началось всё с того, что потребовалось пропускать все проверки в amavisd. Это просто сделать при известном отправителе либо получателе или разделяя по банкам на основе портов. Задача становится менее тривиальной если сигналом служит какой-либо заголовок уже принятого для проверки электронного сообщения. Вот тут-то (и в массе других случаев) в дело вступает Amavis::Custom

  Судя по документации из файла примера, пользовательские прищепки(?) доступны с версии amavisd-new-2.5.0 и позволяют внедрятся на нижеуказанных этапах:

Последовательность обработки сообщения

# получили письмо, разобрали, собрали основную информацию
# *custom hook: new() — можно просмотреть начальные данные, загрузить банки, выставить некоторые параметры
# проверка письма, присвоение оценок
# *custom hook: checks() — вызывается после проверок на спам и вирусы но до решения о дальнейшей судьбе письма. Тут можно играть с оценками
# решение о судьбе письма (поиски в *_lovers, пороговые значения, ...)
# помещение в карантин
# рассылка уведомлений (админам, получателям)
# *custom hook: before_send() — можно отсылать собственные уведомления, организовывать карантин, изменять сообщениеmodify mail
# пересылка (если не заблокированно)
# *custom hook: after_send() — можно подавлять DSN, слать отчёты
# отправка DSN (когда надо)
# запись логов, статистики
# *custom hook: mail_done() — may inspect results (не уловил смысла)

  В комплектном примере приводится значительный кусок кода для расширения сознания. Автору же требовалось совсем немого. В результате недолгих размышлений в amavisd-custom.conf попали следующие буквы:

# try to skip checks if already marked as spam
package Amavis::Custom;
use strict;
sub new {
  my($class,$conn,$msginfo) = @_;
  my($self) = bless {}, $class;
 
  for my $curr_head (@{$msginfo->orig_header}) {
    if ($curr_head =~ /^X-SpamTest-Status: spam/i) {
      for my $r (@{$msginfo->per_recip_data}) {
        $r->bypass_spam_checks(1);
        $r->bypass_banned_checks(1);
      }
    }
  }
  $self;
}
Tags:
Hubs:
Total votes 4: ↑4 and ↓0+4
Comments0

Articles