[Python-checkins] cpython (merge 3.4 -> default): Merge #22215: have the smtplib 'quit' command reset the state.

r.david.murray python-checkins at python.org
Sat Aug 30 22:57:31 CEST 2014


http://hg.python.org/cpython/rev/d0d4ab0ba70e
changeset: 92272:d0d4ab0ba70e
parent: 92270:c499cc2c4a06
parent: 92271:a058760cb069
user: R David Murray <rdmurray at bitdance.com>
date: Sat Aug 30 16:55:45 2014 -0400
summary:
 Merge #22215: have the smtplib 'quit' command reset the state.
files:
 Lib/smtplib.py | 4 ++++
 Lib/test/test_smtplib.py | 15 +++++++++++++++
 Misc/NEWS | 4 ++++
 3 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -891,6 +891,10 @@
 def quit(self):
 """Terminate the SMTP session."""
 res = self.docmd("quit")
+ # A new EHLO is required after reconnecting with connect()
+ self.ehlo_resp = self.helo_resp = None
+ self.esmtp_features = {}
+ self.does_esmtp = False
 self.close()
 return res
 
diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -876,6 +876,21 @@
 str(err))
 smtp.close()
 
+ def test_quit_resets_greeting(self):
+ smtp = smtplib.SMTP(HOST, self.port,
+ local_hostname='localhost',
+ timeout=15)
+ code, message = smtp.ehlo()
+ self.assertEqual(code, 250)
+ self.assertIn('size', smtp.esmtp_features)
+ smtp.quit()
+ self.assertNotIn('size', smtp.esmtp_features)
+ smtp.connect(HOST, self.port)
+ self.assertNotIn('size', smtp.esmtp_features)
+ smtp.ehlo_or_helo_if_needed()
+ self.assertIn('size', smtp.esmtp_features)
+ smtp.quit()
+
 def test_with_statement(self):
 with smtplib.SMTP(HOST, self.port) as smtp:
 code, message = smtp.noop()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -124,6 +124,10 @@
 Library
 -------
 
+- Issue #22216: smtplib now resets its state more completely after a quit. The
+ most obvious consequence of the previous behavior was a STARTTLS failure
+ during a connect/starttls/quit/connect/starttls sequence.
+
 - Issue #22098: ctypes' BigEndianStructure and LittleEndianStructure now
 define an empty __slots__ so that subclasses don't always get an instance
 dict. Patch by Claudiu Popa.
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /