Question about email-handling modules
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Thu Dec 20 07:37:41 EST 2007
On Thu, 20 Dec 2007 09:31:10 +0000, Robert Latest wrote:
> 1. Why can I get the 'subject' and 'from' header field unsig the []
> notation, but not 'to'? When I print Message.keys I get a list of all
> header fields of the message, including 'to'. What's the difference
> between message['to'] and message.get('to')?
message['to'] looks up the key 'to', raising an exception if it doesn't
exist. message.get('to') looks up the key and returns a default value if
it doesn't exist.
See help(message.get) for more detail.
> 2. Why can't I call the get_payload() method on the message? What I get
> is this cryptic error: "AttributeError: Message instance has no
> attribute 'get_payload'". I'm trying to call a method here, not an
> attribute. It makes no difference if I put parentheses after get_payload
> or not. I looked into the email/Message module and found get_payload
> defined there.
All methods are attributes (although the opposite is not the case), so if
a method doesn't exist, you will get an AttributeError.
The email.Message.Message class has a get_payload, but you're not using
that class. You're using mailbox.UnixMailbox, which returns an instance
of rfc822.Message which *doesn't* have a get_payload method.
Damned if I can work out how to actually *use* the email module to read
an mbox mail box. I might have to RTFM :(
http://docs.python.org/lib/module-email.html
http://docs.python.org/lib/module-mailbox.html
*later*
Ah! The Fine Manual is some help after all. Try this:
# copied from http://docs.python.org/lib/mailbox-deprecated.html
import email
import email.Errors
import mailbox
def msgfactory(fp):
try:
return email.message_from_file(fp)
except email.Errors.MessageParseError:
# Don't return None since that will
# stop the mailbox iterator
return ''
fp = file('mymailbox', 'rb')
mbox = mailbox.UnixMailbox(fp, msgfactory)
for message in mbox:
print message.get_payload()
But note that message.get_payload() will return either a string (for
single part emails) or a list of Messages (for multi-part messages).
--
Steven
More information about the Python-list
mailing list