summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-03-05 17:27:22 (GMT)
committerGitHub <noreply@github.com>2024-03-05 17:27:22 (GMT)
commit85c32ad9fd3780d8cc68a692c396cc840c093d69 (patch)
treea9709fc1404a1c3d60e517c6717d87cdb20e0056 /Lib
parent34efd49280ca710fd0358c72323c9d0c45a32b27 (diff)
downloadcpython-85c32ad9fd3780d8cc68a692c396cc840c093d69.zip
cpython-85c32ad9fd3780d8cc68a692c396cc840c093d69.tar.gz
cpython-85c32ad9fd3780d8cc68a692c396cc840c093d69.tar.bz2
[3.12] gh-76511: Fix email.Message.as_string() for non-ASCII message with ASCII charset (GH-116125) (GH-116364)
(cherry picked from commit f97f25ef5dfcdfec0d9a359fd970abd139cf3428) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/email/generator.py2
-rw-r--r--Lib/email/message.py2
-rw-r--r--Lib/test/test_email/test_email.py15
3 files changed, 17 insertions, 2 deletions
diff --git a/Lib/email/generator.py b/Lib/email/generator.py
index 7ccbe10..c8056ad 100644
--- a/Lib/email/generator.py
+++ b/Lib/email/generator.py
@@ -243,7 +243,7 @@ class Generator:
# existing message.
msg = deepcopy(msg)
del msg['content-transfer-encoding']
- msg.set_payload(payload, charset)
+ msg.set_payload(msg._payload, charset)
payload = msg.get_payload()
self._munge_cte = (msg['content-transfer-encoding'],
msg['content-type'])
diff --git a/Lib/email/message.py b/Lib/email/message.py
index fe76958..a14cca5 100644
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -340,7 +340,7 @@ class Message:
return
if not isinstance(charset, Charset):
charset = Charset(charset)
- payload = payload.encode(charset.output_charset)
+ payload = payload.encode(charset.output_charset, 'surrogateescape')
if hasattr(payload, 'decode'):
self._payload = payload.decode('ascii', 'surrogateescape')
else:
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index 2a23709..a373c53 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -336,6 +336,21 @@ class TestMessageAPI(TestEmailBase):
msg = email.message_from_bytes(source)
self.assertEqual(msg.as_string(), expected)
+ def test_nonascii_as_string_with_ascii_charset(self):
+ m = textwrap.dedent("""\
+ MIME-Version: 1.0
+ Content-type: text/plain; charset="us-ascii"
+ Content-Transfer-Encoding: 8bit
+
+ Test if non-ascii messages with no Content-Transfer-Encoding set
+ can be as_string'd:
+ Föö bär
+ """)
+ source = m.encode('iso-8859-1')
+ expected = source.decode('ascii', 'replace')
+ msg = email.message_from_bytes(source)
+ self.assertEqual(msg.as_string(), expected)
+
def test_nonascii_as_string_without_content_type_and_cte(self):
m = textwrap.dedent("""\
MIME-Version: 1.0