[Python-de] mbox / Mail parsen

Lutz Horn lutz.horn at gmx.de
Sam Jul 24 16:08:59 CEST 2004


Hallo Andreas,

Dein Problem hängt mit den unterschiedlichen Message-Klassen aus den
Modulen email und rfc822 zusammen.  Diese verhalten sich
unterschiedlich.  Insbesondere liefert str() für eine rcf822.Message
*nicht* den Body der Nachricht.

* Andreas Hupfer <python-list at hupfer.ch> [20040722 19:16 +0200]:
> import email
> import mailbox
> 
> # Das Mailbox File wird geöffnet
> mbx = \
> mailbox.UnixMailbox(file('...', 'r'))
> # Wie erzeuge ich eine email.message instanz, leider bekomme ich hier
> # ein String zurück
> msg = email.message_from_string(str(mbx.next()))

Siehe Python Library Reference "12.4.1 Mailbox Objects":

  next

    Return the next message in the mailbox, created with the optional
    factory argument passed into the mailbox object's constructor. By
    default this is an rfc822.Message object (see the rfc822 module).

Du musst also mit einer Instanz von rfc822.Message arbeiten.  Um an
den Body der rfc822.Instanz zu kommen, die von mbx.next() geliefert
wird, reicht es nicht aus, str() auf die rfc822.Message anzuwenden.
Eine solche Instanz hat einen Filepointer fp. Siehe "12.11.1 Message
Objects":

  fp

    The file or file-like object passed at instantiation time. This
    can be used to read the message content.

Um also aus der rfc822.Message-Instanz eine email.Message-Instanz zu
erzeugen, musst Du diesen Filepointer auslesen.  Statt der letzten
obigen Zeile schreibst Du also besser:

msg = email.message_from_file(mbx.next().fp)

> # das erste Mail wird mir angezeigt
> print email.Message(msg.as_string())

Das ist dann nicht mehr nötigt.

> # auch diese Methode funktioniert:
> print msg.is_multipart()
> a = msg.get_payload()
> # Jetzt bekomme ich einen leeren String:
> print a

Müsste jetzt funktionieren.

Gruß
Lutz