Hallo zusammen, Ich Quäle mich schon seit zwei Tagen mit dem Mail Modul. Gerne möchte ich aus einem mbox File nur die Mailbodys parsen. Folgendes habe ich bereits: <source> import email import mailbox # Das Mailbox File wird geöffnet mbx = \ mailbox.UnixMailbox(file('/home/ahu/evolution/local/Inbox/subfolders/zarchive/subfolders/2004-06-17/mbox','r')) # Wie erzeuge ich eine email.message instanz, leider bekomme ich hier # ein String zurück msg = email.message_from_string(str(mbx.next())) # das erste Mail wird mir angezeigt print email.Message(msg.as_string()) # auch diese Methode funktioniert: print msg.is_multipart() a = msg.get_payload() # Jetzt bekomme ich einen leeren String: print a </source> Leider bin ich am ende meines (noch bescheidenen) python lateins! Ziel ist es den Body text des eMails zu bekommen. Ueberigens ist mir die Methode mbx.next() bekannt und diese funktioniert auch im obigen Beispiel. Ich hoffe ich langweile euch nicht mit meinem vermeintlich banalen Problem. Grüsse aus der Schweiz Andreas Hupfer _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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@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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
Andreas Hupfer
-
Lutz Horn