diff options
author | Arkadiusz Hiler <arek.l1@gmail.com> | 2020-05-14 00:53:26 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-14 00:53:26 (GMT) |
commit | 6f2f475d5a2cd7675dce844f3af436ba919ef92b (patch) | |
tree | a716eac3e0f40024c90214076998a3b8a4b6609c /Lib/email/contentmanager.py | |
parent | 3d17c045b4c3d09b72bbd95ed78af1ae6f0d98d2 (diff) | |
download | cpython-6f2f475d5a2cd7675dce844f3af436ba919ef92b.zip cpython-6f2f475d5a2cd7675dce844f3af436ba919ef92b.tar.gz cpython-6f2f475d5a2cd7675dce844f3af436ba919ef92b.tar.bz2 |
bpo-40597: email: Use CTE if lines are longer than max_line_length consistently (gh-20038)
raw_data_manager (default for EmailPolicy, EmailMessage)
does correct wrapping of 'text' parts as long as the message contains
characters outside of 7bit US-ASCII set: base64 or qp
Content-Transfer-Encoding is applied if the lines would be too long
without it. It did not, however, do this for ascii-only text,
which could result in lines that were longer than
policy.max_line_length or even the rfc 998 maximum.
This changeset fixes the heuristic so that if lines are longer than
policy.max_line_length, it will always apply a
content-transfer-encoding so that the lines are wrapped correctly.
Diffstat (limited to 'Lib/email/contentmanager.py')
-rw-r--r-- | Lib/email/contentmanager.py | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/Lib/email/contentmanager.py b/Lib/email/contentmanager.py index b904ded..2b4b875 100644 --- a/Lib/email/contentmanager.py +++ b/Lib/email/contentmanager.py @@ -146,13 +146,13 @@ def _encode_text(string, charset, cte, policy): def normal_body(lines): return b'\n'.join(lines) + b'\n' if cte==None: # Use heuristics to decide on the "best" encoding. - try: - return '7bit', normal_body(lines).decode('ascii') - except UnicodeDecodeError: - pass - if (policy.cte_type == '8bit' and - max(len(x) for x in lines) <= policy.max_line_length): - return '8bit', normal_body(lines).decode('ascii', 'surrogateescape') + if max(len(x) for x in lines) <= policy.max_line_length: + try: + return '7bit', normal_body(lines).decode('ascii') + except UnicodeDecodeError: + pass + if policy.cte_type == '8bit': + return '8bit', normal_body(lines).decode('ascii', 'surrogateescape') sniff = embedded_body(lines[:10]) sniff_qp = quoprimime.body_encode(sniff.decode('latin-1'), policy.max_line_length) |