home *** CD-ROM | disk | FTP | other *** search
- #!/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()
-