#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.
This commit is contained in:
R David Murray 2011-07-18 21:34:04 -04:00
parent 60bf489e8a
commit 9522595d70
3 changed files with 17 additions and 8 deletions

View File

@ -149,6 +149,13 @@ def quoteaddr(addr):
else: else:
return "<%s>" % m 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): def quotedata(data):
"""Quote data for email. """Quote data for email.
@ -497,14 +504,14 @@ class SMTP:
def verify(self, address): def verify(self, address):
"""SMTP 'verify' command -- checks for address validity.""" """SMTP 'verify' command -- checks for address validity."""
self.putcmd("vrfy", quoteaddr(address)) self.putcmd("vrfy", _addr_only(address))
return self.getreply() return self.getreply()
# a.k.a. # a.k.a.
vrfy = verify vrfy = verify
def expn(self, address): def expn(self, address):
"""SMTP 'expn' command -- expands a mailing list.""" """SMTP 'expn' command -- expands a mailing list."""
self.putcmd("expn", quoteaddr(address)) self.putcmd("expn", _addr_only(address))
return self.getreply() return self.getreply()
# some useful methods # some useful methods

View File

@ -330,15 +330,14 @@ class SimSMTPChannel(smtpd.SMTPChannel):
self.push(resp) self.push(resp)
def smtp_VRFY(self, arg): def smtp_VRFY(self, arg):
raw_addr = email.utils.parseaddr(arg)[1] # For max compatibility smtplib should be sending the raw address.
quoted_addr = smtplib.quoteaddr(arg) if arg in sim_users:
if raw_addr in sim_users: self.push('250 %s %s' % (sim_users[arg], smtplib.quoteaddr(arg)))
self.push('250 %s %s' % (sim_users[raw_addr], quoted_addr))
else: else:
self.push('550 No such user: %s' % arg) self.push('550 No such user: %s' % arg)
def smtp_EXPN(self, arg): def smtp_EXPN(self, arg):
list_name = email.utils.parseaddr(arg)[1].lower() list_name = arg.lower()
if list_name in sim_lists: if list_name in sim_lists:
user_list = sim_lists[list_name] user_list = sim_lists[list_name]
for n, user_email in enumerate(user_list): for n, user_email in enumerate(user_list):
@ -454,7 +453,7 @@ class SMTPSimTests(unittest.TestCase):
self.assertEqual(smtp.vrfy(email), expected_known) self.assertEqual(smtp.vrfy(email), expected_known)
u = 'nobody@nowhere.com' 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) self.assertEqual(smtp.vrfy(u), expected_unknown)
smtp.quit() smtp.quit()

View File

@ -33,6 +33,9 @@ Core and Builtins
Library 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 - Issue #11603: Fix a crash when __str__ is rebound as __repr__. Patch by
Andreas Stührk. Andreas Stührk.