[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