Skip to content
3 changes: 2 additions & 1 deletion Lib/email/contentmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ def set_text_content(msg, string, subtype="plain", charset='utf-8', cte=None,
params=None, headers=None):
_prepare_set(msg, 'text', subtype, headers)

charset = email.charset.Charset(charset).input_charset
cs = email.charset.Charset(charset)
charset = cs.output_charset
cte, payload = _encode_text(string, charset, cte, msg.policy)
msg.set_payload(payload)
msg.set_param('charset', charset, replace=True)
Expand Down
40 changes: 40 additions & 0 deletions Lib/test/test_email/test_contentmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,46 @@ def test_set_text_charset_cp949(self):
self.assertEqual(m.get_payload(decode=True), content.encode('ks_c_5601-1987'))
self.assertEqual(m.get_content(), content)

def test_set_text_charset_shift_jis(self):
m = self._make_message()
content = "\u65e5\u672c\u8a9e\n"
raw_data_manager.set_content(m, content, charset='shift_jis')
self.assertEqual(m['Content-Type'], 'text/plain; charset="iso-2022-jp"')
self.assertEqual(m.get_payload(decode=True), content.encode('iso-2022-jp'))
self.assertEqual(m.get_content(), content)
self.assertEqual(str(m), textwrap.dedent("""\
Comment thread
bhuvi27 marked this conversation as resolved.
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

\x1b$BF|K\\8l\x1b(B
"""))
self.assertEqual(bytes(m), textwrap.dedent("""\
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

\u65e5\u672c\u8a9e
""").encode('iso-2022-jp'))

def test_set_text_charset_euc_jp(self):
m = self._make_message()
content = "\u65e5\u672c\u8a9e\n"
raw_data_manager.set_content(m, content, charset='euc-jp')
self.assertEqual(m['Content-Type'], 'text/plain; charset="iso-2022-jp"')
self.assertEqual(m.get_payload(decode=True), content.encode('iso-2022-jp'))
self.assertEqual(m.get_content(), content)
self.assertEqual(str(m), textwrap.dedent("""\
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

\x1b$BF|K\\8l\x1b(B
"""))
self.assertEqual(bytes(m), textwrap.dedent("""\
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

\u65e5\u672c\u8a9e
""").encode('iso-2022-jp'))

def test_set_text_plain_long_line_heuristics(self):
m = self._make_message()
content = ("Simple but long message that is over 78 characters"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Fix :mod:`email` messages created with ``shift_jis`` or ``euc-jp`` charsets.
``set_content()`` now stores the payload using the output charset
(``iso-2022-jp``) so printing the message no longer raises
:exc:`UnicodeEncodeError`.
Loading