Split the long email package examples into separate files and use
\verbatiminput instead of the verbatim environment -- this does the "right
thing" regarding page breaks in long examples for the typeset formats, and
has nice benefits for the HTML version as well.
diff --git a/Doc/lib/email-dir.py b/Doc/lib/email-dir.py
new file mode 100644
index 0000000..aa3b5e5
--- /dev/null
+++ b/Doc/lib/email-dir.py
@@ -0,0 +1,123 @@
+#!/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()