mirror of
https://github.com/python/cpython.git
synced 2025-12-11 11:31:05 +00:00
gh-65495: Use lowercase mail from and rcpt to in smtplib.SMTP (#107019)
Use lowercase `mail from` and `rcpt to` in `smtplib.SMTP` SMTP commands are case-insensitive. `smtplib` uses lowercase commands, however it writes `mail FROM` and `rcpt TO`, lacking consistency.
This commit is contained in:
parent
d228825e08
commit
3782def5a2
3 changed files with 17 additions and 2 deletions
|
|
@ -542,7 +542,7 @@ class SMTP:
|
||||||
raise SMTPNotSupportedError(
|
raise SMTPNotSupportedError(
|
||||||
'SMTPUTF8 not supported by server')
|
'SMTPUTF8 not supported by server')
|
||||||
optionlist = ' ' + ' '.join(options)
|
optionlist = ' ' + ' '.join(options)
|
||||||
self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
|
self.putcmd("mail", "from:%s%s" % (quoteaddr(sender), optionlist))
|
||||||
return self.getreply()
|
return self.getreply()
|
||||||
|
|
||||||
def rcpt(self, recip, options=()):
|
def rcpt(self, recip, options=()):
|
||||||
|
|
@ -550,7 +550,7 @@ class SMTP:
|
||||||
optionlist = ''
|
optionlist = ''
|
||||||
if options and self.does_esmtp:
|
if options and self.does_esmtp:
|
||||||
optionlist = ' ' + ' '.join(options)
|
optionlist = ' ' + ' '.join(options)
|
||||||
self.putcmd("rcpt", "TO:%s%s" % (quoteaddr(recip), optionlist))
|
self.putcmd("rcpt", "to:%s%s" % (quoteaddr(recip), optionlist))
|
||||||
return self.getreply()
|
return self.getreply()
|
||||||
|
|
||||||
def data(self, msg):
|
def data(self, msg):
|
||||||
|
|
|
||||||
|
|
@ -831,6 +831,7 @@ class SimSMTPChannel(smtpd.SMTPChannel):
|
||||||
def __init__(self, extra_features, *args, **kw):
|
def __init__(self, extra_features, *args, **kw):
|
||||||
self._extrafeatures = ''.join(
|
self._extrafeatures = ''.join(
|
||||||
[ "250-{0}\r\n".format(x) for x in extra_features ])
|
[ "250-{0}\r\n".format(x) for x in extra_features ])
|
||||||
|
self.all_received_lines = []
|
||||||
super(SimSMTPChannel, self).__init__(*args, **kw)
|
super(SimSMTPChannel, self).__init__(*args, **kw)
|
||||||
|
|
||||||
# AUTH related stuff. It would be nice if support for this were in smtpd.
|
# AUTH related stuff. It would be nice if support for this were in smtpd.
|
||||||
|
|
@ -845,6 +846,7 @@ class SimSMTPChannel(smtpd.SMTPChannel):
|
||||||
self.smtp_state = self.COMMAND
|
self.smtp_state = self.COMMAND
|
||||||
self.push('%s %s' % (e.smtp_code, e.smtp_error))
|
self.push('%s %s' % (e.smtp_code, e.smtp_error))
|
||||||
return
|
return
|
||||||
|
self.all_received_lines.append(self.received_lines)
|
||||||
super().found_terminator()
|
super().found_terminator()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1349,6 +1351,18 @@ class SMTPSimTests(unittest.TestCase):
|
||||||
self.assertEqual(self.serv._addresses['from'], 'michael@example.com')
|
self.assertEqual(self.serv._addresses['from'], 'michael@example.com')
|
||||||
self.assertEqual(self.serv._addresses['tos'], ['rene@example.com'])
|
self.assertEqual(self.serv._addresses['tos'], ['rene@example.com'])
|
||||||
|
|
||||||
|
def test_lowercase_mail_from_rcpt_to(self):
|
||||||
|
m = 'A test message'
|
||||||
|
smtp = smtplib.SMTP(
|
||||||
|
HOST, self.port, local_hostname='localhost',
|
||||||
|
timeout=support.LOOPBACK_TIMEOUT)
|
||||||
|
self.addCleanup(smtp.close)
|
||||||
|
|
||||||
|
smtp.sendmail('John', 'Sally', m)
|
||||||
|
|
||||||
|
self.assertIn(['mail from:<John> size=14'], self.serv._SMTPchannel.all_received_lines)
|
||||||
|
self.assertIn(['rcpt to:<Sally>'], self.serv._SMTPchannel.all_received_lines)
|
||||||
|
|
||||||
|
|
||||||
class SimSMTPUTF8Server(SimSMTPServer):
|
class SimSMTPUTF8Server(SimSMTPServer):
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Use lowercase ``mail from`` and ``rcpt to`` in :class:`smptlib.SMTP`.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue