| #!/usr/bin/env python3 |
| |
| """Unpack a MIME message into a directory of files.""" |
| |
| import os |
| import sys |
| import email |
| import errno |
| import mimetypes |
| |
| from argparse import ArgumentParser |
| |
| |
| def main(): |
| parser = ArgumentParser(description="""\ |
| Unpack a MIME message into a directory of files. |
| """) |
| parser.add_argument('-d', '--directory', required=True, |
| help="""Unpack the MIME message into the named |
| directory, which will be created if it doesn't already |
| exist.""") |
| parser.add_argument('msgfile') |
| args = parser.parse_args() |
| |
| with open(args.msgfile) as fp: |
| msg = email.message_from_file(fp) |
| |
| try: |
| os.mkdir(args.directory) |
| except FileExistsError: |
| pass |
| |
| 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 |
| with open(os.path.join(args.directory, filename), 'wb') as fp: |
| fp.write(part.get_payload(decode=True)) |
| |
| |
| if __name__ == '__main__': |
| main() |