【问题标题】:Encoding of headers in MIMETextMIMEText 中的标头编码
【发布时间】:2013-04-11 15:58:13
【问题描述】:

我正在使用 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 - How to send utf-8 e-mail?

编辑:我想补充一点,相同的代码在 Python 2.7 中不会出现任何错误(认为这并不意味着结果是正确的)。

【问题讨论】:

    标签: python email python-3.x mime-message


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我发现替换

      msg['Subject'] = subject
      

      msg.add_header('Subject', subject)
      

      用于显示 UTF-8。如果你想要另一个字符集,你也可以这样做。尝试help(msg.add_header) 以查看相关文档(将值,即subject 替换为包含三个元素的元组:(字符集、语言、值)。

      无论如何,这似乎比其他方法简单一点——所以,我想我会提到它。我决定尝试这个,因为 add_header 似乎更频繁地用于“reply-to”标题而不是仅仅执行 msg["reply-to"]=your_reply_to_email。所以,我想也许它对主题也会更好——文档说它默认支持 UTF-8(我测试过,它工作)。

      【讨论】:

        猜你喜欢
        • 2020-10-11
        • 2019-10-18
        • 2018-03-21
        • 2013-02-03
        • 2010-09-24
        • 2013-06-15
        • 2012-12-17
        • 2011-12-31
        • 2014-11-05
        相关资源
        最近更新 更多