fix: start to reconcile internal inconsistencies wrt multiple from values (#7935)
This commit is contained in:
parent
f5c132a20a
commit
3b5058a516
|
@ -92,7 +92,17 @@ def send_smtp(msg, bcc=None):
|
||||||
'''
|
'''
|
||||||
mark = time.time()
|
mark = time.time()
|
||||||
add_headers(msg)
|
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', [])
|
addrlist = msg.get_all('To') + msg.get_all('Cc', [])
|
||||||
if bcc:
|
if bcc:
|
||||||
addrlist += [bcc]
|
addrlist += [bcc]
|
||||||
|
@ -446,6 +456,8 @@ def parse_preformatted(preformatted, extra=None, override=None):
|
||||||
values = msg.get_all(key, [])
|
values = msg.get_all(key, [])
|
||||||
if values:
|
if values:
|
||||||
values = getaddresses(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]
|
del msg[key]
|
||||||
msg[key] = ',\n '.join(formataddr(v) for v in values)
|
msg[key] = ',\n '.join(formataddr(v) for v in values)
|
||||||
for key in ['Subject', ]:
|
for key in ['Subject', ]:
|
||||||
|
|
|
@ -53,7 +53,7 @@ class SendingMail(TestCase):
|
||||||
|
|
||||||
def test_send_mail_preformatted(self):
|
def test_send_mail_preformatted(self):
|
||||||
msg = """To: to1@example.com, to2@example.com
|
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
|
Cc: cc1@example.com, cc2@example.com
|
||||||
Bcc: bcc1@example.com, bcc2@example.com
|
Bcc: bcc1@example.com, bcc2@example.com
|
||||||
Subject: subject
|
Subject: subject
|
||||||
|
@ -63,7 +63,7 @@ body
|
||||||
send_mail_preformatted(None, msg, {}, {})
|
send_mail_preformatted(None, msg, {}, {})
|
||||||
recv = outbox[-1]
|
recv = outbox[-1]
|
||||||
self.assertSameEmail(recv['To'], '<to1@example.com>, <to2@example.com>')
|
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['Cc'], 'cc1@example.com, cc2@example.com')
|
||||||
self.assertSameEmail(recv['Bcc'], None)
|
self.assertSameEmail(recv['Bcc'], None)
|
||||||
self.assertEqual(recv['Subject'], 'subject')
|
self.assertEqual(recv['Subject'], 'subject')
|
||||||
|
@ -71,14 +71,14 @@ body
|
||||||
|
|
||||||
override = {
|
override = {
|
||||||
'To': 'oto1@example.net, oto2@example.net',
|
'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',
|
'Cc': 'occ1@example.net, occ2@example.net',
|
||||||
'Subject': 'osubject',
|
'Subject': 'osubject',
|
||||||
}
|
}
|
||||||
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
|
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
|
||||||
recv = outbox[-1]
|
recv = outbox[-1]
|
||||||
self.assertSameEmail(recv['To'], '<oto1@example.net>, <oto2@example.net>')
|
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['Cc'], 'occ1@example.net, occ2@example.net')
|
||||||
self.assertSameEmail(recv['Bcc'], None)
|
self.assertSameEmail(recv['Bcc'], None)
|
||||||
self.assertEqual(recv['Subject'], 'osubject')
|
self.assertEqual(recv['Subject'], 'osubject')
|
||||||
|
@ -86,14 +86,14 @@ body
|
||||||
|
|
||||||
override = {
|
override = {
|
||||||
'To': ['<oto1@example.net>', 'oto2@example.net'],
|
'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'],
|
'Cc': ['<occ1@example.net>', 'occ2@example.net'],
|
||||||
'Subject': 'osubject',
|
'Subject': 'osubject',
|
||||||
}
|
}
|
||||||
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
|
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
|
||||||
recv = outbox[-1]
|
recv = outbox[-1]
|
||||||
self.assertSameEmail(recv['To'], '<oto1@example.net>, <oto2@example.net>')
|
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['Cc'], '<occ1@example.net>, occ2@example.net')
|
||||||
self.assertSameEmail(recv['Bcc'], None)
|
self.assertSameEmail(recv['Bcc'], None)
|
||||||
self.assertEqual(recv['Subject'], 'osubject')
|
self.assertEqual(recv['Subject'], 'osubject')
|
||||||
|
|
Loading…
Reference in a new issue