如何使用Python 3.2电子邮件模块发送带有quoted-printable的utf-8编码的unicode消息?

Omn*_*ous 7 python email mime character-encoding python-3.x

我想在Python 3.2程序中发送具有任意unicode主体的电子邮件.但实际上,这些消息主要由7位ASCII文本组成.所以我想使用quoted-printable在utf-8中编码的消息.到目前为止,我发现这有效,但似乎错了:

c = email.charset.Charset('utf-8')
c.body_encoding = email.charset.QP
m = email.message.Message()
m.set_payload("My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1'), c)
Run Code Online (Sandbox Code Playgroud)

这会生成包含完全正确内容的电子邮件:

To: someone@example.com
From: someone_else@example.com
Subject: This is a subjective subject.
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

My message with an '=D7=90' in it.
Run Code Online (Sandbox Code Playgroud)

特别b'\xd7\x90'.decode('utf-8')是原始Unicode字符的结果.所以quoted-printable编码正确地渲染了utf-8.我很清楚这是一个令人难以置信的丑陋黑客.但它的确有效.

这是Python 3.文本字符串应始终是unicode.我不应该将其解码为utf-8.然后从将其bytesstr.decode('iso8859-1')是一个可怕的黑客,我不应该做,要么.

email关于编码,模块刚刚破解?我没有得到什么吗?

我试图只是简单地设置它,没有字符集.这留给我一个unicode电子邮件消息,这根本不对.我也尝试过离开encodedecode步骤.如果我将它们都关闭,它会\u05d0在尝试确定是否需要在quoted-printable编码中引用该字符时抱怨它超出范围.如果我离开这encode一步,它会痛苦地抱怨我是如何传入的bytes,它想要一个str.

小智 8

该电子邮件包并不混淆哪个(编码的unicode与内容传输编码的二进制数据),但是文档没有说清楚,因为大部分文档都是从"编码" 意味着内容的时代开始的 - 传输编码.我们正在开发一个更好的API,这将使所有这些更容易grok(和更好的文档).

实际上有一种方法可以让电子邮件包将QP用于utf-8机构,但它没有很好的记录.你这样做:

>>> charset.add_charset('utf-8', charset.QP, charset.QP)
>>> m = MIMEText("This is utf-8 text: á", _charset='utf-8')
>>> str(m)
'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\nThis is utf-8 text: =E1'
Run Code Online (Sandbox Code Playgroud)