diff options
author | R David Murray <rdmurray@bitdance.com> | 2011-07-19 01:42:28 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2011-07-19 01:42:28 (GMT) |
commit | da7af4d7a1866d53d50ad5253bf189e1b752cb04 (patch) | |
tree | f18b20962b8602dd0cc9dd3d5a341506442d2ba5 | |
parent | a8713b141ab1d060bd0ba0c9e6aa93dd476bb224 (diff) | |
parent | 4634676cec29def3c70cf84ba00e6d7586bbaab7 (diff) | |
download | cpython-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.py | 11 | ||||
-rw-r--r-- | Lib/test/test_smtplib.py | 33 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
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() @@ -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. |