fix: start to reconcile internal inconsistencies wrt multiple from values (#7935)

This commit is contained in:
Robert Sparks 2024-09-16 08:56:51 -05:00 committed by GitHub
parent f5c132a20a
commit 3b5058a516
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 7 deletions

View file

@ -92,7 +92,17 @@ def send_smtp(msg, bcc=None):
'''
mark = time.time()
add_headers(msg)
(fname, frm) = parseaddr(msg.get('From'))
# N.B. We have a disconnect with most of this code assuming a From header value will only
# have one address.
# The frm computed here is only used as the envelope from.
# Previous code simply ran `parseaddr(msg.get('From'))`, getting lucky if the string returned
# from the get had more than one address in it. Python 3.9.20 changes the behavior of parseaddr
# and that erroneous use of the function no longer gets lucky.
# For the short term, to match behavior to date as closely as possible, if we get a message
# that has multiple addresses in the From header, we will use the first for the envelope from
from_tuples = getaddresses(msg.get_all('From', [settings.DEFAULT_FROM_EMAIL]))
assertion('len(from_tuples)==1', note=f"send_smtp received multiple From addresses: {from_tuples}")
_ , frm = from_tuples[0]
addrlist = msg.get_all('To') + msg.get_all('Cc', [])
if bcc:
addrlist += [bcc]
@ -446,6 +456,8 @@ def parse_preformatted(preformatted, extra=None, override=None):
values = msg.get_all(key, [])
if values:
values = getaddresses(values)
if key=='From':
assertion('len(values)<2', note=f'parse_preformatted is constructing a From with multiple values: {values}')
del msg[key]
msg[key] = ',\n '.join(formataddr(v) for v in values)
for key in ['Subject', ]:

View file

@ -53,7 +53,7 @@ class SendingMail(TestCase):
def test_send_mail_preformatted(self):
msg = """To: to1@example.com, to2@example.com
From: from1@ietf.org, from2@ietf.org
From: from1@ietf.org
Cc: cc1@example.com, cc2@example.com
Bcc: bcc1@example.com, bcc2@example.com
Subject: subject
@ -63,7 +63,7 @@ body
send_mail_preformatted(None, msg, {}, {})
recv = outbox[-1]
self.assertSameEmail(recv['To'], '<to1@example.com>, <to2@example.com>')
self.assertSameEmail(recv['From'], 'from1@ietf.org, from2@ietf.org')
self.assertSameEmail(recv['From'], 'from1@ietf.org')
self.assertSameEmail(recv['Cc'], 'cc1@example.com, cc2@example.com')
self.assertSameEmail(recv['Bcc'], None)
self.assertEqual(recv['Subject'], 'subject')
@ -71,14 +71,14 @@ body
override = {
'To': 'oto1@example.net, oto2@example.net',
'From': 'ofrom1@ietf.org, ofrom2@ietf.org',
'From': 'ofrom1@ietf.org',
'Cc': 'occ1@example.net, occ2@example.net',
'Subject': 'osubject',
}
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
recv = outbox[-1]
self.assertSameEmail(recv['To'], '<oto1@example.net>, <oto2@example.net>')
self.assertSameEmail(recv['From'], 'ofrom1@ietf.org, ofrom2@ietf.org')
self.assertSameEmail(recv['From'], 'ofrom1@ietf.org')
self.assertSameEmail(recv['Cc'], 'occ1@example.net, occ2@example.net')
self.assertSameEmail(recv['Bcc'], None)
self.assertEqual(recv['Subject'], 'osubject')
@ -86,14 +86,14 @@ body
override = {
'To': ['<oto1@example.net>', 'oto2@example.net'],
'From': ['<ofrom1@ietf.org>', 'ofrom2@ietf.org'],
'From': ['<ofrom1@ietf.org>'],
'Cc': ['<occ1@example.net>', 'occ2@example.net'],
'Subject': 'osubject',
}
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
recv = outbox[-1]
self.assertSameEmail(recv['To'], '<oto1@example.net>, <oto2@example.net>')
self.assertSameEmail(recv['From'], '<ofrom1@ietf.org>, ofrom2@ietf.org')
self.assertSameEmail(recv['From'], '<ofrom1@ietf.org>')
self.assertSameEmail(recv['Cc'], '<occ1@example.net>, occ2@example.net')
self.assertSameEmail(recv['Bcc'], None)
self.assertEqual(recv['Subject'], 'osubject')