[Python-de] email verändern

Roland M. Kruggel rk.liste at bbf7.de
Di Jul 24 13:55:55 UTC 2007


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...