summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2011-07-19 01:42:28 (GMT)
committerR David Murray <rdmurray@bitdance.com>2011-07-19 01:42:28 (GMT)
commitda7af4d7a1866d53d50ad5253bf189e1b752cb04 (patch)
treef18b20962b8602dd0cc9dd3d5a341506442d2ba5
parenta8713b141ab1d060bd0ba0c9e6aa93dd476bb224 (diff)
parent4634676cec29def3c70cf84ba00e6d7586bbaab7 (diff)
downloadcpython-da7af4d7a1866d53d50ad5253bf189e1b752cb04.zip
cpython-da7af4d7a1866d53d50ad5253bf189e1b752cb04.tar.gz
cpython-da7af4d7a1866d53d50ad5253bf189e1b752cb04.tar.bz2
Merge #7484: no more <> around addresses in VRFY or EXPN
-rw-r--r--Lib/smtplib.py11
-rw-r--r--Lib/test/test_smtplib.py33
-rw-r--r--Misc/NEWS3
3 files changed, 36 insertions, 11 deletions
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index b89b5a5..55935d2 100644
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -152,6 +152,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
+
# Legacy method kept for backward compatibility.
def quotedata(data):
"""Quote data for email.
@@ -507,14 +514,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 95c1bfc..9f8a054 100644
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -293,6 +293,23 @@ class DebuggingServerTests(unittest.TestCase):
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 @@ class BadHELOServerTests(unittest.TestCase):
sim_users = {'Mr.A@somewhere.com':'John A',
- 'Ms.B@somewhere.com':'Sally B',
+ 'Ms.B@xn--fo-fka.com':'Sally B',
'Mrs.C@somewhereesle.com':'Ruth C',
}
@@ -539,7 +556,7 @@ sim_auth_credentials = {
sim_auth_login_password = 'C29TZXBHC3N3B3JK'
sim_lists = {'list-1':['Mr.A@somewhere.com','Mrs.C@somewhereesle.com'],
- 'list-2':['Ms.B@somewhere.com',],
+ 'list-2':['Ms.B@xn--fo-fka.com',],
}
# Simulated SMTP channel & server
@@ -563,15 +580,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):
@@ -703,8 +719,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)).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
index 7632292..c0cda4f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -234,6 +234,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 #12273: Remove ast.__version__. AST changes can be accounted for by
checking sys.version_info or sys._mercurial.