Python 3 smtplib使用Unicode字符发送

发布于 2021-01-29 17:49:31

我在使用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消息示例的形式发送目录的内容

有什么建议?

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

    关键在docs中

    class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
    

    MIMEText类是MIMENonMultipart的子类,用于创建主要类型文本的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无法将其转换为字节串),我的没有’t(整个utf-8均已明确指定)。



知识点
面圈网VIP题库

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

去下载看看