| #!/usr/bin/env python | 
 |  | 
 | """Send the contents of a directory as a MIME message. | 
 |  | 
 | Usage: dirmail [options] from to [to ...]* | 
 |  | 
 | Options: | 
 |     -h / --help | 
 |         Print this message and exit. | 
 |  | 
 |     -d directory | 
 |     --directory=directory | 
 |         Mail the contents of the specified directory, otherwise use the | 
 |         current directory.  Only the regular files in the directory are sent, | 
 |         and we don't recurse to subdirectories. | 
 |  | 
 | `from' is the email address of the sender of the message. | 
 |  | 
 | `to' is the email address of the recipient of the message, and multiple | 
 | recipients may be given. | 
 |  | 
 | The email is sent by forwarding to your local SMTP server, which then does the | 
 | normal delivery process.  Your local machine must be running an SMTP server. | 
 | """ | 
 |  | 
 | import sys | 
 | import os | 
 | import getopt | 
 | import smtplib | 
 | # For guessing MIME type based on file name extension | 
 | import mimetypes | 
 |  | 
 | from email import Encoders | 
 | from email.Message import Message | 
 | from email.MIMEAudio import MIMEAudio | 
 | from email.MIMEBase import MIMEBase | 
 | from email.MIMEMultipart import MIMEMultipart | 
 | from email.MIMEImage import MIMEImage | 
 | from email.MIMEText import MIMEText | 
 |  | 
 | COMMASPACE = ', ' | 
 |  | 
 |  | 
 | def usage(code, msg=''): | 
 |     print >> sys.stderr, __doc__ | 
 |     if msg: | 
 |         print >> sys.stderr, msg | 
 |     sys.exit(code) | 
 |  | 
 |  | 
 | def main(): | 
 |     try: | 
 |         opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) | 
 |     except getopt.error, msg: | 
 |         usage(1, msg) | 
 |  | 
 |     dir = os.curdir | 
 |     for opt, arg in opts: | 
 |         if opt in ('-h', '--help'): | 
 |             usage(0) | 
 |         elif opt in ('-d', '--directory'): | 
 |             dir = arg | 
 |  | 
 |     if len(args) < 2: | 
 |         usage(1) | 
 |  | 
 |     sender = args[0] | 
 |     recips = args[1:] | 
 |  | 
 |     # Create the enclosing (outer) message | 
 |     outer = MIMEMultipart() | 
 |     outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir) | 
 |     outer['To'] = COMMASPACE.join(recips) | 
 |     outer['From'] = sender | 
 |     outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' | 
 |     # To guarantee the message ends with a newline | 
 |     outer.epilogue = '' | 
 |  | 
 |     for filename in os.listdir(dir): | 
 |         path = os.path.join(dir, filename) | 
 |         if not os.path.isfile(path): | 
 |             continue | 
 |         # Guess the content type based on the file's extension.  Encoding | 
 |         # will be ignored, although we should check for simple things like | 
 |         # gzip'd or compressed files. | 
 |         ctype, encoding = mimetypes.guess_type(path) | 
 |         if ctype is None or encoding is not None: | 
 |             # No guess could be made, or the file is encoded (compressed), so | 
 |             # use a generic bag-of-bits type. | 
 |             ctype = 'application/octet-stream' | 
 |         maintype, subtype = ctype.split('/', 1) | 
 |         if maintype == 'text': | 
 |             fp = open(path) | 
 |             # Note: we should handle calculating the charset | 
 |             msg = MIMEText(fp.read(), _subtype=subtype) | 
 |             fp.close() | 
 |         elif maintype == 'image': | 
 |             fp = open(path, 'rb') | 
 |             msg = MIMEImage(fp.read(), _subtype=subtype) | 
 |             fp.close() | 
 |         elif maintype == 'audio': | 
 |             fp = open(path, 'rb') | 
 |             msg = MIMEAudio(fp.read(), _subtype=subtype) | 
 |             fp.close() | 
 |         else: | 
 |             fp = open(path, 'rb') | 
 |             msg = MIMEBase(maintype, subtype) | 
 |             msg.set_payload(fp.read()) | 
 |             fp.close() | 
 |             # Encode the payload using Base64 | 
 |             Encoders.encode_base64(msg) | 
 |         # Set the filename parameter | 
 |         msg.add_header('Content-Disposition', 'attachment', filename=filename) | 
 |         outer.attach(msg) | 
 |  | 
 |     # Now send the message | 
 |     s = smtplib.SMTP() | 
 |     s.connect() | 
 |     s.sendmail(sender, recips, outer.as_string()) | 
 |     s.close() | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |     main() |