mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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.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()
 | 
