17db96d56Sopenharmony_ci#!/usr/bin/env python3
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci"""Unpack a MIME message into a directory of files."""
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciimport os
67db96d56Sopenharmony_ciimport email
77db96d56Sopenharmony_ciimport mimetypes
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_cifrom email.policy import default
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cifrom argparse import ArgumentParser
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_cidef main():
157db96d56Sopenharmony_ci    parser = ArgumentParser(description="""\
167db96d56Sopenharmony_ciUnpack a MIME message into a directory of files.
177db96d56Sopenharmony_ci""")
187db96d56Sopenharmony_ci    parser.add_argument('-d', '--directory', required=True,
197db96d56Sopenharmony_ci                        help="""Unpack the MIME message into the named
207db96d56Sopenharmony_ci                        directory, which will be created if it doesn't already
217db96d56Sopenharmony_ci                        exist.""")
227db96d56Sopenharmony_ci    parser.add_argument('msgfile')
237db96d56Sopenharmony_ci    args = parser.parse_args()
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci    with open(args.msgfile, 'rb') as fp:
267db96d56Sopenharmony_ci        msg = email.message_from_binary_file(fp, policy=default)
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci    try:
297db96d56Sopenharmony_ci        os.mkdir(args.directory)
307db96d56Sopenharmony_ci    except FileExistsError:
317db96d56Sopenharmony_ci        pass
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    counter = 1
347db96d56Sopenharmony_ci    for part in msg.walk():
357db96d56Sopenharmony_ci        # multipart/* are just containers
367db96d56Sopenharmony_ci        if part.get_content_maintype() == 'multipart':
377db96d56Sopenharmony_ci            continue
387db96d56Sopenharmony_ci        # Applications should really sanitize the given filename so that an
397db96d56Sopenharmony_ci        # email message can't be used to overwrite important files
407db96d56Sopenharmony_ci        filename = part.get_filename()
417db96d56Sopenharmony_ci        if not filename:
427db96d56Sopenharmony_ci            ext = mimetypes.guess_extension(part.get_content_type())
437db96d56Sopenharmony_ci            if not ext:
447db96d56Sopenharmony_ci                # Use a generic bag-of-bits extension
457db96d56Sopenharmony_ci                ext = '.bin'
467db96d56Sopenharmony_ci            filename = f'part-{counter:03d}{ext}'
477db96d56Sopenharmony_ci        counter += 1
487db96d56Sopenharmony_ci        with open(os.path.join(args.directory, filename), 'wb') as fp:
497db96d56Sopenharmony_ci            fp.write(part.get_payload(decode=True))
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ciif __name__ == '__main__':
537db96d56Sopenharmony_ci    main()
54