faqts : Computers : Programming : Languages : Python : Common Problems : Email

+ Search
Add Entry AlertManage Folder Edit Entry Add page to http://del.icio.us/
Did You Find This Entry Useful?

5 of 8 people (63%) answered Yes
Recently 3 of 3 people (100%) answered Yes

Entry

is there code that sends the contents of a directory as a multi-part mime message to e-mail recipients?

Feb 5th, 2002 17:57
Beverly Dolor, Wolfgang Lipp, http://www.python.org/doc/current/lib/module-email.html


Found this on Python Library Reference section 12.2.10 Examples (under 
the email module)
     #!/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.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 = MIMEBase('multipart', 'mixed')
         outer['Subject'] = 'Contents of directory \%s' \% 
os.path.abspath(dir)
         outer['To'] = sender
         outer['From'] = COMMASPACE.join(recips)
         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.add_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)
         fp = open('/tmp/debug.pck', 'w')
         import cPickle
         cPickle.dump(outer, fp)
         fp.close()
         # Now send the message
         s = smtplib.SMTP()
         s.connect()
         s.sendmail(sender, recips, outer.as_string(0))
         s.close()
     if __name__ == '__main__':
         main()