Skip to content

Commit 2bbb200

Browse files
committed
gh-118716: Do not fail on non ASCII local part when parsing addr_spec
RFC 6530 allows UTF-8 strings in the local part.
1 parent 71080b8 commit 2bbb200

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

Lib/email/headerregistry.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ def __init__(self, display_name='', username='', domain='', addr_spec=None):
4545
raise ValueError("Invalid addr_spec; only '{}' "
4646
"could be parsed from '{}'".format(
4747
a_s, addr_spec))
48-
if a_s.all_defects:
49-
raise a_s.all_defects[0]
48+
for defect in a_s.all_defects:
49+
if not isinstance(defect, errors.NonASCIILocalPartDefect):
50+
raise defect
5051
username = a_s.local_part
5152
domain = a_s.domain
5253
self._display_name = display_name

Lib/test/test_email/test_headerregistry.py

+11-12
Original file line numberDiff line numberDiff line change
@@ -1492,17 +1492,20 @@ def test_quoting(self):
14921492
self.assertEqual(str(a), '"Sara J." <"bad name"@example.com>')
14931493

14941494
def test_il8n(self):
1495-
a = Address('Éric', 'wok', 'exàmple.com')
1495+
a = Address('Éric', 'wők', 'exàmple.com')
14961496
self.assertEqual(a.display_name, 'Éric')
1497-
self.assertEqual(a.username, 'wok')
1497+
self.assertEqual(a.username, 'wők')
14981498
self.assertEqual(a.domain, 'exàmple.com')
1499-
self.assertEqual(a.addr_spec, 'wok@exàmple.com')
1500-
self.assertEqual(str(a), 'Éric <wok@exàmple.com>')
1499+
self.assertEqual(a.addr_spec, 'wők@exàmple.com')
1500+
self.assertEqual(str(a), 'Éric <wők@exàmple.com>')
15011501

1502-
# XXX: there is an API design issue that needs to be solved here.
1503-
#def test_non_ascii_username_raises(self):
1504-
# with self.assertRaises(ValueError):
1505-
# Address('foo', 'wők', 'example.com')
1502+
def test_non_ascii_username_in_addr_spec(self):
1503+
a = Address('foo', addr_spec='wő[email protected]')
1504+
self.assertEqual(a.display_name, 'foo')
1505+
self.assertEqual(a.username, 'wők')
1506+
self.assertEqual(a.domain, 'example.com')
1507+
self.assertEqual(a.addr_spec, 'wő[email protected]')
1508+
self.assertEqual(str(a), 'foo <wő[email protected]>')
15061509

15071510
def test_crlf_in_constructor_args_raises(self):
15081511
cases = (
@@ -1523,10 +1526,6 @@ def test_crlf_in_constructor_args_raises(self):
15231526
with self.subTest(kwargs=kwargs), self.assertRaisesRegex(ValueError, "invalid arguments"):
15241527
Address(**kwargs)
15251528

1526-
def test_non_ascii_username_in_addr_spec_raises(self):
1527-
with self.assertRaises(ValueError):
1528-
Address('foo', addr_spec='wő[email protected]')
1529-
15301529
def test_address_addr_spec_and_username_raises(self):
15311530
with self.assertRaises(TypeError):
15321531
Address('foo', username='bing', addr_spec='bar@baz')

0 commit comments

Comments
 (0)