Yasuhito FUTATSUKI at POEM has proposed merging 
lp:~futatuki/mailman/2.1-add-smtp-timeout into lp:mailman/2.1.

Requested reviews:
  Mailman Coders (mailman-coders)

For more details, see:
https://code.launchpad.net/~futatuki/mailman/2.1-add-smtp-timeout/+merge/337353

This add a feature to specify timeout for SMTP response to avoid waiting 
response forever, to SMTPDirect Handler. To specify timeout, set SMTP_TIMEOUT 
in mm_cfg.py.

By default, this is disabled(waiting response until respond the MTA).

To test this feature, set mm_cfg.SMTP_TIMEOUT to small value and setup MTA to 
wait responding (by using greet pause feature, etc) and run smtp test or post 
message to mailing list to deliver it.
-- 
Your team Mailman Coders is requested to review the proposed merge of 
lp:~futatuki/mailman/2.1-add-smtp-timeout into lp:mailman/2.1.
=== modified file 'Mailman/Defaults.py.in'
--- Mailman/Defaults.py.in	2018-01-30 04:06:24 +0000
+++ Mailman/Defaults.py.in	2018-02-08 12:35:39 +0000
@@ -591,6 +591,12 @@
 # uses DEFAULT_URL_HOST. Normally, you should not change this.
 SMTP_HELO_HOST = DEFAULT_URL_HOST
 
+# The time to wait for a response from MTA for DELIVERY_MODULE = 'SMTPDirect',
+# in positive float seconds or None. Setting a timeout of None disables 
+# timeouts on socket operations.
+# Note: too short timeout will often cause duplicate message delivery.
+SMTP_TIMEOUT = None
+
 # Set these variables if you need to authenticate to your NNTP server for
 # Usenet posting or reading.  If no authentication is necessary, specify None
 # for both variables.

=== modified file 'Mailman/Handlers/SMTPDirect.py'
--- Mailman/Handlers/SMTPDirect.py	2017-05-23 19:45:06 +0000
+++ Mailman/Handlers/SMTPDirect.py	2018-02-08 12:35:39 +0000
@@ -55,13 +55,24 @@
 
 
 
+if mm_cfg.SMTP_TIMEOUT:
+    # wrapper SMTP class to specify timeout (for Python < 2.6 compatibility)
+    class SMTP(smtplib.SMTP):
+        def connect(self, host='localhost', port=0):
+            sv_to = socket.getdefaulttimeout()
+            socket.setdefaulttimeout(mm_cfg.SMTP_TIMEOUT)
+            smtplib.SMTP.connect(self, host, port)
+            socket.setdefaulttimeout(sv_to)
+else:
+    SMTP = smtplib.SMTP
+
 # Manage a connection to the SMTP server
 class Connection:
     def __init__(self):
         self.__conn = None
 
     def __connect(self):
-        self.__conn = smtplib.SMTP()
+        self.__conn = SMTP()
         self.__conn.set_debuglevel(mm_cfg.SMTPLIB_DEBUG_LEVEL)
         self.__conn.connect(mm_cfg.SMTPHOST, mm_cfg.SMTPPORT)
         if mm_cfg.SMTP_AUTH:

_______________________________________________
Mailman-coders mailing list
Mailman-coders@python.org
https://mail.python.org/mailman/listinfo/mailman-coders

Reply via email to