def patchedSend(self, mfrom, mto, messageText, immediate=False): """ Send the message """ if IThemeSpecific in registered_layers(): patchedEmailAddress = getMailAddress() if patchedEmailAddress: mto = patchedEmailAddress if isinstance(messageText, Message): # We already have a message, make a copy to operate on mo = deepcopy(messageText) else: # Otherwise parse the input message mo = message_from_string(messageText) if mo.get('Bcc'): del mo['Bcc'] if mo.get('Cc'): del mo['Cc'] if mo.get('To'): del mo['To'] mo['To'] = mto messageText = mo.as_string() if immediate: self._makeMailer().send(mfrom, mto, messageText) else: if self.smtp_queue: # Start queue processor thread, if necessary self._startQueueProcessorThread() delivery = QueuedMailDelivery(self.smtp_queue_directory) else: delivery = DirectMailDelivery(self._makeMailer()) delivery.send(mfrom, mto, messageText)
def _send(self, mfrom, mto, messageText, immediate=False): """ Send the message """ if immediate: self._makeMailer().send(mfrom, mto, messageText) else: if self.smtp_queue: # Start queue processor thread, if necessary self._startQueueProcessorThread() delivery = QueuedMailDelivery(self.smtp_queue_directory) else: delivery = DirectMailDelivery(self._makeMailer()) delivery.send(mfrom, mto, messageText)
def testSend(self): from zope.sendmail.delivery import QueuedMailDelivery delivery = QueuedMailDelivery('/path/to/mailbox') fromaddr = '*****@*****.**' toaddrs = ('*****@*****.**', 'steve@examplecom') zope_headers = ('X-Zope-From: [email protected]\n' 'X-Zope-To: [email protected], steve@examplecom\n') 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.assertEqual(msgid, '*****@*****.**') self.assertEqual(MaildirWriterStub.commited_messages, []) self.assertEqual(MaildirWriterStub.aborted_messages, []) transaction.commit() self.assertEqual(MaildirWriterStub.commited_messages, [zope_headers + opt_headers + message]) self.assertEqual(MaildirWriterStub.aborted_messages, []) MaildirWriterStub.commited_messages = [] msgid = delivery.send(fromaddr, toaddrs, message) self.assertIn('@', msgid) self.assertEqual(MaildirWriterStub.commited_messages, []) self.assertEqual(MaildirWriterStub.aborted_messages, []) transaction.commit() self.assertEqual(len(MaildirWriterStub.commited_messages), 1) self.assertTrue( MaildirWriterStub.commited_messages[0].endswith(message) ) new_headers = MaildirWriterStub.commited_messages[0][:-len(message)] self.assertIn('Message-Id: <%s>' % msgid, new_headers) self.assertIn('X-Zope-From: %s' % fromaddr, new_headers) self.assertIn('X-Zope-To: %s' % ", ".join(toaddrs), new_headers) self.assertEqual(MaildirWriterStub.aborted_messages, []) MaildirWriterStub.commited_messages = [] msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) self.assertEqual(MaildirWriterStub.commited_messages, []) self.assertEqual(MaildirWriterStub.aborted_messages, []) transaction.abort() self.assertEqual(MaildirWriterStub.commited_messages, []) self.assertEqual(len(MaildirWriterStub.aborted_messages), 1)
def setUp(self): from zope.sendmail.delivery import QueuedMailDelivery from zope.sendmail.maildir import Maildir self.dir = mkdtemp() self.queue_dir = os.path.join(self.dir, "queue") self.delivery = QueuedMailDelivery(self.queue_dir) self.maildir = Maildir(self.queue_dir, True) self.mailer = MailerStub()
def testSend(self): from zope.sendmail.delivery import QueuedMailDelivery delivery = QueuedMailDelivery('/path/to/mailbox') fromaddr = '*****@*****.**' toaddrs = ('*****@*****.**', 'steve@examplecom') zope_headers = ('X-Zope-From: [email protected]\n' 'X-Zope-To: [email protected], steve@examplecom\n') 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(MaildirWriterStub.commited_messages, []) self.assertEquals(MaildirWriterStub.aborted_messages, []) transaction.commit() self.assertEquals(MaildirWriterStub.commited_messages, [zope_headers + opt_headers + message]) self.assertEquals(MaildirWriterStub.aborted_messages, []) MaildirWriterStub.commited_messages = [] msgid = delivery.send(fromaddr, toaddrs, message) self.assert_('@' in msgid) self.assertEquals(MaildirWriterStub.commited_messages, []) self.assertEquals(MaildirWriterStub.aborted_messages, []) transaction.commit() self.assertEquals(len(MaildirWriterStub.commited_messages), 1) self.assert_(MaildirWriterStub.commited_messages[0].endswith(message)) new_headers = MaildirWriterStub.commited_messages[0][:-len(message)] self.assert_(new_headers.find('Message-Id: <%s>' % msgid) != -1) self.assert_(new_headers.find('X-Zope-From: %s' % fromaddr) != 1) self.assert_(new_headers.find('X-Zope-To: %s' % ", ".join(toaddrs)) != 1) self.assertEquals(MaildirWriterStub.aborted_messages, []) MaildirWriterStub.commited_messages = [] msgid = delivery.send(fromaddr, toaddrs, opt_headers + message) self.assertEquals(MaildirWriterStub.commited_messages, []) self.assertEquals(MaildirWriterStub.aborted_messages, []) transaction.abort() self.assertEquals(MaildirWriterStub.commited_messages, []) self.assertEquals(len(MaildirWriterStub.aborted_messages), 1)
def send_email(sender, recipient, subject, body, attachments=[]): """ Asynchronous mail delivery """ msg = email.MIMEMultipart.MIMEMultipart() msg["From"] = sender msg["To"] = recipient msg["Subject"] = email.Header.Header(subject, 'UTF-8') msg.attach(email.MIMEText.MIMEText(body.encode('UTF-8'), 'plain', 'UTF-8')) for att in attachments: part = email.MIMEBase.MIMEBase('application', "octet-stream") part.set_payload(file(att, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(att)) msg.attach(part) config = getMailConfiguration() delivery = QueuedMailDelivery(config['maildir']) delivery.send(sender, [recipient], msg.as_string()) transaction.commit()
def createQueuedDelivery(): delivery = QueuedMailDelivery(queuePath) if permission is not None: delivery = _assertPermission(permission, IMailDelivery, delivery) handler('registerUtility', delivery, IMailDelivery, name) mailerObject = queryUtility(IMailer, mailer) if mailerObject is None: raise ConfigurationError("Mailer %r is not defined" % mailer) if processorThread: thread = QueueProcessorThread() thread.setMailer(mailerObject) thread.setQueuePath(queuePath) thread.start()
def create_emailUtilities(instance_id=None): '''Create the utilities to send the email messages :param str instance_id: The indentifier for the GroupServer instance :returns: ``None`` The :func:`create_emailUtilities` function loads the ``smtp`` section of the configuration of the instance specified by ``instance_id``. If no instance is specified then :func:`gs.config.getInstanceId` is used to determine the current instance. It then loads the following configuration options: * ``hostname`` * ``port`` * ``username`` * ``password`` * ``no_tls`` * ``force_tls`` * ``queuepath`` * ``processorthread`` * ``xverp`` If the XVERP option is ``True`` then :class:`gs.email.mailer.XVERPSMTPMailer` is registered as the utility used to connect to the SMTP host; otherwise :class:`zope.sendmail.mailer.SMTPMailer` is used. In either case the mailer is configured with the options in the config file.''' if not instance_id: instance_id = getInstanceId() config = Config(instance_id) config.set_schema('smtp', {'hostname': str, 'port': int, 'username': str, 'password': str, 'no_tls': bool_, 'force_tls': bool_, 'queuepath': str, 'processorthread': bool_, 'xverp': bool_}) smtpconfig = config.get('smtp', strict=False) name = '' for key in ('hostname', 'port', 'username', 'password', 'no_tls', 'force_tls'): name += '+%s+' % smtpconfig.get(key, None) gsm = getGlobalSiteManager() if not queryUtility(IMailer, 'gs.mailer.%s' % name): if smtpconfig.get('xverp', False): Mailer = XVERPSMTPMailer else: Mailer = SMTPMailer gsm.registerUtility( Mailer( hostname=smtpconfig.get('hostname', None), port=smtpconfig.get('port', None), username=smtpconfig.get('username', None), password=smtpconfig.get('password', None), no_tls=smtpconfig.get('no_tls', None), force_tls=smtpconfig.get('force_tls', None)), IMailer, name='gs.mailer.%s' % name) queuePath = smtpconfig.get('queuepath', '/tmp/mailqueue') if not queryUtility(IMailDelivery, name='gs.maildelivery'): delivery = QueuedMailDelivery(queuePath) gsm.registerUtility(delivery, IMailDelivery, name='gs.maildelivery') if smtpconfig.get('processorthread', True): mailerObject = getUtility(IMailer, 'gs.mailer.%s' % name) thread = QueueProcessorThread() thread.setMailer(mailerObject) thread.setQueuePath(queuePath) thread.start()
def testInterface(self): from zope.sendmail.interfaces import IQueuedMailDelivery from zope.sendmail.delivery import QueuedMailDelivery delivery = QueuedMailDelivery('/path/to/mailbox') verifyObject(IQueuedMailDelivery, delivery) self.assertEqual(delivery.queuePath, '/path/to/mailbox')