Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit df0c21f

Browse filesBrowse files
bsiemmiss-islington
authored andcommitted
bpo-37482: Fix email address name with encoded words and special chars (pythonGH-14561)
Special characters in email address header display names are normally put within double quotes. However, encoded words (=?charset?x?...?=) are not allowed withing double quotes. When the header contains a word with special characters and another word that must be encoded, the first one must also be encoded. In the next example, the display name in the From header is quoted and therefore the comma is allowed; in the To header, the comma is not within quotes and not encoded, which is not allowed and therefore rejected by some mail servers. From: "Foo Bar, France" <foo@example.com> To: Foo Bar, =?utf-8?q?Espa=C3=B1a?= <foo@example.com> https://bugs.python.org/issue37482
1 parent 48ede6b commit df0c21f
Copy full SHA for df0c21f

File tree

Expand file treeCollapse file tree

3 files changed

+28
-0
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+28
-0
lines changed

‎Lib/email/_header_value_parser.py

Copy file name to clipboardExpand all lines: Lib/email/_header_value_parser.py
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2743,6 +2743,9 @@ def _refold_parse_tree(parse_tree, *, policy):
27432743
wrap_as_ew_blocked -= 1
27442744
continue
27452745
tstr = str(part)
2746+
if part.token_type == 'ptext' and set(tstr) & SPECIALS:
2747+
# Encode if tstr contains special characters.
2748+
want_encoding = True
27462749
try:
27472750
tstr.encode(encoding)
27482751
charset = encoding

‎Lib/test/test_email/test_headerregistry.py

Copy file name to clipboardExpand all lines: Lib/test/test_email/test_headerregistry.py
+24Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,30 @@ def test_group_comparison(self):
15471547

15481548
class TestFolding(TestHeaderBase):
15491549

1550+
def test_address_display_names(self):
1551+
"""Test the folding and encoding of address headers."""
1552+
for name, result in (
1553+
('Foo Bar, France', '"Foo Bar, France"'),
1554+
('Foo Bar (France)', '"Foo Bar (France)"'),
1555+
('Foo Bar, España', 'Foo =?utf-8?q?Bar=2C_Espa=C3=B1a?='),
1556+
('Foo Bar (España)', 'Foo Bar =?utf-8?b?KEVzcGHDsWEp?='),
1557+
('Foo, Bar España', '=?utf-8?q?Foo=2C_Bar_Espa=C3=B1a?='),
1558+
('Foo, Bar [España]', '=?utf-8?q?Foo=2C_Bar_=5BEspa=C3=B1a=5D?='),
1559+
('Foo Bär, France', 'Foo =?utf-8?q?B=C3=A4r=2C?= France'),
1560+
('Foo Bär <France>', 'Foo =?utf-8?q?B=C3=A4r_=3CFrance=3E?='),
1561+
(
1562+
'Lôrem ipsum dôlôr sit amet, cônsectetuer adipiscing. '
1563+
'Suspendisse pôtenti. Aliquam nibh. Suspendisse pôtenti.',
1564+
'=?utf-8?q?L=C3=B4rem_ipsum_d=C3=B4l=C3=B4r_sit_amet=2C_c'
1565+
'=C3=B4nsectetuer?=\n =?utf-8?q?adipiscing=2E_Suspendisse'
1566+
'_p=C3=B4tenti=2E_Aliquam_nibh=2E?=\n Suspendisse =?utf-8'
1567+
'?q?p=C3=B4tenti=2E?=',
1568+
),
1569+
):
1570+
h = self.make_header('To', Address(name, addr_spec='a@b.com'))
1571+
self.assertEqual(h.fold(policy=policy.default),
1572+
'To: %s <a@b.com>\n' % result)
1573+
15501574
def test_short_unstructured(self):
15511575
h = self.make_header('subject', 'this is a test')
15521576
self.assertEqual(h.fold(policy=policy.default),
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix serialization of display name in originator or destination address fields with both encoded words and special chars.

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.