2010-06-16 7 views
12

Ich schreibe ein Python-Skript, um E-Mails zu verarbeiten, die von Procmail zurückgegeben werden. Wie in dieser question vorgeschlagen, verwende ich die folgende Procmail config:E-Mail mit Python analysieren

:0: 
|$HOME/process_mail.py 

Mein process_mail.py Skript eine E-Mail über stdin wie folgt erhält:

From hostname Tue Jun 15 21:43:30 2010 
Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400 
Received: from mail-fx0-f44.google.com (209.85.161.44) 
by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400 
Received: by fxm19 with SMTP id 19so170709fxm.3 
for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
MIME-Version: 1.0 
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 
Jun 2010 18:47:33 -0700 (PDT) 
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Date: Tue, 15 Jun 2010 20:47:33 -0500 
Message-ID: <[email protected]> 
Subject: TEST 12 
From: Full Name <[email protected]> 
To: [email protected] 
Content-Type: text/plain; charset=ISO-8859-1 

ONE 
TWO 
THREE 

Ich versuche, das zu analysieren Nachricht auf diese Weise:

>>> import email 
>>> msg = email.message_from_string(full_message) 

Ich möchte Nachrichtenfelder wie 'Von', 'An' und 'Betreff' bekommen. Das Nachrichtenobjekt enthält jedoch keines dieser Felder.

Was mache ich falsch?

Antwort

9

Sie müssen sicherstellen, dass die Linien sind nicht versehentlich kaputt (wie sie oben sind, obwohl es schwer zu sagen ist, ob das ein Copy-Paste-Problem war) - mit einem Intac t-Nachricht, wie:

Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400 
Received: from mail-fx0-f44.google.com (209.85.161.44) by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400 
Received: by fxm19 with SMTP id 19so170709fxm.3 for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
MIME-Version: 1.0 
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Date: Tue, 15 Jun 2010 20:47:33 -0500 
Message-ID: <[email protected]> 
Subject: TEST 12 
From: Full Name <[email protected]> 
To: [email protected] 
Content-Type: text/plain; charset=ISO-8859-1 

ONE 
TWO 
THREE 

dann

msg = email.message_from_string(msgtxt) 
print msg['Subject'] 

Drucke TEST 12 wie gewünscht.

+0

Wie bekomme ich den Text der E-Mail hier? – Anuj

+0

Wenn Sie wirklich den gesamten RFC2822-E-Mail-Körper mit rohen MIME-Strukturen und allen wollen, ist das Parsen der Nachricht in Python grundsätzlich überflüssig; der Körper ist alles nach der ersten Leerzeile. Normalerweise möchten Sie bei modernen Nachrichten die MIME-Struktur parsen und einen oder mehrere Körperteile extrahieren. – tripleee

1

Ich antworte mir.

Ich habe einen Fehler im Code gefunden, der die Nachrichten erstellt. Es fügt Zeilenumbrüche zwischen einigen Zeilen hinzu und verhindert, dass der Parser ordnungsgemäß funktioniert.

3

Es ist wie Sie auf die zusätzliche Linien Zeilenvorschübe ohne vorangestellt Räume sieht, die nach RFC 2822 §2.3.2 illegal ist:

Jedes Header-Feld logisch eine einzige Zeile von Zeichen ist
die Feldnamen enthält, der Doppelpunkt und der Feldkörper. Für die Bequemlichkeit
jedoch, und die 998/78 Zeichen Einschränkungen pro Zeile zu behandeln,
der Feldkörper Teil eines Header-Feld kann in eine multiple Zeile Darstellung aufgeteilt werden; das nennt man "falten". Die allgemeine Regel lautet
, dass, wo immer dieser Standard das Falten von Leerraum zulässt (nicht
einfach WSP-Zeichen), eine CRLF vor jedem WSP eingefügt werden kann. Für
Beispiel das Header-Feld:

Subject: This is a test 

kann wie folgt dargestellt werden:

Subject: This 
    is a test 

Es ist etwas sollte wie folgt aussehen:

From hostname Tue Jun 15 21:43:30 2010 
Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400 
Received: from mail-fx0-f44.google.com (209.85.161.44) 
    by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400 
Received: by fxm19 with SMTP id 19so170709fxm.3 
    for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
MIME-Version: 1.0 
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 
    Jun 2010 18:47:33 -0700 (PDT) 
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Date: Tue, 15 Jun 2010 20:47:33 -0500 
Message-ID: <[email protected]> 
Subject: TEST 12 
From: Full Name <[email protected]> 
To: [email protected] 
Content-Type: text/plain; charset=ISO-8859-1 

ONE 
TWO 
THREE