| 
									
										
										
										
											2002-10-01 14:17:10 +00:00
										 |  |  | #!/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 | 
					
						
							| 
									
										
										
										
											2003-11-21 20:28:15 +00:00
										 |  |  | from email.MIMEBase import MIMEBase | 
					
						
							| 
									
										
										
										
											2002-10-01 14:17:10 +00:00
										 |  |  | 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:] | 
					
						
							| 
									
										
										
										
											2004-07-18 06:25:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 14:17:10 +00:00
										 |  |  |     # 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() |