17db96d56Sopenharmony_ci#!/usr/bin/env python3 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci"""Send the contents of a directory as a MIME message.""" 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciimport os 67db96d56Sopenharmony_ciimport smtplib 77db96d56Sopenharmony_ci# For guessing MIME type based on file name extension 87db96d56Sopenharmony_ciimport mimetypes 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_cifrom argparse import ArgumentParser 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_cifrom email.message import EmailMessage 137db96d56Sopenharmony_cifrom email.policy import SMTP 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_cidef main(): 177db96d56Sopenharmony_ci parser = ArgumentParser(description="""\ 187db96d56Sopenharmony_ciSend the contents of a directory as a MIME message. 197db96d56Sopenharmony_ciUnless the -o option is given, the email is sent by forwarding to your local 207db96d56Sopenharmony_ciSMTP server, which then does the normal delivery process. Your local machine 217db96d56Sopenharmony_cimust be running an SMTP server. 227db96d56Sopenharmony_ci""") 237db96d56Sopenharmony_ci parser.add_argument('-d', '--directory', 247db96d56Sopenharmony_ci help="""Mail the contents of the specified directory, 257db96d56Sopenharmony_ci otherwise use the current directory. Only the regular 267db96d56Sopenharmony_ci files in the directory are sent, and we don't recurse to 277db96d56Sopenharmony_ci subdirectories.""") 287db96d56Sopenharmony_ci parser.add_argument('-o', '--output', 297db96d56Sopenharmony_ci metavar='FILE', 307db96d56Sopenharmony_ci help="""Print the composed message to FILE instead of 317db96d56Sopenharmony_ci sending the message to the SMTP server.""") 327db96d56Sopenharmony_ci parser.add_argument('-s', '--sender', required=True, 337db96d56Sopenharmony_ci help='The value of the From: header (required)') 347db96d56Sopenharmony_ci parser.add_argument('-r', '--recipient', required=True, 357db96d56Sopenharmony_ci action='append', metavar='RECIPIENT', 367db96d56Sopenharmony_ci default=[], dest='recipients', 377db96d56Sopenharmony_ci help='A To: header value (at least one required)') 387db96d56Sopenharmony_ci args = parser.parse_args() 397db96d56Sopenharmony_ci directory = args.directory 407db96d56Sopenharmony_ci if not directory: 417db96d56Sopenharmony_ci directory = '.' 427db96d56Sopenharmony_ci # Create the message 437db96d56Sopenharmony_ci msg = EmailMessage() 447db96d56Sopenharmony_ci msg['Subject'] = f'Contents of directory {os.path.abspath(directory)}' 457db96d56Sopenharmony_ci msg['To'] = ', '.join(args.recipients) 467db96d56Sopenharmony_ci msg['From'] = args.sender 477db96d56Sopenharmony_ci msg.preamble = 'You will not see this in a MIME-aware mail reader.\n' 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci for filename in os.listdir(directory): 507db96d56Sopenharmony_ci path = os.path.join(directory, filename) 517db96d56Sopenharmony_ci if not os.path.isfile(path): 527db96d56Sopenharmony_ci continue 537db96d56Sopenharmony_ci # Guess the content type based on the file's extension. Encoding 547db96d56Sopenharmony_ci # will be ignored, although we should check for simple things like 557db96d56Sopenharmony_ci # gzip'd or compressed files. 567db96d56Sopenharmony_ci ctype, encoding = mimetypes.guess_type(path) 577db96d56Sopenharmony_ci if ctype is None or encoding is not None: 587db96d56Sopenharmony_ci # No guess could be made, or the file is encoded (compressed), so 597db96d56Sopenharmony_ci # use a generic bag-of-bits type. 607db96d56Sopenharmony_ci ctype = 'application/octet-stream' 617db96d56Sopenharmony_ci maintype, subtype = ctype.split('/', 1) 627db96d56Sopenharmony_ci with open(path, 'rb') as fp: 637db96d56Sopenharmony_ci msg.add_attachment(fp.read(), 647db96d56Sopenharmony_ci maintype=maintype, 657db96d56Sopenharmony_ci subtype=subtype, 667db96d56Sopenharmony_ci filename=filename) 677db96d56Sopenharmony_ci # Now send or store the message 687db96d56Sopenharmony_ci if args.output: 697db96d56Sopenharmony_ci with open(args.output, 'wb') as fp: 707db96d56Sopenharmony_ci fp.write(msg.as_bytes(policy=SMTP)) 717db96d56Sopenharmony_ci else: 727db96d56Sopenharmony_ci with smtplib.SMTP('localhost') as s: 737db96d56Sopenharmony_ci s.send_message(msg) 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ciif __name__ == '__main__': 777db96d56Sopenharmony_ci main() 78