当前位置: 首页 > 面试题库 >

MIMEText中标头的编码

谷梁嘉悦
2023-03-14
问题内容

我正在使用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中没有给出任何错误(这并不意味着结果正确)。


问题答案:

我找到了解决方案。包含非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中以前的代码对我有用的事实可能与邮件客户端能够解释错误编码的标头有关。



 类似资料:
  • 问题内容: 我需要在JTable标头中包含多个可编辑的行,以便同一标头列可以同时包含JTextField和JButton。 我发现了如何实现可编辑的标题单元以及如何拆分标题单元。但是事实证明,这些方法有些不同,我需要将它们融合为一个。 是否已经开发了多个可编辑的JTable标头行解决方案,所以我不需要重新发明自行车了? 到目前为止,我发现了什么: 可编辑标头行代码,摘自:http : //www.

  • 我正在使用axios@0.21.1我想验证响应头。我无法从GET响应验证标题“内容类型”和“内容编码”。 “内容类型”:无论我在请求中传递什么内容类型,响应中的内容类型始终是application/JSON。示例代码段: 当我检查回复时。我看到内容类型显示为“application/json”,而不是自定义类型。但当我在《邮递员》中点击相同的url时,我可以看到内容类型和预期的一样。 任何帮助都是

  • 我有两个钥匙扣客户, Angular 4:具有访问类型凭据身份验证 一个JAX-RS应用程序(它将是资源服务器):具有仅承载身份验证!在这个客户端中,我们激活CORS,如下面的json所示 问题是,JAX-RS应用程序的状态代码为401(未授权)的HTTP响应没有给javascript客户端带来所需的CORS报头! 当HTTP状态为401时,我们如何添加相应的CORS标头?

  • 我们什么时候应该在HttpRequest estMessage对象中使用标头而不是HttpClient中的标头?? 我们需要添加授权(总是在变化)和一些自定义标头(总是在变化) 问题 > 首选哪种方法 我是否应该向HttpClient添加公共头(所有请求都相同),并向HttpRequestMessage对象添加基于请求的头??

  • 我的logback.xml如下: 当我查看wireshark的输出时,我只看到记录的JSON(没有给出PRI头字段) 如果切换到标准logback Syslog appender(非JSON输出)

  • 问题内容: 我有一个Objective-C项目,也有一个快速入门项目,我还配置了Objective- C桥接头。我也已经在.pch文件中添加了’MyprojectName-Swift.h’。 这在xcode 8.2上工作正常,但是当我从xcode 9构建项目时,出现以下错误。 无法发出预编译的标头’/Library/Developer/Xcode/DerivedData/MyprojectName