blob: e596b981761f0210eba1692da5df73322d078735 [file] [log] [blame]
Fred Drakefcc31b42002-10-01 14:17:10 +00001#!/usr/bin/env python
2
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003"""Unpack a MIME message into a directory of files."""
Fred Drakefcc31b42002-10-01 14:17:10 +00004
Fred Drakefcc31b42002-10-01 14:17:10 +00005import os
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006import sys
7import email
Fred Drakefcc31b42002-10-01 14:17:10 +00008import errno
9import mimetypes
Fred Drakefcc31b42002-10-01 14:17:10 +000010
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000011from optparse import OptionParser
Fred Drakefcc31b42002-10-01 14:17:10 +000012
13
14def main():
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000015 parser = OptionParser(usage="""\
16Unpack a MIME message into a directory of files.
Fred Drakefcc31b42002-10-01 14:17:10 +000017
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000018Usage: %prog [options] msgfile
19""")
20 parser.add_option('-d', '--directory',
21 type='string', action='store',
22 help="""Unpack the MIME message into the named
23 directory, which will be created if it doesn't already
24 exist.""")
25 opts, args = parser.parse_args()
26 if not opts.directory:
27 parser.print_help()
28 sys.exit(1)
Fred Drakefcc31b42002-10-01 14:17:10 +000029
30 try:
31 msgfile = args[0]
32 except IndexError:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000033 parser.print_help()
34 sys.exit(1)
Fred Drakefcc31b42002-10-01 14:17:10 +000035
36 try:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000037 os.mkdir(opts.directory)
Guido van Rossumb940e112007-01-10 16:19:56 +000038 except OSError as e:
Fred Drakefcc31b42002-10-01 14:17:10 +000039 # Ignore directory exists error
Neal Norwitz3bd844e2006-08-29 04:39:12 +000040 if e.errno != errno.EEXIST:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000041 raise
Fred Drakefcc31b42002-10-01 14:17:10 +000042
43 fp = open(msgfile)
44 msg = email.message_from_file(fp)
45 fp.close()
46
47 counter = 1
48 for part in msg.walk():
49 # multipart/* are just containers
50 if part.get_content_maintype() == 'multipart':
51 continue
52 # Applications should really sanitize the given filename so that an
53 # email message can't be used to overwrite important files
54 filename = part.get_filename()
55 if not filename:
56 ext = mimetypes.guess_extension(part.get_type())
57 if not ext:
58 # Use a generic bag-of-bits extension
59 ext = '.bin'
60 filename = 'part-%03d%s' % (counter, ext)
61 counter += 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000062 fp = open(os.path.join(opts.directory, filename), 'wb')
63 fp.write(part.get_payload(decode=True))
Fred Drakefcc31b42002-10-01 14:17:10 +000064 fp.close()
65
66
67if __name__ == '__main__':
68 main()