2009-04-24 1 views
7

Mit get_payload in Fremdheit geraten: Es scheint zu verpuffen, wenn es in der Nachricht, die es entschlüsselt, ein Gleichheitszeichen sieht. Hier ist Code, der den Fehler anzeigt:Python: E-Mail get_payload Dekodierung schlägt fehl, wenn Gleichheitszeichen getroffen wird?

import email 

data = file('testmessage.txt').read() 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 

Und hier ist ein Beispielnachricht: test message.

Die Nachricht wird nur bis zum ersten "=" gedruckt. Der Rest entfällt. Weiß jemand was los ist?

Das gleiche Skript mit "decode = False" gibt die vollständige Nachricht zurück, so dass die Dekodierung mit dem Gleichheitszeichen unzufrieden ist.

Dies ist unter Python 2.5.

Antwort

6

Sie haben ein Zeilenende-Problem. Der Text der Testnachricht verwendet leere Zeilenumbrüche (\ r) ohne Zeilenumbrüche (\ n). Wenn Sie die Zeilenenden vor dem Parsen der E-Mail beheben, funktioniert alles:

import email, re 
data = file('testmessage.txt').read() 
data = re.sub(r'\r(?!\n)', '\r\n', data) # Bare \r becomes \r\n 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 
+0

Danke Richie, das funktioniert. Ich werde mich aber auch mit Anhängen beschäftigen, die kein Text sind, daher möchte ich die Wiederwahl wahrscheinlich nicht wahllos vornehmen. Ich muss Text/plain erkennen und mache dann nur die Ersetzung, was ein wenig subtil ist, da ich den mime type für den Nachrichtenteil bereits hinter dem Aufruf message_from_string finde. Ist es möglich, die Dekodierung außerhalb des Aufrufs get_payload separat aufzurufen? – Parand

+1

Sind Sie sicher, dass Sie jemals mit echten binären Anhängen arbeiten werden? Anhänge werden normalerweise in der E-Mail mit base64 oder ähnlichem verschlüsselt. Obwohl sie eine Binärdatei darstellen, werden sie in der E-Mail als Text codiert. – RichieHindle

+0

Sie haben wieder Recht; Ich testete mit einer anständigen Anzahl von Beispielen und sie alle funktionieren gut mit der Substitution, die Sie vorschlagen. Danke noch einmal. – Parand

Verwandte Themen