Python 3 smtplib使用unicode字符发送
-
07-07-2019 - |
题
我在使用Python 3中的smtplib通过电子邮件发送unicode字符时出现问题。这在3.1.1中失败,但在2.5.4中有效:
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
我尝试了一些来自文档的例子,但也失败了。 http://docs.python.org/3.1/library/email-examples。 html ,将目录内容作为MIME消息示例发送
有什么建议吗?
解决方案
关键是文档一个>:
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
MIMENonMultipart的子类, MIMEText类用于创建MIME 主要文本的对象。 _text是 有效负载的字符串。 _subtype 是次要类型,默认为 平原。 _charset是字符集 的文本,并作为一个传递 MIMENonMultipart的参数 构造函数;它默认为us-ascii。 不执行猜测或编码 关于文本数据。
所以你需要的是,不是 msg = MIMEText('€10')
,而是:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
虽然没有明确记录,但 sendmail 需要一个字节字符串,而不是Unicode字符串(这是SMTP协议指定的内容);看看 msg.as_string()
对于构建它的两种方式中的每一种看起来都是这样的 - 给定“没有猜测或编码”,你的方式仍然有那个欧元字符(并且没有) sendmail将其转换为字节串的方式,我的没有(并且utf-8在整个过程中都有明确规定)。
其他提示
MIMEText
的 _charset
参数根据 us-ascii /library/email.mime.html#email.mime.text.MIMEText"rel =“nofollow noreferrer”> docs 。由于€
不是来自us-ascii,因此无效。
您尝试过的文档中的示例明确指出:
对于此示例,假设文本文件仅包含ASCII字符。
您可以使用 。您的邮件上的get_charset
方法用于调查字符集,还有 .set_charset
。
Gus Mueller有一个类似的问题: http://bugs.python.org/issue4403