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