mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			124 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			124 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()
							 |