| #!/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() |