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