Am Montag, 23. Juli 2007 21:21 schrieb Christopher Arndt:
Roland M. Kruggel schrieb:
# umwandel des objectes in einen string composed = msg.as_string()
Dies rendered die gesamte Email mit allen MIME parts als einen string. An diesem String solltest du direkt keine Änderungen mehr vornehmen.
Das hatte ich schon vermutet
# # HIER SOLL DER FOOTER EINGEFÜGT WERDEN !! #
ff.write(composed) # den string schreiben. ff.close() --<
Das einzige wo ich momentan dran hänge ist das Ändern des Mail-Body. Wie füge ich den Footer-String in die Mail ein? Vor allen dingen an der richtigen Position.
Was heißt "richtige Position"? Soll der Footer ganz ans Ende der Mail angefügt werden oder irgendwo mittendrin?
Genau da wo du es in deinem Beispiel gezeigt hast. Am Ende jeden parts.
Was für MIME parts hat deine Email denn? Gibt es nur eine Plaintext-Part oder auch einen HTML-Part oder etwas nur Letzteren (bäh)?
Beides, und dann auch noch gemischt.
An einen Plaintext-Part noch etwas anzufügen ist nicht schwierig, einfach den richtigen MIME part aus dem "msg"-Objekt extrahieren (s.u.) und mit set_payload() den neuen Text setzen.
Ok. An dieser Stelle hatte ich den hänger. Jetzt ist es Klar.
Bei einem HTML-Part ist das schon schwieriger. Damit der HTML code valide bleibt, musst du den HTML-Code parsen (z.B. mit BeautifulSoup oder ElementTree und ein neues Kind-Element in das BODY-Element einfügen. Der Rest funktioniert dann genauso wie bei einem Plaintext-Part.
Kann ich nicht einfach den '</BODY>' durch 'Footer-Text</BODY>' erstetzten? Ich habe das jetzt so gemacht, funktionieren tut es. Handel ich mir damit eventuell Seiteneffekte ein? Abgesehen davon, dass ein </BODY> nicht immer vorhanden ist.
Das Python-Api hilf mir leider nicht weiter
Das meinst du ;-) Du musst dir eine Email wie einen Umschlag vorstellen, der mehrere Teile (MIME parts) enthält. Diese Teile können jeweils einen verschiedenen Typ (Plaintext, HTML, Binary, etc) und Encoding haben.
Aha. Das war mir nicht klar. Jetzt ja. :)
Um also das, was du den Body der Email nennst - im Allgemeinen der ersten Teil mit dem Typ "text/plain, zu bekommen, musst diesen erst mal aus dem "msg"-Objekt extrahieren:
fp = open(sys.argv[1]) msg = email.message_from_file(fp) fp.close() if msg.is_multipart(): for part in msg.walk(): msgtype = part.get_content_type() if msgtype == 'text/plain': # we have a plain text part print '########## Plain text part ##############' text = part.get_payload() # do your modifications to this part here print text elif msgtype == 'text/html': # we have a HTML part print '########## HTML part ##############' # parse HTML # do your modifications to this part here html = part.get_payload() print html else: # we have a simple email with only one part print '########## Single part message ##############' text = msg.get_payload() print text
Probiere dieses Skript mal mit einer beliebigen Mail aus deinem Spamfolder aus. Ansonsten mal hier nachlesen:
Super! Das sagt mehr als 1000 Worte.
http://www.python.org/doc/current/lib/module-email.message.html
ok. Die hatte ich zwar gefunden, und auch gelesen, aber ich konnte die Funktion xxx_payload() nicht einordnen. Bzw. Ich hatte sie nicht verstanden. Ich wusste nicht was 'payload' ist. Na ja, in englisch bin ich nicht so fit. Jetzt hab ich es. Also. Vielen vielen dank -- cu Roland Kruggel mailto: rk.liste at bbf7.de System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5 Test vom disclaim...