mirror of
https://github.com/python/cpython.git
synced 2025-07-25 12:14:38 +00:00

\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.
123 lines
3.6 KiB
Python
123 lines
3.6 KiB
Python
#!/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()
|