Protokollieren zurückgewiesener Nachrichten in einer Datenbank (Postfix mit virtuellen Domänen/Benutzern)

Protokollieren zurückgewiesener Nachrichten in einer Datenbank (Postfix mit virtuellen Domänen/Benutzern)

Wir haben eine Postfix-Installation mit einigen virtuellen Domänen, jede mit virtuellen Benutzern. Diese Domänen und Benutzer werden mithilfe einer MySQL-Datenbank zugeordnet. Bisher habe ich Bounces verfolgt, indem ich die Postfix-Protokolldatei analysiert habe. Ich vermute, dass es bessere und effizientere Möglichkeiten dafür geben muss. Mir sind drei eingefallen, aber ich bin mir nicht sicher, welche die beste ist:

  1. Schreiben Sie einen Postfix-Inhaltsfilter, der die Bounces protokolliert und die E-Mail wegwirft
  2. Verwenden Sie Procmail – aber ich bin nicht sicher, wie Procmail mit virtuellen Benutzern funktionieren würde, für die kein $HOME definiert ist
  3. Schreiben Sie ein Skript, das E-Mails aus Postfächern als POP-Nachrichten versendet, sie analysiert und protokolliert und die zurückgewiesenen E-Mails löscht.

Ich würde mich über Ratschläge freuen, was aus Wartungssicht am besten und aus Sicht der Einsparung von Serverressourcen am effizientesten wäre. Danke

Antwort1

Dabei wird davon ausgegangen, dass Sie Informationen zu zurückgewiesenen E-Mails und nicht die zurückgewiesene E-Mail selbst erfassen möchten:

Ich habe so ziemlich das gleiche Setup mit Postfix, MySQL und virtuellen Hosts. Aus Sicht der Hardwareressourcen ist es am effizientesten, die Protokolldateien so zu analysieren, wie Sie es tun. Wenn Sie jedoch der Meinung sind, dass Ihre Analyse zu viel Aufwand bedeutet, können Sie eine Anwendung wie Logwatch verwenden, die die gesamte Analyse für Sie übernimmt. Richten Sie dann Postfix so ein, dass die zurückgewiesenen Dateien für Sie gelöscht werden.

Wenn Sie nun entscheiden, dass Sie diese E-Mails tatsächlich irgendwo sammeln möchten, können Sie diese Einstellungen in der Datei main.cf verwenden:

bounce_notice_recipient = [email protected]
error_notice_recipient = [email protected]

Und wenn Sie möchten, dass die E-Mails vollständig vernichtet werden, können Sie einen virtuellen Benutzer hinzufügen und Ihre Alias-Datei anpassen, um sie an dev/null zu senden.

someone: /dev/null

Was ein Skript und eine Datenbank angeht, arbeite ich heutzutage viel mit PHP und MySQL. Wenn ich diese Tools verwenden würde, könnte ich also PHP-Code erstellen, um die Protokolldatei einzulesen, nach Bounces zu suchen und sie dann in eine Datenbank einzutragen. Dann würde ich den Code ausführen, bevor das Mail.log abgeschnitten wird. Tatsächlich werde ich den Code hier posten, nachdem ich ihn aus Spaß geschrieben habe.

Hier ist etwas Code, falls Sie dies mit PHP/MySQL ausführen möchten (ich bin sicher, es ginge schöner):

<?php
#parse_logs.php
# load local file into array
$val = file("mail.log");

$pattern = '/status=bounced/';

foreach ($val as &$value) {
if (preg_match($pattern,$value)) {
        $a = split('[<>]', $value);

       //if you prefer you can also use: preg_match_all('/<(.*)>/', '$value', $matches);
       #can be helpful to print the following to the screen during tests
       # echo $a[1];

        // Make a MySQL Connection
        mysql_connect("localhost", "username", "password") or die(mysql_error());
        mysql_select_db("postfix_db") or die(mysql_error());

        // Insert a row of information into the table "example"
        mysql_query("INSERT INTO emails (emailaddress) VALUES('$a[1]') ") 
        or die(mysql_error());  

        #again, if you want to see while running manually from cli
        #echo "Data Inserted!";

}
#again, if you want to see while running manually from cli
#echo "\n";
}

?>

Sie können dann einen Cron auslösen, direkt bevor Ihr Mail-Log wiederverwendet wird, oder das Protokoll löschen, nachdem der Cron ausgelöst wurde.

Es scheint ein großer Aufwand zu sein, die E-Mail-Adressen zurückgewiesener E-Mails im Auge zu behalten. Sie müssen natürlich MySQL-Abfragen schreiben, um dann auf diese Informationen zuzugreifen.

Sie können den MySQL-Kram auch ganz überspringen und die Ergebnisse einfach an eine Testdatei oder eine E-Mail-Adresse weiterleiten (und Sie können auch einen Cron verwenden).

php parse.php > results.txt

oder

php parse_logs.php | /usr/sbin/sendmail [email protected]

Antwort2

Ich habe kein Beispiel, da ich es noch nie versucht habe, aber Sie könnten syslog-ng verwenden (je nach Plattform) und einen Filter erstellen. filter hat eine Option, um eine Regex-Übereinstimmung mit der Nachricht selbst durchzuführen. Sie müssten sie nur an ein bestimmtes Ziel senden, dieses Ziel wäre MySQL. Eine schnelle Suche wird Ihnen sagen, wie Sie syslog-ng für MySQL einrichten, und mit ein paar Anpassungen erhalten Sie wahrscheinlich einen Filter, den Sie an dieses Ziel senden können.

Antwort3

Sie können Bounce-Benachrichtigungen an ein Skript weiterleiten. Nur als Überblick, wie Sie es implementieren können:

/etc/postfix/main.cf

notify_classes = bounce, 2bounce, resource, software
[email protected]
[email protected]

/etc/postfix/transport

[email protected]     bouncepipe:

/etc/postfix/master.cf

bouncepipe   unix  -       n       n       -       -       pipe
      flags=DRhu user=list argv=/etc/postfix/bouncepipe.pl

/etc/postfix/bouncepipe.pl

#!/usr/bin/perl                                                                                                                                                                                                                                                                       

my $message = '';
my $sender = '';
my $recipient = '';

foreach $line ( <STDIN> )
{
    $message .= $line;
    chomp( $line );
    if ( $line =~ /Final-Recipient: /)
    {
        my $index = index($line, ';');
        $recipient = substr($line, $index+2);
    }
    if ( $line =~ /X-Postfix-Sender: /)
    {
        my $index = index($line, ';');
        $sender = substr($line, $index+2);
    }
}
# Do whatever you need to do with $sender and $recipient

verwandte Informationen