summaryrefslogtreecommitdiffstats
path: root/Doc/lib/email-dir.py
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2002-10-01 14:17:10 (GMT)
committerFred Drake <fdrake@acm.org>2002-10-01 14:17:10 (GMT)
commitfcc31b44d24e8e8bddc19b27c916a051223e5164 (patch)
tree2ceccfbe3d8dc6f73f94cb919d7c6c8fd1398c45 /Doc/lib/email-dir.py
parentea66abc6e2b5d9e88f7c91aee5cea6d331b0a288 (diff)
downloadcpython-fcc31b44d24e8e8bddc19b27c916a051223e5164.zip
cpython-fcc31b44d24e8e8bddc19b27c916a051223e5164.tar.gz
cpython-fcc31b44d24e8e8bddc19b27c916a051223e5164.tar.bz2
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.
Diffstat (limited to 'Doc/lib/email-dir.py')
-rw-r--r--Doc/lib/email-dir.py123
1 files changed, 123 insertions, 0 deletions
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()