Mit der freundlichen Hilfe von Benoît Panizzon auf der MIMEDefang-Mailingliste habe ich herausgefunden, dass ich inet
stattdessen unix
den Listening-Socket verwenden muss, damit er den TCP-Port auf dem angegebenen lokalen oder Remote-Host überwacht . Das Setup-Verfahren für MIMEDefang unter Debian / Ubuntu ist also:
- Installieren Sie MIMEDefang:
apt install mimedefang
- Im
/etc/default/mimedefang
Set (benutze einen anderen Port wenn du willst):SOCKET=inet:33333
- Hinzufügen zu
/etc/postfic/main.cf
:
smtpd_milters = inet:localhost:33333
milter_default_action = accept
- Kopieren Sie sie
/etc/mimedefang-filter
nach /etc/mail/mimedefang-filter
und ändern Sie sie entsprechend Ihren Anforderungen (Sie müssen sie nicht ausführbar machen).
- Postfix- und MIMEDefang-Dienste neu laden:
sudo systemctl reload postfix mimedefang
MIMEDefang muss bei jedem Wechsel neu geladen werden mimedefang-filter
.
Übrigens vermittelt diese Präsentation ein gutes Verständnis von MIMEDefang: https://www.mimedefang.org/static/mimedefang-lisa04.pdf
Das aktuell ausgeführte Perl-Skript befindet sich in /usr/bin/mimedefang.pl
dem dann auch enthalten ist mimedefang-filter
.
Ich wollte auch in der Lage sein, meine Filterlogik in PHP anstelle von Perl zu schreiben , deshalb kam ich auf die folgende Lösung. Fügen Sie dies zum Ende von z. die filter_begin
Funktion in mimedefang-filter
:
%passToPhp = ("Sender", $Sender, "Recipients", \@Recipients, "Subject", $Subject, "RelayAddr", $RelayAddr, "RelayHostname", $RelayHostname, "Helo", $Helo, "QueueID", $QueueID, "MessageID", $MessageID);
my $cmd = "/path/to/your/email-filter.php";
$cmd .= " " . encode_base64(encode_json(\%passToPhp), '');
my $phpOutput = `$cmd`;
md_syslog('info', "PHP filter output: $phpOutput"); #causes entry in /var/log/mail.log
if ($phpOutput eq "bounce") {
action_bounce("We dont want this particular message.");
} elsif ($phpOutput eq "discard") {
action_discard();
}
Verwenden Sie dann den folgenden Code, email-filter.php
um loszulegen:
#!/usr/bin/php
<?php
// runs as user "defang". This file must have execute permissions.
// Get variables from mimedefang that we passed along, headers, raw message, and extra information from mimedefang
$arguments = ($argv[1] ? base64_decode($argv[1]) : null);
if ($arguments) $arguments = json_decode($arguments, true);
$headers = file_get_contents('HEADERS');
$raw_message = file_get_contents('INPUTMSG');
$commands = file_get_contents('COMMANDS');
// Get all the MIME parts into an array
$mimeparts = [];
chdir('./Work');
foreach (glob('*') as $mimepart_file) {
if (is_dir($file)) continue;
$mimeparts[$mimepart_file] = file_get_contents($mimepart_file);
}
// Do all your logic here...
if ($someLogic == 'spam') {
echo 'discard';
// echo 'bounce'; //use this line if you want to have a bounce message sent back to sender (but you probably don't want that for spam)
}
Überwachen Sie, /var/log/mail.log
ob alles ordnungsgemäß funktioniert.