Postfix bietet per default nur eine globale Einstellung zur Limitierung der Größe von Nachrichten. Manchmal braucht man das aber etwas granularer. Um das zu realisieren kann man „Policy-Delegation“ nutzen, wodurch Postfix Entscheidungen an einen externen Policy-Server weiterreichen kann. Siehe auch.
Um die Anforderung „message_size_limit pro Domain“ umzusetzen braucht es nicht viel – ein paar Zeilen Perl reichen:
#!/usr/bin/env perl
#
# Ein simpler Policy-Server für Postfix, der message_size_limit pro Domain
# implementiert.
use strict;
# Hier ist die Definition der Domains mit Limit (in Bytes)
my %hashConfig = (
"marco-pc-debian.localdomain" => 75,
"example.org" => 1024,
);
my $action;
my %attr = ();
while( <STDIN> ) {
if( /([^=]+)=(.*)\n/ ) {
$attr{$1} = $2;
} elsif( $_ eq "\n" ) {
$action = "action=OK";
foreach my $domain (keys%hashConfig) {
if( $attr{'recipient'} =~ /${domain}$/ ) {
if( $attr{'size'} > $hashConfig{$domain} ) {
$action = "action=534 message size for this domain is limited to ".$hashConfig{$domain};
}
last;
}
}
print $action."\n\n";
exit( 0 );
}
}
Das Skript liest alle Wertepaare ein, die es von Postfix übergeben bekommt und prüft dann ob die Nachricht das definierte Limit für die Empfänger-Domain überschreitet oder nicht. Die Standardaktion für Domains die nicht in der Liste auftauchen ist „OK“, das heißt es greift nur das globale Limit.
Um das Skript in Postfix zu integrieren sind 2 Anpassungen in der Postfix-Konfiguration nötig. Als erstes muss der Dienst in der master.cf definiert werden (Pfad und ggf. User entsprechend anpassen):
$ cat <<EOF >> /etc/postfix/master.cf
> policy unix - n n - 0 spawn
> user=nobody argv=/usr/local/bin/postfix_policy_server.pl
>EOF
Danach kann man den Check in der main.cf hinzufügen:
smtpd_end_of_data_restrictions = check_policy_service unix:private/policy
Nach einem Neustart des Postfix wirkt das neue Limit.