[Zope-Checkins] SVN: Zope/trunk/lib/python/Products/MailHost/ Ship MailHost with our own TLS/SSL-aware SMTPMailer

Andreas Jung andreas at andreas-jung.com
Sun Aug 19 11:07:34 EDT 2007


Log message for revision 78994:
  Ship MailHost with our own TLS/SSL-aware SMTPMailer
  

Changed:
  U   Zope/trunk/lib/python/Products/MailHost/MailHost.py
  A   Zope/trunk/lib/python/Products/MailHost/mailer.py

-=-
Modified: Zope/trunk/lib/python/Products/MailHost/MailHost.py
===================================================================
--- Zope/trunk/lib/python/Products/MailHost/MailHost.py	2007-08-19 14:51:00 UTC (rev 78993)
+++ Zope/trunk/lib/python/Products/MailHost/MailHost.py	2007-08-19 15:07:33 UTC (rev 78994)
@@ -33,7 +33,6 @@
 from DateTime import DateTime
 
 from zope.interface import implements
-from zope.sendmail.mailer import SMTPMailer
 from zope.sendmail.maildir import Maildir
 from zope.sendmail.delivery import DirectMailDelivery, QueuedMailDelivery, \
                             QueueProcessorThread
@@ -41,6 +40,11 @@
 from interfaces import IMailHost
 from decorator import synchronized
 
+# Use our own TLS/SSL-aware mailer since the zope.sendmail does
+# not support TLS/SSL in this version (should be replaced with
+# the next version)
+from mailer import SMTPMailer
+
 queue_threads = {}  # maps MailHost path -> queue processor threada
 
 LOG = logging.getLogger('MailHost')

Added: Zope/trunk/lib/python/Products/MailHost/mailer.py
===================================================================
--- Zope/trunk/lib/python/Products/MailHost/mailer.py	                        (rev 0)
+++ Zope/trunk/lib/python/Products/MailHost/mailer.py	2007-08-19 15:07:33 UTC (rev 78994)
@@ -0,0 +1,72 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+"""
+SMTPMailer with TLS/SSL support
+(original code taken from zope.sendmail)
+
+$Id: mailer.py 78981 2007-08-19 06:38:48Z andreasjung $
+"""
+__docformat__ = 'restructuredtext'
+
+import socket
+from smtplib import SMTP
+
+from zope.interface import implements
+from zope.sendmail.interfaces import ISMTPMailer
+
+have_ssl = hasattr(socket, 'ssl')
+
+class SMTPMailer(object):
+
+    implements(ISMTPMailer)
+
+    smtp = SMTP
+
+    def __init__(self, hostname='localhost', port=25,
+                 username=None, password=None, no_tls=False, force_tls=False):
+        self.hostname = hostname
+        self.port = port
+        self.username = username
+        self.password = password
+        self.force_tls = force_tls
+        self.no_tls = no_tls
+
+    def send(self, fromaddr, toaddrs, message):
+        connection = self.smtp(self.hostname, str(self.port))
+
+        # send EHLO
+        code, response = connection.ehlo()
+        if code < 200 or code >300:
+            raise RuntimeError('Error sending EHLO to the SMTP server '
+                                '(code=%s, response=%s)' % (code, response))
+
+        # encryption support
+        have_tls =  connection.has_extn('starttls') 
+        if not have_tls and self.force_tls:
+            raise RuntimeError('TLS is not available but TLS is required')
+
+        if have_tls and have_ssl and not self.no_tls: 
+            connection.starttls()
+            connection.ehlo()
+
+        if connection.does_esmtp: 
+            if self.username is not None and self.password is not None:
+                connection.login(self.username, self.password)
+        elif self.username:
+            raise RuntimeError('Mailhost does not support ESMTP but a username '
+                                'is configured')
+
+        connection.sendmail(fromaddr, toaddrs, message)
+        connection.quit()



More information about the Zope-Checkins mailing list