amavisd-new: Dedizierte Policy in Abhängigkeit von Headern

Eine der ärgerlichsten Sachen, wenn man Mails noch während des SMTP-Dialogs auf Spam und Viren filtert, ist ganz klar, daß man das ja auch für Mails von Mailing-Listen tut. Und wenn man da zu oft Mails ablehnt, dann fliegt man relativ schnell von der Liste runter. Nun sind solche Mails meistens durch das Vorhandensein von speziellen Headern gekennzeichnet, z.B:

Precedence: list

Will man nun vermeiden, von einer Mailingliste zu fliegen, wenn dort zuviel Spam an Start ist, dann kann man sich natürlich als erstes Mal eine Policy-Bank definieren (dazu hatte ich hier was geschrieben), die Spam und Viren nicht hart ablehnt, sondern einfach wegwirft und/oder in eine Quarantäne schmeißt. Das könnte mit amavisd-new z.B. so aussehen:

# additional policy bank for incoming mailing lists
$policy_bank{'PREQ-LOWPRECEDENCE'} = {
  final_spam_destiny => D_DISCARD,
  final_virus_destiny => D_DISCARD,
  spam_quarantine_method => 'sql:',
  virus_quarantine_method => 'sql:',
};

Wenn also die obige Policy aktiviert würde (und damit die vordefinierten Werte überschreibt), dann würden Mails und Viren verworfen und in einer SQL-Datenbank abgespeichert, die der Benutzer dann z.B. über ein Webinterface kontrollieren kann. Das Problem an der Sache ist nur: Wie kriege ich diese Policy aktiviert?

Hier hat Alexander Wirt, auch bekannt als „formorer”, in knapp 10 Minuten eine Lösung in Form eines sog. „custom packages” für amavisd-new entworfen:

package Amavis::Custom;
use strict;

BEGIN {
        import Amavis::Conf qw(:platform :confvars c cr ca $myhostname);
        import Amavis::Util qw(do_log untaint safe_encode safe_decode);
        import Amavis::rfc2821_2822_Tools;
        import Amavis::Notify qw(build_mime_entity);
}

sub new {
        my($class,$conn,$msginfo) = @_;
        my($self) = bless {}, $class;


        my $low_precedence = 0;

        foreach my $line (@{$msginfo->{'orig_header'}}) {
                $line =~ s/\n    / /g;
                $low_precedence = 1 if $line =~ m/^Precedence:\s+(bulk|list|junk)/i;
        }

        if ($low_precedence) {
                do_log(2, sprintf("Load low precedence policybank"));
                Amavis::load_policy_bank('PREQ-LOWPRECEDENCE')
        }
        return $self;
}

1;  # insure a defined return

Diese Datei legt man dann bei Debian z.B. einfach unter /etc/amavis/conf.d/60-low-precedence.conf ab, startet amavisd-new neu und freut sich. Und natürlich kann man das ganze auf beliebige andere Header erweitern.

Danke, formorer!