mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| """Send the contents of a directory as a MIME message."""
 | |
| 
 | |
| import os
 | |
| import sys
 | |
| import smtplib
 | |
| # For guessing MIME type based on file name extension
 | |
| import mimetypes
 | |
| 
 | |
| from argparse import ArgumentParser
 | |
| 
 | |
| from email import encoders
 | |
| from email.message import Message
 | |
| from email.mime.audio import MIMEAudio
 | |
| from email.mime.base import MIMEBase
 | |
| from email.mime.image import MIMEImage
 | |
| from email.mime.multipart import MIMEMultipart
 | |
| from email.mime.text import MIMEText
 | |
| 
 | |
| COMMASPACE = ', '
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     parser = ArgumentParser(description="""\
 | |
| Send the contents of a directory as a MIME message.
 | |
| Unless the -o option is 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.
 | |
| """)
 | |
|     parser.add_argument('-d', '--directory',
 | |
|                         help="""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.""")
 | |
|     parser.add_argument('-o', '--output',
 | |
|                         metavar='FILE',
 | |
|                         help="""Print the composed message to FILE instead of
 | |
|                         sending the message to the SMTP server.""")
 | |
|     parser.add_argument('-s', '--sender', required=True,
 | |
|                         help='The value of the From: header (required)')
 | |
|     parser.add_argument('-r', '--recipient', required=True,
 | |
|                         action='append', metavar='RECIPIENT',
 | |
|                         default=[], dest='recipients',
 | |
|                         help='A To: header value (at least one required)')
 | |
|     args = parser.parse_args()
 | |
|     directory = args.directory
 | |
|     if not directory:
 | |
|         directory = '.'
 | |
|     # Create the enclosing (outer) message
 | |
|     outer = MIMEMultipart()
 | |
|     outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
 | |
|     outer['To'] = COMMASPACE.join(args.recipients)
 | |
|     outer['From'] = args.sender
 | |
|     outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
 | |
| 
 | |
|     for filename in os.listdir(directory):
 | |
|         path = os.path.join(directory, 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':
 | |
|             with open(path) as fp:
 | |
|                 # Note: we should handle calculating the charset
 | |
|                 msg = MIMEText(fp.read(), _subtype=subtype)
 | |
|         elif maintype == 'image':
 | |
|             with open(path, 'rb') as fp:
 | |
|                 msg = MIMEImage(fp.read(), _subtype=subtype)
 | |
|         elif maintype == 'audio':
 | |
|             with open(path, 'rb') as fp:
 | |
|                 msg = MIMEAudio(fp.read(), _subtype=subtype)
 | |
|         else:
 | |
|             with open(path, 'rb') as fp:
 | |
|                 msg = MIMEBase(maintype, subtype)
 | |
|                 msg.set_payload(fp.read())
 | |
|             # 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 or store the message
 | |
|     composed = outer.as_string()
 | |
|     if args.output:
 | |
|         with open(args.output, 'w') as fp:
 | |
|             fp.write(composed)
 | |
|     else:
 | |
|         with smtplib.SMTP('localhost') as s:
 | |
|             s.sendmail(args.sender, args.recipients, composed)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 | 
