mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			3.7 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.MIMEBase import MIMEBase
 | 
						|
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()
 |