| #!/usr/bin/env python | |
| """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() |