Unpacking a Multipart MIME Message
Credit: Matthew Dixon Cowles
Problem
You have a multipart MIME message and want to unpack it.
Solution
The walk method of message objects generated by
the email module (new as of Python 2.2) makes this
task really easy:
import email.Parser
import os, sys
def main( ):
if len(sys.argv)==1:
print "Usage: %s filename" % os.path.basename(sys.argv[0])
sys.exit(1)
mailFile = open(sys.argv[1], "rb")
p = email.Parser.Parser( )
msg = p.parse(mailFile)
mailFile.close( )
partCounter = 1
for part in msg.walk( ):
if part.get_main_type( )=="multipart":
continue
name = part.get_param("name")
if name==None:
name = "part-%i" % partCounter
partCounter+=1
# In real life, make sure that name is a reasonable filename
# for your OS; otherwise, mangle it until it is!
f = open(name,"wb")
f.write(part.get_payload(decode=1))
f.close( )
print name
if _ _name_ _=="_ _main_ _":
main( )Discussion
The email module, new in Python 2.2, makes parsing
MIME messages reasonably easy. (See the Library Reference for detailed documentation about the
email module.) This recipe shows how to
recursively unbundle a MIME message with the email
module in the easiest way, using the walk method
of message objects.
You can create a message object in several ways. For example, you can
instantiate the email.Message.Message class and
build the message object’s contents with calls to
its add_payload method. In this recipe, I need to read and analyze an existing message, so I worked the other way around, ...