Seite 1 von 1

String En & Decoding bei EMails

Verfasst: Sonntag 16. Juni 2013, 05:17
von p90
Hi,

mich treibt mal wieder ein String En bzw. Decoding Fehler in den Wahnsinn.
Folgendes Problem:
Ich habe ein Verzeichnis mit Eml Dateien.
Aus diesen möchte ich jetzt eine index.html Datei erzeugen die die Daten "An:", "Von:", "Betreff:", "Datum:" tabellarisch aufführt. Also lese ich alle Eml-Files ein und erzeuge mir email-Objects.
Hier der bisherige Code:
http://www.python-forum.de/pastebin.php ... &mode=view
Das Programm läuft zwar durch ABER:
Bei einigen Mails ist das Encoding in der Index.html kaputt. Bisher habe ich es nur im Subject gesehen.
Da ich das subject ja vorher erst decoded habe dachte ich, hey, subject.encode("utf-8") damit er am Ende das richtig rausschreibt aber leider geht das nicht. Er schmeißt sich dann mit dem bekannten unicodeDecodeError "ascii" codec cannot decode bla foo. Ich dachte jetzt eigentlich, dass ich doch das decode einen unicode string bekommen habe oder?
Da es vlt noch wichtig ist, hab hier Python 2.7 aber ich begreife gerade nicht was da falsch läuft.
Hat irgendwer einen Tip für mich?

Re: String En & Decoding bei EMails

Verfasst: Sonntag 16. Juni 2013, 06:31
von BlackJack
@p90: So wie es jetzt ist, ist es auf jeden fall fehlerhaft, weil durch das `subject` beim `write()` ein `unicode`-Objekt entsteht und das beim `write()` auf die Nase fallen wird, wenn irgend etwas ausserhalb von ASCII enthalten ist.

Hast Du die Daten von den fehlerhaft angezeigten Betreffs denn mal verfolgt? Wie sehen die in welchen Verarbeitungsschritt *genau* aus. Man kann ja auch nicht ausschliessen, dass die schlicht fehlerhaft sind weil sie schon falsch in der Mail gespeichert sind.

Du hast dort beim dekodieren eine Menge Code-Wiederholung und einfach nur das erste Element aus der Liste von `decode_header()` zu verwenden ist auch nicht besonders robust. Dieses dekodieren solltest Du vielleicht in eine eigene Funktion stecken.

Re: String En & Decoding bei EMails

Verfasst: Sonntag 16. Juni 2013, 13:52
von p90
Hi,

die EMails mit dem Fehlerhaften Encoding habe ich verfolgt, die sind soweit ich es gesehen habe alle das Encoding
Windows 1252 oder iso-8859-1 werden aber in Thunderbird korrekt angezeigt.

Ich hab keine Ahnung warum er schon wieder beim Encoding einen Decoding Fehler wirft.
Habs jetzt hin bekommen indem ich intern alles erst mal zu unicode gemacht habe und dann mit codecs ein fileobject in utf8 geöffnet habe das sich dann für alle um das encoding kümmert.
Musste noch ein paar Klimmzüge einbauen weil einige Funktionen nicht mit unicode gehen.
Hier ist das Resultat:
http://www.python-forum.de/pastebin.php?mode=view&s=360

Das einzige wo ich noch gucken muss ist der Umstand das header mehrfach vorkommen können. In meinen Mails habe ich jetzt immer nur einen verwendet gesehen aber das könnte ja auch an meinem Programm liegen.

Re: String En & Decoding bei EMails

Verfasst: Sonntag 16. Juni 2013, 18:46
von friedduck
Hi, ich weiß zwar nicht ob es dir weiterhilft aber ich habe es bei mir so gemacht (ohne schleife)

Code: Alles auswählen

#===================================================================
            # Encoding des Betreffs
            #===================================================================
            
            subject_enc = email.Header.decode_header( email_msg['Subject'].strip() )[0][1]
            
            
            #===================================================================
            # Umwandeln des Betreffs in UTF8
            #===================================================================
            if subject_enc == None:
                subject = subject.encode('utf-8').lower()
            else:
                subject = subject.decode(subject_enc).encode('utf-8').lower()
                
            print subject