MIMEText中标头的编码

发布于 2021-01-29 14:11:06

我正在使用MIMEText在Python 3.2中从头开始创建电子邮件,但在创建主题中包含非ASCII字符的消息时遇到了麻烦。

例如

from email.mime.text import MIMEText
body = "Some text"
subject = "» My Subject"                   # first char is non-ascii
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = subject                   # <<< Problem probably here
text = msg.as_string()

最后一行给我错误

UnicodeEncodeError: 'ascii' codec can't encode character '\xbb' in position 0: ordinal not in range(128)

如何告诉MIMEText主题不是ascii?subject.encode('utf-8')根本没有帮助,无论如何,我已经看到人们使用unicode字符串,而其他答案没有问题(例如,参见Python-
如何发送utf-8电子邮件?

编辑:我想补充一下,相同的代码在Python 2.7中没有给出任何错误(这并不意味着结果正确)。

关注者
0
被浏览
63
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我找到了解决方案。包含非ascii字符的电子邮件标题需要按照RFC
    2047
    进行编码。在Python中,这意味着使用email.header.Header代替标题内容的常规字符串(请参阅http://docs.python.org/2/library/email.header.html)。那么编写上面示例的正确方法是

    from email.mime.text import MIMEText
    from email.header import Header
    body = "Some text"
    subject = "» My Subject"                   
    msg = MIMEText(body,'plain','utf-8')
    msg['Subject'] = Header(subject,'utf-8')
    text = msg.as_string()
    

    主题字符串将在电子邮件中编码为

    =?utf-8?q?=C2=BB_My_Subject?=
    

    在python 2.x中以前的代码对我有用的事实可能与邮件客户端能够解释错误编码的标头有关。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看