diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index 41694f9..7d623ef 100644 --- a/Lib/email/_parseaddr.py +++ b/Lib/email/_parseaddr.py @@ -383,6 +383,9 @@ class AddrlistClass: If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed within the parsed fragment. + + Note: getdelimited() is always called from the context permitting + folding. """ if self.field[self.pos] != beginchar: return '' @@ -391,7 +394,10 @@ class AddrlistClass: quote = False self.pos += 1 while self.pos < len(self.field): - if quote: + if self.field[self.pos] == '\r': + self.pos += 2 + continue + elif quote: slist.append(self.field[self.pos]) quote = False elif self.field[self.pos] in endchars: @@ -410,15 +416,15 @@ class AddrlistClass: def getquote(self): """Get a quote-delimited fragment from self's field.""" - return self.getdelimited('"', '"\r', False) + return self.getdelimited('"', '"', False) def getcomment(self): """Get a parenthesis-delimited fragment from self's field.""" - return self.getdelimited('(', ')\r', True) + return self.getdelimited('(', ')', True) def getdomainliteral(self): """Parse an RFC 2822 domain-literal.""" - return '[%s]' % self.getdelimited('[', ']\r', False) + return '[%s]' % self.getdelimited('[', ']', False) def getatom(self, atomends=None): """Parse an RFC 2822 atom. diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 16772b1..dc8e982 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2476,6 +2476,27 @@ Foo addrs = utils.getaddresses(['User ((nested comment)) ']) eq(addrs[0][1], 'foo@bar.com') + def test_getaddresses_fws_in_quotedstring(self): + """Test proper handling of folding in quoted-string""" + # http://tools.ietf.org/html/rfc2822#section-3.4 + # http://tools.ietf.org/html/rfc2822#section-3.2.5 + eq = self.assertEqual + addrs = utils.getaddresses(['"User\r\n (Title)" ']) + eq(addrs[0][0], 'User (Title)') + eq(addrs[0][1], 'user@example.com') + + def test_getaddresses_fws_in_comment(self): + """Test proper handling of folding in comment""" + eq = self.assertEqual + eq(utils.getaddresses(['aperson@dom.ain (Al\r\n Person)']), + [('Al Person', 'aperson@dom.ain')]) + + def test_getaddresses_fws_in_domainliteral(self): + """Test proper handling of folding in domain-literal""" + eq = self.assertEqual + eq(utils.getaddresses(['aperson@[dom\r\n .ain]']), + [('', 'aperson@[dom .ain]')]) + def test_utils_quote_unquote(self): eq = self.assertEqual msg = Message()