diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index 543141dc427ebe..587f08df0350ae 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -45,8 +45,9 @@ def __init__(self, display_name='', username='', domain='', addr_spec=None): raise ValueError("Invalid addr_spec; only '{}' " "could be parsed from '{}'".format( a_s, addr_spec)) - if a_s.all_defects: - raise a_s.all_defects[0] + for defect in a_s.all_defects: + if not isinstance(defect, errors.NonASCIILocalPartDefect): + raise defect username = a_s.local_part domain = a_s.domain self._display_name = display_name diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index bb7ca8dfd8c52c..340d87bc2ff7a5 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1492,17 +1492,20 @@ def test_quoting(self): self.assertEqual(str(a), '"Sara J." <"bad name"@example.com>') def test_il8n(self): - a = Address('Éric', 'wok', 'exàmple.com') + a = Address('Éric', 'wők', 'exàmple.com') self.assertEqual(a.display_name, 'Éric') - self.assertEqual(a.username, 'wok') + self.assertEqual(a.username, 'wők') self.assertEqual(a.domain, 'exàmple.com') - self.assertEqual(a.addr_spec, 'wok@exàmple.com') - self.assertEqual(str(a), 'Éric ') + self.assertEqual(a.addr_spec, 'wők@exàmple.com') + self.assertEqual(str(a), 'Éric ') - # XXX: there is an API design issue that needs to be solved here. - #def test_non_ascii_username_raises(self): - # with self.assertRaises(ValueError): - # Address('foo', 'wők', 'example.com') + def test_non_ascii_username_in_addr_spec(self): + a = Address('foo', addr_spec='wők@example.com') + self.assertEqual(a.display_name, 'foo') + self.assertEqual(a.username, 'wők') + self.assertEqual(a.domain, 'example.com') + self.assertEqual(a.addr_spec, 'wők@example.com') + self.assertEqual(str(a), 'foo ') def test_crlf_in_constructor_args_raises(self): cases = ( @@ -1523,10 +1526,6 @@ def test_crlf_in_constructor_args_raises(self): with self.subTest(kwargs=kwargs), self.assertRaisesRegex(ValueError, "invalid arguments"): Address(**kwargs) - def test_non_ascii_username_in_addr_spec_raises(self): - with self.assertRaises(ValueError): - Address('foo', addr_spec='wők@example.com') - def test_address_addr_spec_and_username_raises(self): with self.assertRaises(TypeError): Address('foo', username='bing', addr_spec='bar@baz') diff --git a/Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst b/Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst new file mode 100644 index 00000000000000..14a6bd0bfae966 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst @@ -0,0 +1 @@ +Do not fail when parsing email address with non-ASCII local part.