Skip to content

Commit fffa4e0

Browse files
committed
gh-91400: make sure email parsing dont unquote realnames with spaces
1 parent 392fd27 commit fffa4e0

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

Lib/email/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
CRLF = '\r\n'
4646
TICK = "'"
4747

48-
specialsre = re.compile(r'[][\\()<>@,:;".]')
48+
specialsre = re.compile(r'[][\\()<>@,:;". ]')
4949
escapesre = re.compile(r'[\\"]')
5050

5151
def _has_surrogates(s):

Lib/test/test_email/test_email.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3143,7 +3143,7 @@ def test_parseaddr_multiple_domains(self):
31433143
def test_noquote_dump(self):
31443144
self.assertEqual(
31453145
utils.formataddr(('A Silly Person', '[email protected]')),
3146-
'A Silly Person <[email protected]>')
3146+
'"A Silly Person" <[email protected]>')
31473147

31483148
def test_escape_dump(self):
31493149
self.assertEqual(
@@ -3164,6 +3164,14 @@ def test_escape_backslashes(self):
31643164
31653165
self.assertEqual(utils.parseaddr(utils.formataddr((a, b))), (a, b))
31663166

3167+
def test_parseaddr_formataddr_inverse(self):
3168+
# gh-91400
3169+
identity = '"foo bar" <[email protected]>'
3170+
single = utils.formataddr(utils.parseaddr(identity))
3171+
double = utils.formataddr(utils.parseaddr(single))
3172+
self.assertEqual(identity, single)
3173+
self.assertEqual(single, double)
3174+
31673175
def test_quotes_unicode_names(self):
31683176
# issue 1690608. email.utils.formataddr() should be rfc2047 aware.
31693177
name = "H\u00e4ns W\u00fcrst"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Make email.utils.formataddr and email.utils.parseaddr inverse of each other

0 commit comments

Comments
 (0)