def test_alternate_transaction_manager(self): from repoze.sendmail.delivery import DirectMailDelivery from email.message import Message import transaction mailer = _makeMailerStub() delivery = DirectMailDelivery(mailer) tm = transaction.TransactionManager() delivery.transaction_manager = tm fromaddr = "Jim <*****@*****.**>" toaddrs = ('Guido <*****@*****.**>', 'Steve <*****@*****.**>') message = Message() message["From"] = fromaddr message["To"] = ",".join(toaddrs) message["Date"] = "Date: Mon, 19 May 2003 10:17:36 -0400" message["Subject"] = "example" message.set_payload("This is just an example\n") msgid = delivery.send(fromaddr, toaddrs, message) transaction.commit() self.assertEqual(len(mailer.sent_messages), 0) t = tm.get() data_manager = t._resources[0] self.assertTrue(data_manager.transaction_manager is tm) t.commit() self.assertEqual(len(mailer.sent_messages), 1) self.assertEqual(mailer.sent_messages[0][0], fromaddr) self.assertEqual(mailer.sent_messages[0][1], toaddrs) self.assertEqual(mailer.sent_messages[0][2].get_payload(), "This is just an example\n") mailer.sent_messages = [] msgid = delivery.send(fromaddr, toaddrs, message) tm.get().abort() self.assertEqual(len(mailer.sent_messages), 0)
def __init__(self): ''' :ivar to_addr: The default recipient email address Will be set to the configuration variable "email_to", if configuration is available :ivar from_addr: The default sender email address Will be set to the configuration variable "admin_email_from", if configuration is available ''' self.to_addr = config.get('email_to') self.from_addr = config.get('admin_email_from') smtp_server = config.get('smtp_server') smtp_use_tls = asbool(config.get('smtp_use_tls')) smtp_username = config.get('smtp_username') smtp_password = config.get('smtp_password') test = asbool(config.get('test')) if test: log.debug('Using DummyDelivery()') self.delivery = DummyDelivery() else: # pragma: no cover if smtp_server: mailer = SMTPMailer(hostname=smtp_server, username=smtp_username, password=smtp_password, force_tls=smtp_use_tls) log.debug('Using SMTPMailer(hostname=%s, ...)', smtp_server) else: mailer = SendmailMailer() log.debug('Using SendmailMailer()') self.delivery = DirectMailDelivery(mailer)
def testInterface(self): from repoze.sendmail.interfaces import IDirectMailDelivery from repoze.sendmail.delivery import DirectMailDelivery mailer = MailerStub() delivery = DirectMailDelivery(mailer) verifyObject(IDirectMailDelivery, delivery) self.assertEqual(delivery.mailer, mailer)
def testRefusingMailerDiesInVote(self): from repoze.sendmail.delivery import DirectMailDelivery mailer = RefusingMailerStub() delivery = DirectMailDelivery(mailer) fromaddr = 'Jim <*****@*****.**' toaddrs = ('Guido <*****@*****.**>', 'Steve <steve@examplecom>') opt_headers = ('From: Jim <*****@*****.**>\n' 'To: some-zope-coders:;\n' 'Date: Mon, 19 May 2003 10:17:36 -0400\n' 'Message-Id: <*****@*****.**>\n') message = ('Subject: example\n' '\n' 'This is just an example\n') msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) try: transaction.commit() except: if transaction.get()._voted: # We voted for commit then failed, reraise raise else: # We vetoed a commit, that's good. pass else: self.fail("Did not raise an exception in vote") finally: # Clean up after ourselves transaction.abort()
def createDirectDelivery(): mailerObject = queryUtility(IMailer, mailer) if mailerObject is None: raise ConfigurationError("Mailer %r is not defined" % mailer) delivery = DirectMailDelivery(mailerObject) handler('registerUtility', delivery, IMailDelivery, name)
def __init__(self, host='localhost', port=25, username=None, password=None, tls=False, ssl=False, keyfile=None, certfile=None, queue_path=None, default_sender=None, sendmail_app=None, sendmail_template=None, debug=0): if ssl: self.smtp_mailer = SMTP_SSLMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug, keyfile=keyfile, certfile=certfile) else: self.smtp_mailer = SMTPMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug) self.direct_delivery = DirectMailDelivery(self.smtp_mailer) if queue_path: self.queue_delivery = QueuedMailDelivery(queue_path) else: self.queue_delivery = None self.sendmail_mailer = SendmailMailer(sendmail_app, sendmail_template) self.sendmail_delivery = DirectMailDelivery(self.sendmail_mailer) self.default_sender = default_sender
def test_abort(self): import transaction mailer = _makeMailerStub() delivery = DirectMailDelivery(mailer) ( fromaddr , toaddrs ) = fromaddr_toaddrs() message = sample_message() msgid = delivery.send(fromaddr, toaddrs, message) self.assertEqual(msgid, '<*****@*****.**>') self.assertEqual(mailer.sent_messages, []) transaction.abort() transaction.commit() self.assertEqual(mailer.sent_messages,[])
def testMakeMessageId(self): from repoze.sendmail.delivery import DirectMailDelivery from email.message import Message mailer = _makeMailerStub() delivery = DirectMailDelivery(mailer) fromaddr = 'Jim <*****@*****.**' toaddrs = ('Guido <*****@*****.**>', 'Steve <steve@examplecom>') message = Message() message['From'] = 'Jim <*****@*****.**>' message['To'] = 'some-zope-coders:;' message['Date'] = 'Date: Mon, 19 May 2003 10:17:36 -0400' message['Subject'] = 'example' message.set_payload('This is just an example\n') msgid = delivery.send(fromaddr, toaddrs, message) self.assertTrue('.repoze.sendmail@' in msgid) self.assertEqual(message['Message-Id'], msgid)
def testBrokenMailerErrorsAreEaten(self): from repoze.sendmail.delivery import DirectMailDelivery mailer = BrokenMailerStub() delivery = DirectMailDelivery(mailer) fromaddr = 'Jim <*****@*****.**' toaddrs = ('Guido <*****@*****.**>', 'Steve <steve@examplecom>') opt_headers = ('From: Jim <*****@*****.**>\n' 'To: some-zope-coders:;\n' 'Date: Mon, 19 May 2003 10:17:36 -0400\n' 'Message-Id: <*****@*****.**>\n') message = ('Subject: example\n' '\n' 'This is just an example\n') msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) try: transaction.commit() finally: # Clean up after ourselves transaction.abort()
def test_send(self): from repoze.sendmail.delivery import DirectMailDelivery import transaction from email.message import Message mailer = _makeMailerStub() delivery = DirectMailDelivery(mailer) fromaddr = 'Jim <*****@*****.**' toaddrs = ('Guido <*****@*****.**>', 'Steve <steve@examplecom>') message = Message() message['From'] = 'Jim <*****@*****.**>' message['To'] = 'some-zope-coders:;' message['Date'] = 'Date: Mon, 19 May 2003 10:17:36 -0400' message['Message-Id'] = ext_msgid = '<*****@*****.**>' message['Subject'] = 'example' message.set_payload('This is just an example\n') msgid = delivery.send(fromaddr, toaddrs, message) self.assertEqual(msgid, '<*****@*****.**>') self.assertEqual(mailer.sent_messages, []) transaction.commit() self.assertEqual(mailer.sent_messages, [(fromaddr, toaddrs, message)]) mailer.sent_messages = [] msgid = delivery.send(fromaddr, toaddrs, message) self.assertTrue('@' in msgid) self.assertEqual(mailer.sent_messages, []) transaction.commit() self.assertEqual(len(mailer.sent_messages), 1) self.assertEqual(mailer.sent_messages[0][0], fromaddr) self.assertEqual(mailer.sent_messages[0][1], toaddrs) self.assertEqual(mailer.sent_messages[0][2].get_payload(), 'This is just an example\n') self.assertEqual(message['Message-Id'], msgid) self.assertEqual(message['Message-Id'], ext_msgid) mailer.sent_messages = [] msgid = delivery.send(fromaddr, toaddrs, message) self.assertEqual(mailer.sent_messages, []) transaction.abort() self.assertEqual(mailer.sent_messages, [])
def testSMTPErrorInSendDoesntAbortTPC(self): from repoze.sendmail.delivery import DirectMailDelivery mailer = SMTPResponseExceptionMailerStub(505) delivery = DirectMailDelivery(mailer) fromaddr = 'Jim <*****@*****.**' toaddrs = ('Guido <*****@*****.**>', 'Steve <steve@examplecom>') opt_headers = ('From: Jim <*****@*****.**>\n' 'To: some-zope-coders:;\n' 'Date: Mon, 19 May 2003 10:17:36 -0400\n' 'Message-Id: <*****@*****.**>\n') message = ('Subject: example\n' '\n' 'This is just an example\n') msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) try: transaction.commit() except Exception as e: self.fail(str(e)) finally: # Clean up after ourselves transaction.abort()
def send_mail(message: Message, _from: str, to: list, smtp_settings: dict, username: str, password: str, tls: bool = False, ssl: bool = False, debug: bool = False) -> None: host = smtp_settings['host'] port = smtp_settings['port'] # Begin transaction. Idk fully how this lib works but it's needed transaction.manager.begin() try: # Create a new SMTP mailer using vars declared above. # TODO Debug should be True or False depending on if debug mode is on # Idea TO DO to Github Issue plugin mailer = SMTPMailer(hostname=host, port=port, username=username, password=password, ssl=ssl, no_tls=not tls, debug_smtp=debug) # Need an object to deliver mail (for some reason) # TODO QueuedMailLDelvery support delivery = DirectMailDelivery(mailer) delivery.send(_from, to, message) # Commit transaction, this actually makes sure the thing is done transaction.manager.commit() # TODO Make Exception handling more specific except Exception as e: transaction.manager.abort() raise e
def testSend(self): from repoze.sendmail.delivery import DirectMailDelivery mailer = MailerStub() delivery = DirectMailDelivery(mailer) fromaddr = 'Jim <*****@*****.**' toaddrs = ('Guido <*****@*****.**>', 'Steve <steve@examplecom>') opt_headers = ('From: Jim <*****@*****.**>\n' 'To: some-zope-coders:;\n' 'Date: Mon, 19 May 2003 10:17:36 -0400\n' 'Message-Id: <*****@*****.**>\n') message = ('Subject: example\n' '\n' 'This is just an example\n') msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) self.assertEquals(msgid, '*****@*****.**') self.assertEquals(mailer.sent_messages, []) transaction.commit() self.assertEquals(mailer.sent_messages, [(fromaddr, toaddrs, opt_headers + message)]) mailer.sent_messages = [] msgid = delivery.send(fromaddr, toaddrs, message) self.assert_('@' in msgid) self.assertEquals(mailer.sent_messages, []) transaction.commit() self.assertEquals(len(mailer.sent_messages), 1) self.assertEquals(mailer.sent_messages[0][0], fromaddr) self.assertEquals(mailer.sent_messages[0][1], toaddrs) self.assert_(mailer.sent_messages[0][2].endswith(message)) new_headers = mailer.sent_messages[0][2][:-len(message)] self.assert_(new_headers.find('Message-Id: <%s>' % msgid) != -1) mailer.sent_messages = [] msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) self.assertEquals(mailer.sent_messages, []) transaction.abort() self.assertEquals(mailer.sent_messages, [])
def test_savepoint(self): import transaction mailer = _makeMailerStub() delivery = DirectMailDelivery(mailer) ( fromaddr , toaddrs ) = fromaddr_toaddrs() bodies_good = {} bodies_bad = {} for i in ( 1,3,5, ): bodies_good[i] = 'Sample Body - %s | Good' % i for i in ( 2,4,6, ): bodies_bad[i] = 'Sample Body - %s | Bad' % i bodies_all = dict(list(bodies_good.items()) + list(bodies_bad.items())) transaction.begin() for i in range(1,7) : sp = transaction.savepoint() body = bodies_all[i] message = sample_message(body=body) msgid = delivery.send(fromaddr, toaddrs, message) self.assertEqual(msgid, '<*****@*****.**>') self.assertEqual(mailer.sent_messages, []) if i in bodies_bad : sp.rollback() # we shouldn't have sent anything self.assertEqual(mailer.sent_messages, []) # so now let's commit transaction.commit() # make sure we have the right number of messages self.assertEqual(len(mailer.sent_messages), len(bodies_good.values())) # generate our expected body bodies_expected = bodies_good.values() # make sure our bodies are only good for f, t, m in mailer.sent_messages : self.assertTrue(m._payload in bodies_expected) ## ok, can we do multiple savepoints ? active_transaction = transaction.manager.get() mailer.sent_messages = [] transaction.begin() sp_outer = transaction.savepoint() for i in range(1,7) : sp = transaction.savepoint() body = bodies_all[i] message = sample_message(body=body) msgid = delivery.send(fromaddr, toaddrs, message) self.assertEqual(msgid, '<*****@*****.**>') self.assertEqual(mailer.sent_messages, []) sp3 = transaction.savepoint() sp3.rollback() if i in bodies_bad : sp.rollback() sp_outer.rollback()
def __init__(self, **kw): smtp_mailer = kw.pop('smtp_mailer', None) if smtp_mailer is None: host = kw.pop('host', 'localhost') port = kw.pop('port', 25) username = kw.pop('username', None) password = kw.pop('password', None) tls = kw.pop('tls', False) ssl = kw.pop('ssl', False) keyfile = kw.pop('keyfile', None) certfile = kw.pop('certfile', None) debug = kw.pop('debug', 0) if ssl: smtp_mailer = SMTP_SSLMailer(hostname=host, port=port, username=username, password=password, no_tls=not (tls), force_tls=tls, debug_smtp=debug, keyfile=keyfile, certfile=certfile) else: smtp_mailer = SMTPMailer(hostname=host, port=port, username=username, password=password, no_tls=not (tls), force_tls=tls, debug_smtp=debug) self.smtp_mailer = smtp_mailer sendmail_mailer = kw.pop('sendmail_mailer', None) if sendmail_mailer is None: sendmail_mailer = SendmailMailer( kw.pop('sendmail_app', None), kw.pop('sendmail_template', None), ) self.sendmail_mailer = sendmail_mailer self.queue_path = kw.pop('queue_path', None) self.default_sender = kw.pop('default_sender', None) transaction_manager = kw.pop('transaction_manager', None) if transaction_manager is None: transaction_manager = transaction.manager self.transaction_manager = transaction_manager if kw: raise ValueError('invalid options: %s' % ', '.join(sorted(kw.keys()))) self.direct_delivery = DirectMailDelivery( self.smtp_mailer, transaction_manager=transaction_manager) if self.queue_path: self.queue_delivery = QueuedMailDelivery( self.queue_path, transaction_manager=transaction_manager) else: self.queue_delivery = None self.sendmail_delivery = DirectMailDelivery( self.sendmail_mailer, transaction_manager=transaction_manager)
from pyramid.url import resource_url from repoze.sendmail.delivery import DirectMailDelivery from repoze.sendmail.mailer import SMTPMailer from repoze.sendmail.interfaces import IMailDelivery from repoze.who.api import get_api from zope.interface import directlyProvides from zope.password.password import SSHAPasswordManager from cartouche.interfaces import IAutoLogin from cartouche.interfaces import ICameFromURL from cartouche.interfaces import IPasswordGenerator from cartouche.interfaces import ITokenGenerator # By default, deliver e-mail via localhost, port 25. localhost_mta = DirectMailDelivery(SMTPMailer()) def _fixup_url(context, request, base_url, **extra_qs): if base_url.startswith('/'): base_url = urljoin(resource_url(context, request), base_url) (sch, netloc, path, parms, qs, frag) = urlparse(base_url) qs_items = parse_qsl(qs) + extra_qs.items() qs = urlencode(qs_items, 1) return urlunparse((sch, netloc, path, parms, qs, frag)) def view_url(context, request, key, default_name, **extra_qs): configured = request.registry.settings.get('cartouche.%s' % key) if configured is None: if extra_qs: