summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2011-07-18 21:34:04 -0400
committerR David Murray <rdmurray@bitdance.com>2011-07-18 21:34:04 -0400
commit9522595d704e031a60304d4eb8cbc457bcb91e23 (patch)
treef180506587e7fc002cd587dcde414bd19fb8bb76
parent60bf489e8aab38519cbc5c9683574d01a52e5c65 (diff)
downloadcpython-git-9522595d704e031a60304d4eb8cbc457bcb91e23.tar.gz
#7484: no more <> around addresses in VRFY or EXPN
The RFC doesn't say that they are allowed; apparently many mailers accept them, but not postfix. Contributions to this patch were made by Felipe Cruz and Catalin Iacob.
-rwxr-xr-xLib/smtplib.py11
-rw-r--r--Lib/test/test_smtplib.py11
-rw-r--r--Misc/NEWS3
3 files changed, 17 insertions, 8 deletions
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index e3ffb37be3..f9576367f0 100755
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -149,6 +149,13 @@ def quoteaddr(addr):
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
+
def quotedata(data):
"""Quote data for email.
@@ -497,14 +504,14 @@ class SMTP:
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
index 42a10bee1d..81806c9898 100644
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -330,15 +330,14 @@ class SimSMTPChannel(smtpd.SMTPChannel):
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):
@@ -454,7 +453,7 @@ class SMTPSimTests(unittest.TestCase):
self.assertEqual(smtp.vrfy(email), expected_known)
u = 'nobody@nowhere.com'
- expected_unknown = (550, 'No such user: %s' % smtplib.quoteaddr(u))
+ expected_unknown = (550, 'No such user: %s' % u)
self.assertEqual(smtp.vrfy(u), expected_unknown)
smtp.quit()
diff --git a/Misc/NEWS b/Misc/NEWS
index 2ec44d9a6a..88d706c1c9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -33,6 +33,9 @@ Core and Builtins
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 #11603: Fix a crash when __str__ is rebound as __repr__. Patch by
Andreas Stührk.