[Python-checkins] cpython (merge 3.2 -> default): Merge #7484: no more <> around addresses in VRFY or EXPN

r.david.murray python-checkins at python.org
Tue Jul 19 03:43:51 CEST 2011


http://hg.python.org/cpython/rev/0d9216de8f05
changeset:   71419:0d9216de8f05
parent:      71415:912b97ee40a7
parent:      71418:f8c4ac9aa9e2
user:        R David Murray <rdmurray at bitdance.com>
date:        Mon Jul 18 21:42:28 2011 -0400
summary:
  Merge #7484: no more <> around addresses in VRFY or EXPN

files:
  Lib/smtplib.py           |  11 +++++++-
  Lib/test/test_smtplib.py |  33 ++++++++++++++++++++-------
  Misc/NEWS                |   3 ++
  3 files changed, 36 insertions(+), 11 deletions(-)


diff --git a/Lib/smtplib.py b/Lib/smtplib.py
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -152,6 +152,13 @@
     else:
         return "<%s>" % m
 
+def _addr_only(addrstring):
+    displayname, addr = email.utils.parseaddr(addrstring)
+    if (displayname, addr) == ('', ''):
+        # parseaddr couldn't parse it, so use it as is.
+        return addrstring
+    return addr
+
 # Legacy method kept for backward compatibility.
 def quotedata(data):
     """Quote data for email.
@@ -507,14 +514,14 @@
 
     def verify(self, address):
         """SMTP 'verify' command -- checks for address validity."""
-        self.putcmd("vrfy", quoteaddr(address))
+        self.putcmd("vrfy", _addr_only(address))
         return self.getreply()
     # a.k.a.
     vrfy = verify
 
     def expn(self, address):
         """SMTP 'expn' command -- expands a mailing list."""
-        self.putcmd("expn", quoteaddr(address))
+        self.putcmd("expn", _addr_only(address))
         return self.getreply()
 
     # some useful methods
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
@@ -293,6 +293,23 @@
         mexpect = '%s%s\n%s' % (MSG_BEGIN, m, MSG_END)
         self.assertEqual(self.output.getvalue(), mexpect)
 
+    def testSendNullSender(self):
+        m = 'A test message'
+        smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
+        smtp.sendmail('<>', 'Sally', m)
+        # XXX (see comment in testSend)
+        time.sleep(0.01)
+        smtp.quit()
+
+        self.client_evt.set()
+        self.serv_evt.wait()
+        self.output.flush()
+        mexpect = '%s%s\n%s' % (MSG_BEGIN, m, MSG_END)
+        self.assertEqual(self.output.getvalue(), mexpect)
+        debugout = smtpd.DEBUGSTREAM.getvalue()
+        sender = re.compile("^sender: <>$", re.MULTILINE)
+        self.assertRegex(debugout, sender)
+
     def testSendMessage(self):
         m = email.mime.text.MIMEText('A test message')
         smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
@@ -523,7 +540,7 @@
 
 
 sim_users = {'Mr.A at somewhere.com':'John A',
-             'Ms.B at somewhere.com':'Sally B',
+             'Ms.B at xn--fo-fka.com':'Sally B',
              'Mrs.C at somewhereesle.com':'Ruth C',
             }
 
@@ -539,7 +556,7 @@
 sim_auth_login_password = 'C29TZXBHC3N3B3JK'
 
 sim_lists = {'list-1':['Mr.A at somewhere.com','Mrs.C at somewhereesle.com'],
-             'list-2':['Ms.B at somewhere.com',],
+             'list-2':['Ms.B at xn--fo-fka.com',],
             }
 
 # Simulated SMTP channel & server
@@ -563,15 +580,14 @@
         self.push(resp)
 
     def smtp_VRFY(self, arg):
-        raw_addr = email.utils.parseaddr(arg)[1]
-        quoted_addr = smtplib.quoteaddr(arg)
-        if raw_addr in sim_users:
-            self.push('250 %s %s' % (sim_users[raw_addr], quoted_addr))
+        # For max compatibility smtplib should be sending the raw address.
+        if arg in sim_users:
+            self.push('250 %s %s' % (sim_users[arg], smtplib.quoteaddr(arg)))
         else:
             self.push('550 No such user: %s' % arg)
 
     def smtp_EXPN(self, arg):
-        list_name = email.utils.parseaddr(arg)[1].lower()
+        list_name = arg.lower()
         if list_name in sim_lists:
             user_list = sim_lists[list_name]
             for n, user_email in enumerate(user_list):
@@ -703,8 +719,7 @@
             self.assertEqual(smtp.vrfy(email), expected_known)
 
         u = 'nobody at nowhere.com'
-        expected_unknown = (550, ('No such user: %s'
-                                       % smtplib.quoteaddr(u)).encode('ascii'))
+        expected_unknown = (550, ('No such user: %s' % u).encode('ascii'))
         self.assertEqual(smtp.vrfy(u), expected_unknown)
         smtp.quit()
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -234,6 +234,9 @@
 Library
 -------
 
+- Issue #7484: smtplib no longer puts <> around addresses in VRFY and EXPN
+  commands; they aren't required and in fact postfix doesn't support that form.
+
 - Issue #12273: Remove ast.__version__. AST changes can be accounted for by
   checking sys.version_info or sys._mercurial.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list