| #!/usr/bin/env python3 | 
 |  | 
 | """Unpack a MIME message into a directory of files.""" | 
 |  | 
 | import os | 
 | import sys | 
 | import email | 
 | import errno | 
 | import mimetypes | 
 |  | 
 | from optparse import OptionParser | 
 |  | 
 |  | 
 | def main(): | 
 |     parser = OptionParser(usage="""\ | 
 | Unpack a MIME message into a directory of files. | 
 |  | 
 | Usage: %prog [options] msgfile | 
 | """) | 
 |     parser.add_option('-d', '--directory', | 
 |                       type='string', action='store', | 
 |                       help="""Unpack the MIME message into the named | 
 |                       directory, which will be created if it doesn't already | 
 |                       exist.""") | 
 |     opts, args = parser.parse_args() | 
 |     if not opts.directory: | 
 |         parser.print_help() | 
 |         sys.exit(1) | 
 |  | 
 |     try: | 
 |         msgfile = args[0] | 
 |     except IndexError: | 
 |         parser.print_help() | 
 |         sys.exit(1) | 
 |  | 
 |     try: | 
 |         os.mkdir(opts.directory) | 
 |     except OSError as e: | 
 |         # Ignore directory exists error | 
 |         if e.errno != errno.EEXIST: | 
 |             raise | 
 |  | 
 |     fp = open(msgfile) | 
 |     msg = email.message_from_file(fp) | 
 |     fp.close() | 
 |  | 
 |     counter = 1 | 
 |     for part in msg.walk(): | 
 |         # multipart/* are just containers | 
 |         if part.get_content_maintype() == 'multipart': | 
 |             continue | 
 |         # Applications should really sanitize the given filename so that an | 
 |         # email message can't be used to overwrite important files | 
 |         filename = part.get_filename() | 
 |         if not filename: | 
 |             ext = mimetypes.guess_extension(part.get_content_type()) | 
 |             if not ext: | 
 |                 # Use a generic bag-of-bits extension | 
 |                 ext = '.bin' | 
 |             filename = 'part-%03d%s' % (counter, ext) | 
 |         counter += 1 | 
 |         fp = open(os.path.join(opts.directory, filename), 'wb') | 
 |         fp.write(part.get_payload(decode=True)) | 
 |         fp.close() | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |     main() |