[Python-de] email verändern

Christopher Arndt chris.arndt at web.de
Mo Jul 23 19:21:45 UTC 2007


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.

>     
>     #
>     # 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?

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)?

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.

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.

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

http://www.python.org/doc/current/lib/module-email.message.html

"Conceptually, a Message object consists of headers and payloads.
Headers are RFC 2822 style field names and values [...]  The payload is
either a string in the case of simple message objects or a list of
Message objects for MIME container documents (e.g. multipart/* and
message/rfc822)"

Chris