Wir hatten in unserer Firma in letzter Zeit Probleme mit den Mails.
Einige Nachrichten wurden nicht weitergeleitet und wir wollten nun schauen, warum die Mails nicht beim Empfänger ankamen.
Aber durch das Logfile per Hand zu gehen ist echt eine Qual, ich wollte es nun versuchen mit Python zu parsen, da die Netzwerküberwachung, die ich mit Dango umgesetzt habe, ebenfalls auf Python basiert. Somit könnte man dieses Modul einfach in die Netzwerküberwachung einarbeiten.
Nun habe ich leider noch nie einen Parser geschrieben und versuche gerade in pyparsing die Grammatik auf die Beine zu stellen.
Hier mal ein Ausschnitt aus dem Logfile, es werden nur die Zeilen mit der message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de betrachtet. Da das Logfile über 25 MB groß ist, kann ich nur die relevanten Zeilen darstellen:
[code=]
Sep 18 04:15:22 mailrelay postfix/cleanup[12103]: 755387301: message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de>
Sep 18 04:15:22 mailrelay spamd[1364]: spamd: processing message <200609180214.k8I2EuNo016264@mforward2.dtag.de> for nobody:65534
Sep 18 04:15:25 mailrelay spamd[1364]: spamd: result: Y 15 - BAYES_99,DATE_IN_PAST_03_06,DNS_FROM_RFC_ABUSE,DNS_FROM_RFC_DSN,DNS_FROM_RFC_POST,DNS_FROM_RFC_WHOIS,FORGED_MUA_OUTLOOK,SPF_SOFTFAIL scantime=3.1,size=8086,user=nobody,uid=65534,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=55277,mid=<200609180214.k8I2EuNo016264@mforward2.dtag.de>,bayes=1,autolearn=no
Sep 18 04:15:25 mailrelay postfix/cleanup[12074]: DA1431965E: message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de>
Sep 18 04:15:26 mailrelay postfix/cleanup[13057]: EF90720AD: message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de>
Sep 18 04:15:26 mailrelay postfix/smtp[10879]: EF90720AD: to=<SPAM-FOUND@OUR-MAILSERVER.mail.com>, relay=10.49.0.7[10.49.0.7], delay=1, status=sent (250 2.6.0 <200609180214.k8I2EuNo016264@mforward2.dtag.de> Queued mail for delivery)
[/code]
So sieht also der Verlauf einer Mail im Server aus:
- Mail kommt an
- Mail wird an Virenscanner (Trendmicro) geschickt
- Mail wird an Spamassassin geschickt
- Mail wird an Empfänger (wenn Nachricht "sauber") oder an unser Büro (wenn Nachricht "Spam" oder "Virus") geschickt
Auffällig an den Zeilen sind diese Nummern, ich nenne sie mal Queue-IDs:
755387301
DA1431965E
EF90720AD
Filtere ich das Logfile erneut nach diesen Nummern, erhalte ich anscheinend alle Einträge zu entsprechender Mail:
[code=]Sep 18 02:15:11 mailrelay postfix/smtpd[10841]: 755387301: client=unknown[194.25.242.123]
Sep 18 04:15:22 mailrelay postfix/cleanup[12103]: 755387301: message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de>
Sep 18 04:15:22 mailrelay postfix/qmgr[11082]: 755387301: from=<sender@mail.net.mx>, size=8152, nrcpt=7 (queue active)
Sep 18 04:15:25 mailrelay postfix/pipe[11659]: 755387301: to=<receiver1@mail.com>, relay=procmail, delay=14, status=sent (filter)
Sep 18 04:15:25 mailrelay postfix/pipe[11659]: 755387301: to=<receiver2@mail.com>, relay=procmail, delay=14, status=sent (filter)
Sep 18 04:15:25 mailrelay postfix/pipe[11659]: 755387301: to=<receiver3@mail.com>, relay=procmail, delay=14, status=sent (filter)
Sep 18 04:15:25 mailrelay postfix/pipe[11659]: 755387301: to=<receiver4@mail.com>, relay=procmail, delay=14, status=sent (filter)
Sep 18 04:15:25 mailrelay postfix/qmgr[11082]: 755387301: removed[/code]
[code=]Sep 18 04:15:25 mailrelay postfix/pickup[13175]: DA1431965E: uid=65534 from=<nobody>
Sep 18 04:15:25 mailrelay postfix/cleanup[12074]: DA1431965E: message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de>
Sep 18 04:15:25 mailrelay postfix/qmgr[11082]: DA1431965E: from=<nobody@OUR-MAILSERVER.mail.com>, size=11074, nrcpt=1 (queue active)
Sep 18 04:15:26 mailrelay postfix/smtp[11703]: DA1431965E: to=<SPAM-FOUND@OUR-MAILSERVER.mail.com>, relay=localhost[127.0.0.1], delay=1, status=sent (250 Ok: queued as EF90720AD)
Sep 18 04:15:26 mailrelay postfix/qmgr[11082]: DA1431965E: removed
[/code]
[code=]
Sep 18 04:15:25 mailrelay postfix/smtpd[11704]: EF90720AD: client=localhost[127.0.0.1]
Sep 18 04:15:26 mailrelay postfix/cleanup[13057]: EF90720AD: message-id=<200609180214.k8I2EuNo016264@mforward2.dtag.de>
Sep 18 04:15:26 mailrelay postfix/smtp[11703]: DA1431965E: to=<SPAM-FOUND@OUR-MAILSERVER.mail.com>, relay=localhost[127.0.0.1], delay=1, status=sent (250 Ok: queued as EF90720AD)
Sep 18 04:15:26 mailrelay postfix/qmgr[11082]: EF90720AD: from=<nobody@OUR-MAILSERVER.mail.com>, size=11263, nrcpt=1 (queue active)
Sep 18 04:15:26 mailrelay postfix/smtp[10879]: EF90720AD: to=<SPAM-FOUND@OUR-MAILSERVER.mail.com>, relay=10.49.0.7[10.49.0.7], delay=1, status=sent (250 2.6.0 <200609180214.k8I2EuNo016264@mforward2.dtag.de> Queued mail for delivery)
Sep 18 04:15:26 mailrelay postfix/qmgr[11082]: EF90720AD: removed
[/code]
Ist es nun möglich, diese Informationen in EINEM Durchlauf zu sammeln?
Bei im Moment knapp 14000 message-ids wird es doch ein rießiger Zeitaufwand, wenn man das Logfile mehr als einmal (im schlimmsten Falle 14000 mal) durchlaufen muss.
Am liebsten hätte ich zum Schluss eine XML, die folgendermaßen aussieht:
<message id="200609180214.k8I2EuNo016264@mforward2.dtag.de">
<timestamp>Sep 18 04:15:26</timestamp>
<from>sender@mail.net.mx</from>
<to>receiver1@mail.com</to>
<to>receiver2@mail.com</to>
<to>receiver3@mail.com</to>
<to>receiver4@mail.com</to>
<queueID>EF90720AD</queueID>
<queueID>DA1431965E</queueID>
<queueID>755387301</queueID>
<spamd>
<score>15</score>
<filtered>yes</filtered>
<sendto>SPAM-FOUND@OUR-MAILSERVER.mail.com</sendto>
</spamd>
</message>
Ist das machbar? Oder kann pyparsing sowas nicht?
Ich weiss das die Funktion asXML("node") mir ein XML ausspucken würde und ich weiß auch wie ich die Tags setzen kann (grammar.setResultsName()), aber ich weiss nicht ob ich die Daten in einem Rutsch sammeln kann.
Jemand eine Idee?
Oder ist dafür pyparsing gar nicht gut?