mirror of https://github.com/python/cpython
#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:
parent
60bf489e8a
commit
9522595d70
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue