[Python-checkins] CVS: python/dist/src/Doc/lib email.tex,1.7,1.8
Barry Warsaw
bwarsaw@users.sourceforge.net
Mon, 05 Nov 2001 09:50:55 -0800
Update of /cvsroot/python/python/dist/src/Doc/lib
In directory usw-pr-cvs1:/tmp/cvs-serv13904/Doc/lib
Modified Files:
email.tex
Log Message:
Finally fleshed out the examples section with 4 code samples! Some of
my own doing, some originally written by Matthew Dixon Cowles.
Index: email.tex
===================================================================
RCS file: /cvsroot/python/python/dist/src/Doc/lib/email.tex,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** email.tex 2001/11/05 01:55:03 1.7
--- email.tex 2001/11/05 17:50:53 1.8
***************
*** 319,321 ****
\subsection{Examples}
! Coming soon...
--- 319,617 ----
\subsection{Examples}
! Here are a few examples of how to use the \module{email} package to
! read, write, and send simple email messages, as well as more complex
! MIME messages.
!
! First, let's see how to create and send a simple text message:
!
! \begin{verbatim}
! # Import smtplib for the actual sending function
! import smtplib
!
! # Here are the email pacakge modules we'll need
! from email import Encoders
! from email.MIMEText import MIMEText
!
! # Open a plain text file for reading
! fp = open(textfile)
! # Create a text/plain message, using Quoted-Printable encoding for non-ASCII
! # characters.
! msg = MIMEText(fp.read(), _encoder=Encoders.encode_quopri)
! fp.close()
!
! # me == the sender's email address
! # you == the recipient's email address
! msg['Subject'] = 'The contents of \%s' \% textfile
! msg['From'] = me
! msg['To'] = you
!
! # Send the message via our own SMTP server. Use msg.as_string() with
! # unixfrom=0 so as not to confuse SMTP.
! s = smtplib.SMTP()
! s.connect()
! s.sendmail(me, [you], msg.as_string(0))
! s.close()
! \end{verbatim}
!
! Here's an example of how to send a MIME message containing a bunch of
! family pictures:
!
! \begin{verbatim}
! # Import smtplib for the actual sending function
! import smtplib
!
! # Here are the email pacakge modules we'll need
! from email.MIMEImage import MIMEImage
! from email.MIMEBase import MIMEBase
!
! COMMASPACE = ', '
!
! # Create the container (outer) email message.
! # me == the sender's email address
! # family = the list of all recipients' email addresses
! msg = MIMEBase('multipart', 'mixed')
! msg['Subject'] = 'Our family reunion'
! msg['From'] = me
! msg['To'] = COMMASPACE.join(family)
! msg.preamble = 'Our family reunion'
! # Guarantees the message ends in a newline
! msg.epilogue = ''
!
! # Assume we know that the image files are all in PNG format
! for file in pngfiles:
! # Open the files in binary mode. Let the MIMEIMage class automatically
! # guess the specific image type.
! fp = open(file, 'rb')
! img = MIMEImage(fp.read())
! fp.close()
! msg.attach(img)
!
! # Send the email via our own SMTP server.
! s = smtplib.SMTP()
! s.connect()
! s.sendmail(me, family, msg.as_string(unixfrom=0))
! s.close()
! \end{verbatim}
!
! Here's an example\footnote{Thanks to Matthew Dixon Cowles for the
! original inspiration and examples.} of how to send the entire contents
! of a directory as an email message:
!
! \begin{verbatim}
! #!/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()
! \end{verbatim}
!
! And finally, here's an example of how to unpack a MIME message like
! the one above, into a directory of files:
!
! \begin{verbatim}
! #!/usr/bin/env python
!
! """Unpack a MIME message into a directory of files.
!
! Usage: unpackmail [options] msgfile
!
! Options:
! -h / --help
! Print this message and exit.
!
! -d directory
! --directory=directory
! Unpack the MIME message into the named directory, which will be
! created if it doesn't already exist.
!
! msgfile is the path to the file containing the MIME message.
! """
!
! import sys
! import os
! import getopt
! import errno
! import mimetypes
! import email
!
!
! 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
!
! try:
! msgfile = args[0]
! except IndexError:
! usage(1)
!
! try:
! os.mkdir(dir)
! except OSError, e:
! # Ignore directory exists error
! if e.errno <> errno.EEXIST: raise
!
! fp = open(msgfile)
! msg = email.message_from_file(fp)
! fp.close()
!
! counter = 1
! for part in msg.walk():
! # multipart/* are just containers
! if part.get_main_type() == 'multipart':
! continue
! # Applications should really sanitize the given filename so that an
! # email message can't be used to overwrite important files
! filename = part.get_filename()
! if not filename:
! ext = mimetypes.guess_extension(part.get_type())
! if not ext:
! # Use a generic bag-of-bits extension
! ext = '.bin'
! filename = 'part-\%03d\%s' \% (counter, ext)
! counter += 1
! fp = open(os.path.join(dir, filename), 'wb')
! fp.write(part.get_payload(decode=1))
! fp.close()
!
!
! if __name__ == '__main__':
! main()
! \end{verbatim}