Skip to content

Commit 3b5058a

Browse files
authored
fix: start to reconcile internal inconsistencies wrt multiple from values (ietf-tools#7935)
1 parent f5c132a commit 3b5058a

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

ietf/utils/mail.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,17 @@ def send_smtp(msg, bcc=None):
9292
'''
9393
mark = time.time()
9494
add_headers(msg)
95-
(fname, frm) = parseaddr(msg.get('From'))
95+
# N.B. We have a disconnect with most of this code assuming a From header value will only
96+
# have one address.
97+
# The frm computed here is only used as the envelope from.
98+
# Previous code simply ran `parseaddr(msg.get('From'))`, getting lucky if the string returned
99+
# from the get had more than one address in it. Python 3.9.20 changes the behavior of parseaddr
100+
# and that erroneous use of the function no longer gets lucky.
101+
# For the short term, to match behavior to date as closely as possible, if we get a message
102+
# that has multiple addresses in the From header, we will use the first for the envelope from
103+
from_tuples = getaddresses(msg.get_all('From', [settings.DEFAULT_FROM_EMAIL]))
104+
assertion('len(from_tuples)==1', note=f"send_smtp received multiple From addresses: {from_tuples}")
105+
_ , frm = from_tuples[0]
96106
addrlist = msg.get_all('To') + msg.get_all('Cc', [])
97107
if bcc:
98108
addrlist += [bcc]
@@ -446,6 +456,8 @@ def parse_preformatted(preformatted, extra=None, override=None):
446456
values = msg.get_all(key, [])
447457
if values:
448458
values = getaddresses(values)
459+
if key=='From':
460+
assertion('len(values)<2', note=f'parse_preformatted is constructing a From with multiple values: {values}')
449461
del msg[key]
450462
msg[key] = ',\n '.join(formataddr(v) for v in values)
451463
for key in ['Subject', ]:

ietf/utils/tests.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class SendingMail(TestCase):
5353

5454
def test_send_mail_preformatted(self):
5555
msg = """To: to1@example.com, to2@example.com
56-
From: from1@ietf.org, from2@ietf.org
56+
From: from1@ietf.org
5757
Cc: cc1@example.com, cc2@example.com
5858
Bcc: bcc1@example.com, bcc2@example.com
5959
Subject: subject
@@ -63,37 +63,37 @@ def test_send_mail_preformatted(self):
6363
send_mail_preformatted(None, msg, {}, {})
6464
recv = outbox[-1]
6565
self.assertSameEmail(recv['To'], '<to1@example.com>, <to2@example.com>')
66-
self.assertSameEmail(recv['From'], 'from1@ietf.org, from2@ietf.org')
66+
self.assertSameEmail(recv['From'], 'from1@ietf.org')
6767
self.assertSameEmail(recv['Cc'], 'cc1@example.com, cc2@example.com')
6868
self.assertSameEmail(recv['Bcc'], None)
6969
self.assertEqual(recv['Subject'], 'subject')
7070
self.assertEqual(get_payload_text(recv), 'body\n')
7171

7272
override = {
7373
'To': 'oto1@example.net, oto2@example.net',
74-
'From': 'ofrom1@ietf.org, ofrom2@ietf.org',
74+
'From': 'ofrom1@ietf.org',
7575
'Cc': 'occ1@example.net, occ2@example.net',
7676
'Subject': 'osubject',
7777
}
7878
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
7979
recv = outbox[-1]
8080
self.assertSameEmail(recv['To'], '<oto1@example.net>, <oto2@example.net>')
81-
self.assertSameEmail(recv['From'], 'ofrom1@ietf.org, ofrom2@ietf.org')
81+
self.assertSameEmail(recv['From'], 'ofrom1@ietf.org')
8282
self.assertSameEmail(recv['Cc'], 'occ1@example.net, occ2@example.net')
8383
self.assertSameEmail(recv['Bcc'], None)
8484
self.assertEqual(recv['Subject'], 'osubject')
8585
self.assertEqual(recv.get_payload(), 'body\n')
8686

8787
override = {
8888
'To': ['<oto1@example.net>', 'oto2@example.net'],
89-
'From': ['<ofrom1@ietf.org>', 'ofrom2@ietf.org'],
89+
'From': ['<ofrom1@ietf.org>'],
9090
'Cc': ['<occ1@example.net>', 'occ2@example.net'],
9191
'Subject': 'osubject',
9292
}
9393
send_mail_preformatted(request=None, preformatted=msg, extra={}, override=override)
9494
recv = outbox[-1]
9595
self.assertSameEmail(recv['To'], '<oto1@example.net>, <oto2@example.net>')
96-
self.assertSameEmail(recv['From'], '<ofrom1@ietf.org>, ofrom2@ietf.org')
96+
self.assertSameEmail(recv['From'], '<ofrom1@ietf.org>')
9797
self.assertSameEmail(recv['Cc'], '<occ1@example.net>, occ2@example.net')
9898
self.assertSameEmail(recv['Bcc'], None)
9999
self.assertEqual(recv['Subject'], 'osubject')

0 commit comments

Comments
 (0)