Commit 45b2f889 authored by Jens Troeger's avatar Jens Troeger Committed by R. David Murray

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

parent 8da5ebe1
...@@ -2625,7 +2625,7 @@ def _refold_parse_tree(parse_tree, *, policy): ...@@ -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]):
......
...@@ -4,6 +4,7 @@ import unittest ...@@ -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): ...@@ -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()
Fix serialization of messages containing encoded strings when the
policy.linesep is set to a multi-character string. Patch by Jens Troeger.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment