| #!/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.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() |