Ich versuche, einen ungefähren Prozentsatz davon zu berechnen, wie viele E-Mails mein Mailserver für eine erfolgreiche Zustellung verarbeitet, im Vergleich dazu, wie viele E-Mails sofort gelöscht werden, weil sie von falsch konfigurierten Mailservern stammen, Spam usw. sind …
Ich habe zunächst die folgenden beiden Befehle im Verzeichnis /var/log/ ausgeführt (um Einträge im Maillog sowie ältere, herausrotierte Maillogs abzufangen):
grep "dsn=2.0.0, status=sent (delivered to maildir)" * | wc -l
7814
grep "NOQUEUE: reject: RCPT" * | wc -l
13338
Aber dann dachte ich, dass diese Einträge möglicherweise Duplikate enthalten (insbesondere die NOQUEUEs). Also habe ich den folgenden leicht modifizierten Befehl ausgeführt, um zu sehen, wie groß die Diskrepanz sein könnte.
grep "dsn=2.0.0, status=sent (250 2.0.0 from MTA(" * | wc -l
8839
Wenn ich mir meine Maillog-Einträge anschaue, bekomme ich mehrere NOQUEUE-Einträge für Zustellversuche. Aber ich denke, das liegt daran, dass die sendenden Mailserver manchmal mehrere Zustellversuche unternehmen. Beispiel:
Aug 10 10:48:24 mail postfix/smtpd[7159]: NOQUEUE: reject: RCPT from unknown[112.198.103.178]: 450 4.7.1 Client host rejected: cannot find your reverse hostname, [112.198.103.178]; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<112.198.103.178>
Aug 10 10:48:24 mail postfix/smtpd[7159]: NOQUEUE: reject: RCPT from unknown[112.198.103.178]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<112.198.103.178>
Aug 10 10:48:24 mail postfix/smtpd[7159]: NOQUEUE: reject: RCPT from unknown[112.198.103.178]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<112.198.103.178>
Aug 10 10:48:24 mail postfix/smtpd[7159]: disconnect from unknown[112.198.103.178]
Ich habe also zwei Fragen:
- Muss ich mir Sorgen machen, dass ich mit einem Grep von nur doppelte Einträge erwische
NOQUEUE: reject: RCPT
? - Gibt es eine bessere Methode, die ich beim Filtern dieser Protokolleinträge und Ermitteln der richtigen Zahlen in Betracht ziehen sollte?
grep "dsn=2.0.0, status=sent (delivered to maildir)" * | wc -l
Wie kann ich für jede erfolgreiche Zustellung eine eindeutige Zeile festlegen? Wenn wir uns den Unterschied ansehen,grep "dsn=2.0.0, status=sent (250 2.0.0 from MTA(" * | wc -l
können wir erkennen, dass es einen Unterschied gibt.
Antwort1
Dabei scheint es sich um separate Zustellversuche zu handeln und sie sollten daher auch als solche gezählt werden.
Da ich davon ausging, dass so etwas schon einmal behandelt wurde, habe ich mir das
munin
postfix_mailstats
Skript angesehen, wie es dort gemacht wird. Es handelt sich um ein Perl-Skript, daher sind die regulären Ausdrücke Perl-kompatibel:
Dies sind erfolgreiche Lieferungen:
/ to=.*, status=sent /
Dies sind Ausschussware:
/postfix\/smtpd.*proxy-reject: \S+ (\S+)/
/postfix\/smtpd.*reject: \S+ \S+ \S+ (\S+)/
/postfix\/cleanup.* reject: (\S+)/
Der erfasste Teil des regulären Ausdrucks (in Klammern) ist der Ablehnungscode, der angibt, wie die Nachricht abgelehnt wurde.
delivered to maildir
ist eine lokale Zustellung, das andere250 .* from MTA
eine Fernzustellung, also zwei unterschiedliche Zustellungsarten. Es ist also nicht verwunderlich, dass Sie für jede unterschiedliche Zahlen zählen.