| 746 | 1 #!/usr/bin/env python | 
|  | 2 # -*- coding: utf-8 -*- | 
|  | 3 | 
|  | 4 """ | 
|  | 5 | 
|  | 6 See: | 
|  | 7 - http://pymotw.com/2/smtplib/ | 
|  | 8 - http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/ | 
|  | 9 - https://github.com/CognitiveNetworks/daily-reports/blob/master/send_added_tv_count.py | 
|  | 10 """ | 
|  | 11 | 
|  | 12 import argparse | 
|  | 13 import email.utils | 
|  | 14 import os | 
|  | 15 import smtplib | 
|  | 16 import sys | 
|  | 17 from email.mime.text import MIMEText | 
|  | 18 | 
|  | 19 __all__ = ['main'] | 
|  | 20 | 
|  | 21 class MailSender(object): | 
|  | 22 | 
|  | 23     def __init__(self, host, sender, password, port=587, type='plain'): | 
|  | 24         self.host = host | 
|  | 25         self.sender = sender | 
|  | 26         self.password = password | 
|  | 27         self.port = port | 
|  | 28         self.type = type | 
|  | 29 | 
|  | 30     def __call__(self, message, *recipients, **headers): | 
|  | 31 | 
|  | 32         assert recipients | 
|  | 33 | 
|  | 34         # construct the message | 
|  | 35         msg = MIMEText(message, self.type) | 
|  | 36         headers.setdefault('From', self.sender) | 
|  | 37         headers.setdefault('To', ','.join(recipients)) | 
|  | 38         for key, value in headers.items(): | 
|  | 39             msg[key] = value | 
|  | 40 | 
|  | 41         # connect to mail server | 
|  | 42         server = smtplib.SMTP(self.host, self.port) | 
|  | 43         try: | 
|  | 44             server.set_debuglevel(True) | 
|  | 45 | 
|  | 46             # identify ourselves, prompting server for supported features | 
|  | 47             server.ehlo() | 
|  | 48 | 
|  | 49             # If we can encrypt this session, do it | 
|  | 50             if server.has_extn('STARTTLS'): | 
|  | 51                 server.starttls() | 
|  | 52                 server.ehlo() # re-identify ourselves over TLS connection | 
|  | 53 | 
|  | 54             # login | 
|  | 55             server.login(self.sender, self.password) | 
|  | 56 | 
|  | 57             # send the email | 
|  | 58             server.sendmail(self.sender, recipients, msg.as_string()) | 
|  | 59         finally: | 
|  | 60             server.quit() | 
|  | 61 | 
|  | 62 def main(args=sys.argv[1:]): | 
|  | 63 | 
|  | 64     # parse command line | 
|  | 65     parser = argparse.ArgumentParser(description=__doc__) | 
|  | 66     parser.add_argument('host') | 
|  | 67     parser.add_argument('sender') | 
|  | 68     parser.add_argument('password') | 
|  | 69     parser.add_argument('-r', '--recipients', dest='recipients', | 
|  | 70                         nargs='+', required=True, | 
|  | 71                         help="recipients") | 
|  | 72     parser.add_argument('-m', '--message', dest='message', required=True) | 
|  | 73     parser.add_argument('--port', dest='port', type=int, default=587, | 
|  | 74                         help="port to connect to [DEFAULT: %(default)s]") | 
|  | 75     options = parser.parse_args(args) | 
|  | 76 | 
|  | 77     message = options.message | 
|  | 78 | 
|  | 79     # instantiate sender | 
|  | 80     sender = MailSender(options.host, options.sender, options.password, options.port) | 
|  | 81 | 
|  | 82     # send email | 
|  | 83     sender(message, *options.recipients) | 
|  | 84 | 
|  | 85 | 
|  | 86 if __name__ == '__main__': | 
|  | 87     main() |