bpo-34424: Handle different policy.linesep lengths correctly. (#8803)

This commit is contained in:
Jens Troeger 2019-05-14 11:07:39 +10:00 committed by R. David Murray
parent 8da5ebe11e
commit 45b2f8893c
3 changed files with 25 additions and 1 deletions

View File

@ -2625,7 +2625,7 @@ def _refold_parse_tree(parse_tree, *, policy):
want_encoding = False want_encoding = False
last_ew = None last_ew = None
if part.syntactic_break: if part.syntactic_break:
encoded_part = part.fold(policy=policy)[:-1] # strip nl encoded_part = part.fold(policy=policy)[:-len(policy.linesep)]
if policy.linesep not in encoded_part: if policy.linesep not in encoded_part:
# It fits on a single line # It fits on a single line
if len(encoded_part) > maxlen - len(lines[-1]): if len(encoded_part) > maxlen - len(lines[-1]):

View File

@ -4,6 +4,7 @@ import unittest
from email import message_from_string, message_from_bytes from email import message_from_string, message_from_bytes
from email.message import EmailMessage from email.message import EmailMessage
from email.generator import Generator, BytesGenerator from email.generator import Generator, BytesGenerator
from email.headerregistry import Address
from email import policy from email import policy
from test.test_email import TestEmailBase, parameterize from test.test_email import TestEmailBase, parameterize
@ -291,6 +292,27 @@ class TestBytesGenerator(TestGeneratorBase, TestEmailBase):
g.flatten(msg) g.flatten(msg)
self.assertEqual(s.getvalue(), expected) self.assertEqual(s.getvalue(), expected)
def test_smtp_policy(self):
msg = EmailMessage()
msg["From"] = Address(addr_spec="foo@bar.com", display_name="Páolo")
msg["To"] = Address(addr_spec="bar@foo.com", display_name="Dinsdale")
msg["Subject"] = "Nudge nudge, wink, wink"
msg.set_content("oh boy, know what I mean, know what I mean?")
expected = textwrap.dedent("""\
From: =?utf-8?q?P=C3=A1olo?= <foo@bar.com>
To: Dinsdale <bar@foo.com>
Subject: Nudge nudge, wink, wink
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
oh boy, know what I mean, know what I mean?
""").encode().replace(b"\n", b"\r\n")
s = io.BytesIO()
g = BytesGenerator(s, policy=policy.SMTP)
g.flatten(msg)
self.assertEqual(s.getvalue(), expected)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -0,0 +1,2 @@
Fix serialization of messages containing encoded strings when the
policy.linesep is set to a multi-character string. Patch by Jens Troeger.