def init_mailthon(self): self.postman = Postman( host=self.server, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ], )
def test_send_email_example(self, smtpserver): p = Postman(*smtpserver.addr) r = p.send(email( content='<p>Hello 世界</p>', subject='Hello world', sender='John <*****@*****.**>', receivers=['*****@*****.**'], )) assert r.ok assert len(smtpserver.outbox) == 1
def send_email(config, user_email, subject, content): envelope = email(sender=SENDER, receivers=[user_email], subject=subject, content=content) postman = Postman(host=config['host'], port=int(config['port']), middlewares=[TLS(force=True), Auth(username=config['username'], password=config['password'])]) postman.send(envelope)
def test_send_email_example(self, smtpserver): p = Postman(*smtpserver.addr) r = p.send( email( content='<p>Hello 世界</p>', subject='Hello world', sender='John <*****@*****.**>', receivers=['*****@*****.**'], )) assert r.ok assert len(smtpserver.outbox) == 1
def send_email(config, user_email, subject, content): envelope = email(sender=SENDER, receivers=[user_email], subject=subject, content=content) postman = Postman( host=config["mail.host"], port=int(config["mail.port"]), middlewares=[TLS(force=True), Auth(username=config["mail.username"], password=config["mail.password"])], ) try: response = postman.send(envelope) if response.ok: logger.info("Successfully send email to %s" % user_email) else: logger.error("Failed to send email to %s" % user_email) except Exception, e: logger.error("Exception occured when send email to %s" % e)
def __init__(self): """check email-service parameters from config.py""" if self.host == "": self.error_message = "Email Error: host is empty" elif self.username == "": self.error_message = "Email Error: username is empty" elif self.password == "": self.error_message = "Email Error: password is empty" else: self.available = True # initial postman self.postman = Postman(host=self.host, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ])
def send_email(config, user_email, subject, content): envelope = email( sender=SENDER, receivers=[user_email], subject=subject, content=content ) postman = Postman(host=config['mail.host'], port=int(config['mail.port']), middlewares=[TLS(force=True), Auth(username=config['mail.username'], password=config['mail.password'])]) try: response = postman.send(envelope) if response.ok: logger.info("Successfully send email to %s" % user_email) else: logger.error("Failed to send email to %s" % user_email) except Exception, e: logger.error("Exception occured when send email to %s" % e)
def email(): postman = Postman( host='SOLLOES-VM02.SOLLOBRASIL.NET', port=587, middlewares=[ TLS(force=True), Auth(username='******', password='******') ], ) envelope = email( sender='sender <*****@*****.**>', receivers=['*****@*****.**'], subject='Manutenção/Suporte', content='', ) response = postman.send(envelope) print(response.message) print(response.status_code) if response.ok: print("OK! :)")
def postman(self): def config(**kwargs): session.opts = kwargs return session session = Mock(spec=Session) session.side_effect = config session.send.return_value = SendmailResponse(250, 'ok', {}) return Postman( session=session, host='host', port=1000, )
def test_send_email_attachment(self, smtpserver): p = Postman(*smtpserver.addr) r = p.send(email( sender='Me <*****@*****.**>', receivers=['*****@*****.**'], subject='Something', content='<p>hi</p>', attachments=['tests/assets/spacer.gif'], cc=['*****@*****.**', '*****@*****.**'], bcc=['*****@*****.**', '*****@*****.**'], encoding='ascii', )) assert r.ok assert len(smtpserver.outbox) == 1 message = smtpserver.outbox[0] assert message['Content-Type'].startswith('multipart/mixed') assert message['Subject'] == 'Something' assert message['To'] == '*****@*****.**' assert message['CC'] == '[email protected], [email protected]' assert message['From'] == 'Me <*****@*****.**>'
def test_send_email_attachment(self, smtpserver): p = Postman(*smtpserver.addr) r = p.send( email( sender='Me <*****@*****.**>', receivers=['*****@*****.**'], subject='Something', content='<p>hi</p>', attachments=['tests/assets/spacer.gif'], cc=['*****@*****.**', '*****@*****.**'], bcc=['*****@*****.**', '*****@*****.**'], encoding='ascii', )) assert r.ok assert len(smtpserver.outbox) == 1 message = smtpserver.outbox[0] assert message['Content-Type'].startswith('multipart/mixed') assert message['Subject'] == 'Something' assert message['To'] == '*****@*****.**' assert message['CC'] == '[email protected], [email protected]' assert message['From'] == 'Me <*****@*****.**>'
def __init__(self): """check email-service parameters from config.py""" if self.host == "": self.error_message = "Email Error: host is empty" elif self.username == "": self.error_message = "Email Error: username is empty" elif self.password == "": self.error_message = "Email Error: password is empty" else: self.available = True # initial postman self.postman = Postman( host=self.host, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ] )
def postman(host, port=587, auth=(None, None), force_tls=False, options=None): """ Creates a Postman object with TLS and Auth middleware. TLS is placed before authentication because usually authentication happens and is accepted only after TLS is enabled. :param auth: Tuple of (username, password) to be used to ``login`` to the server. :param force_tls: Whether TLS should be forced. :param options: Dictionary of keyword arguments to be used when the SMTP class is called. """ return Postman(host=host, port=port, middlewares=[ middleware.tls(force=force_tls), middleware.auth(*auth), ], **options)
class Email(object): """ Provide Emails Sending Service Example for config.py: "email": { "host": "smtp.gmail.com", "port": 587, "username": "******", "password": "******" } """ available = False host = safe_get_config("email.host", "") port = safe_get_config("email.port", 587) username = safe_get_config("email.username", "") password = safe_get_config("email.password", "") postman = None error_message = "" def __init__(self): """check email-service parameters from config.py""" if self.host == "": self.error_message = "Email Error: host is empty" elif self.username == "": self.error_message = "Email Error: username is empty" elif self.password == "": self.error_message = "Email Error: password is empty" else: self.available = True # initial postman self.postman = Postman(host=self.host, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ]) def send_emails(self, sender, receivers, subject, content, cc=[], bcc=[], attachments=[]): """Send emails notes: No all email-service providers support. if using Gmail, enable "Access for less secure apps" for the sender's account, Examples: xxx.send_emails("James [email protected]", ['*****@*****.**', '*****@*****.**'], 'Subject: Hello', '<b>Hi! Here is the content of email</b>', ['*****@*****.**', '*****@*****.**'], ['*****@*****.**', '*****@*****.**'], ['C:/apache-maven-3.3.3-bin.zip']) :type sender: str|unicode :param sender: the nickname and email address of sender. Example:"James [email protected]" :type receivers: list :param receivers: receivers' emails address. Example:['*****@*****.**', '*****@*****.**'] :type subject: str|unicode :param subject: subject of email's header. Example:'Hello' :type content: str|unicode :param content: content of the email. Example:'<b>Hi!</b>' :type cc: list :param cc: CarbonCopy. Example:['*****@*****.**', '*****@*****.**'] :type bcc: list :param bcc: BlindCarbonCopy. Example:['*****@*****.**', '*****@*****.**'] :type attachments: list :param attachments: Example:['C:/Users/Administrator/Downloads/apache-maven-3.3.3-bin.zip'] :rtype boolean :return True if send emails successfully. False if fails to send. """ if not self.available: log.error(self.error_message) return False e = email(sender=sender, receivers=receivers, cc=cc, bcc=bcc, subject=subject, content=content) try: response = self.postman.send(e) if response.status_code == EMAIL_SMTP_STATUSCODE.SUCCESS: return True log.error("Send emails fail: " + response.message) return False except Exception as e: log.error(e) return False
def postman(self, smtp): postman = Postman(self.host, self.port) postman.transport = smtp return postman
from mailthon.postman import Postman from mailthon.middleware import TLS, Auth from mailthon import email while (True): postman = Postman( host='smtp-mail.outlook.com', port=587, middlewares=[ TLS(force=True), Auth(username='******', password='') ], ) envelope = email( sender='sender <*****@*****.**>', receivers=['*****@*****.**'], subject='Manutenção/Suporte', content='Hi', ) response = postman.send(envelope) print(response.message) print(response.status_code) if response.ok: print("OK! :)")
class Postie(object): def __init__(self, args): self.args = args self.template = self.args.template self.csv = self.args.csv self.sender = self.args.sender self.subject = self.args.subject self.server = self.args.server self.port = self.args.port self.username = self.args.user self.password = self.args.password self.token = self.args.token self.sid = self.args.sid def init_mailthon(self): self.postman = Postman( host=self.server, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ], ) def init_twilio(self): self.client = TwilioRestClient(self.sid, self.token) @property def csv_content(self): """ Read the csv file and return a list of rows. """ with open(self.csv, 'rb') as fp: reader = csv.reader(fp) content = [item for item in reader] return content @property def dict_template(self): """ Return an ordered dict with all the headers from csv file. """ headers = self.csv_content[0] template_var_list = [each.strip() for each in headers][1:] return OrderedDict.fromkeys(template_var_list) def validate_header(self, mode): """ Check is the first column of csv file contains email or phone number. """ headers = self.csv_content[0] email_header = headers[0] if headers[0].lower() == mode else None if email_header is None: print "First column needs to have %s" % mode def render_template(self, **kwargs): """ Render message template with Jinja 2 Engine """ with open(self.template, 'rb') as fp: template = Template(fp.read().strip()) return template.render(**kwargs) def send_async_email(self, envelope): self.postman.send(envelope) def send_async_sms(self, msg, to, from_): try: self.client.messages.create(body=msg, to=to, from_=from_) except twilio.TwilioRestException as e: print e def construct_msg(self, arg_list): """ Insert the keyword values from csv file to the template. """ template_kwargs = self.dict_template for i, key in enumerate(template_kwargs): template_kwargs[key] = arg_list[i + 1].strip() return self.render_template(**template_kwargs) def send_sms(self): content = self.csv_content[1:] for row in content: msg = self.construct_msg(row) thr = Thread(target=self.send_async_sms, args=[msg, row[0], self.sender]) thr.start() return thr def send_emails(self): content = self.csv_content[1:] for row in content: envelope = email(sender=self.sender, receivers=[row[0]], subject=self.subject, content=self.construct_msg(row)) # Spawn a thread for each email delivery thr = Thread(target=self.send_async_email, args=[envelope]) thr.start() return thr def run(self): if self.token and self.sid is not None: print "Sending SMS using Twilo..." self.init_twilio() self.send_sms() print "Done sending text messages!" elif self.username and self.password is not None: print "Sending Emails..." self.init_mailthon() self.send_emails() print "Done sending emails!" else: print "Run postie --help for usage information"
class Postie(object): def __init__(self, args): self.args = args self.template = self.args.template self.csv = self.args.csv self.sender = self.args.sender self.subject = self.args.subject self.server = self.args.server self.port = self.args.port self.username = self.args.user self.password = self.args.password self.token = self.args.token self.sid = self.args.sid def init_mailthon(self): self.postman = Postman( host=self.server, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ], ) def init_twilio(self): self.client = TwilioRestClient(self.sid, self.token) @property def csv_content(self): """ Read the csv file and return a list of rows. """ with open(self.csv, 'rb') as fp: reader = csv.reader(fp) content = [item for item in reader] return content @property def dict_template(self): """ Return an ordered dict with all the headers from csv file. """ headers = self.csv_content[0] template_var_list = [each.strip() for each in headers][1:] return OrderedDict.fromkeys(template_var_list) def validate_header(self, mode): """ Check is the first column of csv file contains email or phone number. """ headers = self.csv_content[0] email_header = headers[0] if headers[0].lower() == mode else None if email_header is None: print "First column needs to have %s" % mode def render_template(self, **kwargs): """ Render message template with Jinja 2 Engine """ with open(self.template, 'rb') as fp: template = Template(fp.read().strip()) return template.render(**kwargs) def send_async_email(self, envelope): self.postman.send(envelope) def send_async_sms(self, msg, to, from_): try: self.client.messages.create(body=msg, to=to, from_=from_) except twilio.TwilioRestException as e: print e def construct_msg(self, arg_list): """ Insert the keyword values from csv file to the template. """ template_kwargs = self.dict_template for i, key in enumerate(template_kwargs): template_kwargs[key] = arg_list[i + 1].strip() return self.render_template(**template_kwargs) def send_sms(self): content = self.csv_content[1:] for row in content: msg = self.construct_msg(row) thr = Thread( target=self.send_async_sms, args=[msg, row[0], self.sender]) thr.start() return thr def send_emails(self): content = self.csv_content[1:] for row in content: envelope = email( sender=self.sender, receivers=[row[0]], subject=self.subject, content=self.construct_msg(row)) # Spawn a thread for each email delivery thr = Thread(target=self.send_async_email, args=[envelope]) thr.start() return thr def run(self): if self.token and self.sid is not None: print "Sending SMS using Twilo..." self.init_twilio() self.send_sms() print "Done sending text messages!" elif self.username and self.password is not None: print "Sending Emails..." self.init_mailthon() self.send_emails() print "Done sending emails!" else: print "Run postie --help for usage information"
class Email(object): """ Provide Emails Sending Service Example for config.py: "email": { "host": "smtp.gmail.com", "port": 587, "username": "******", "password": "******" } """ available = False host = safe_get_config("email.host", "") port = safe_get_config("email.port", 587) username = safe_get_config("email.username", "") password = safe_get_config("email.password", "") postman = None error_message = "" def __init__(self): """check email-service parameters from config.py""" if self.host == "": self.error_message = "Email Error: host is empty" elif self.username == "": self.error_message = "Email Error: username is empty" elif self.password == "": self.error_message = "Email Error: password is empty" else: self.available = True # initial postman self.postman = Postman( host=self.host, port=self.port, middlewares=[ TLS(force=True), Auth(username=self.username, password=self.password) ] ) def send_emails(self, sender, receivers, subject, content, cc=[], bcc=[], attachments=[]): """Send emails notes: No all email-service providers support. if using Gmail, enable "Access for less secure apps" for the sender's account, Examples: xxx.send_emails("James [email protected]", ['*****@*****.**', '*****@*****.**'], 'Subject: Hello', '<b>Hi! Here is the content of email</b>', ['*****@*****.**', '*****@*****.**'], ['*****@*****.**', '*****@*****.**'], ['C:/apache-maven-3.3.3-bin.zip']) :type sender: str|unicode :param sender: the nickname and email address of sender. Example:"James [email protected]" :type receivers: list :param receivers: receivers' emails address. Example:['*****@*****.**', '*****@*****.**'] :type subject: str|unicode :param subject: subject of email's header. Example:'Hello' :type content: str|unicode :param content: content of the email. Example:'<b>Hi!</b>' :type cc: list :param cc: CarbonCopy. Example:['*****@*****.**', '*****@*****.**'] :type bcc: list :param bcc: BlindCarbonCopy. Example:['*****@*****.**', '*****@*****.**'] :type attachments: list :param attachments: Example:['C:/Users/Administrator/Downloads/apache-maven-3.3.3-bin.zip'] :rtype boolean :return True if send emails successfully. False if fails to send. """ if not self.available: log.error(self.error_message) return False e = email(sender=sender, receivers=receivers, cc=cc, bcc=bcc, subject=subject, content=content) try: response = self.postman.send(e) if response.status_code == EMAIL_SMTP_STATUSCODE.SUCCESS: return True log.error("Send emails fail: " + response.message) return False except Exception as e: log.error(e) return False
def postman(self, smtp): p = Postman(self.host, self.port) p.transport = smtp return p
def test_debuglevel_was_used(self, smtp): p = Postman(self.host, self.port, options=dict(debug_level=1)) p.transport = smtp with p.connection() as conn: pass smtp.set_debuglevel.called_once_with(1)