使用非ASCII字符在Python中编码邮件主题(SMTP)

Rak*_*esh 18 python smtp utf-8 character-encoding cjk

我使用Python模块MimeWriter构造消息,smtplib发送邮件构造的消息是:

file msg.txt:
-----------------------
Content-Type: multipart/mixed;
from: me<me@abc.com>
to: me@abc.com
subject: ??

Content-Type: text/plain;charset=utf-8

??
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码发送邮件:

import smtplib
s=smtplib.SMTP('smtp.abc.com')
toList = ['me@abc.com']
f=open('msg.txt') #above msg in msg.txt file
msg=f.read()
f.close()
s.sendmail('me@abc.com',toList,msg)
Run Code Online (Sandbox Code Playgroud)

我正确收到邮件正文,但主题不合适,

subject: some junk characters

??           <- body is correct.
Run Code Online (Sandbox Code Playgroud)

请指教?有没有办法指定用于主题的解码,如为正文指定的那样.如何正确解码主题?

Sér*_*gio 32

来自http://docs.python.org/library/email.header.html

from email.message import Message
from email.header import Header
msg = Message()
msg['Subject'] = Header('??', 'utf-8')
print msg.as_string()
Run Code Online (Sandbox Code Playgroud)

主题:=?utf-8?b?5Li76aGM?=

更简单:

from email.header import Header
print Header('??', 'utf-8').encode()
Run Code Online (Sandbox Code Playgroud)

=?UTF-8 2 B 4 5Li76aGM?=


AHM*_*AHM 6

主题作为SMTP标头传输,它们必须是ASCII -only.要支持主题中的编码,您需要使用您要使用的任何编码为主题添加前缀.在你的情况下,我建议在主题前加上?UTF-8?B?这意味着UTF-8,Base64编码.

换句话说,我相信您的主题标题应该或多或少看起来像这样:

Subject: =?UTF-8?B?JiMyMDAyNzsmIzM4OTg4Ow=?=
Run Code Online (Sandbox Code Playgroud)

在PHP中你可以像这样:

// Convert subject to base64
$subject_base64 = base64_encode($subject);
fwrite($smtp, "Subject: =?UTF-8?B?{$subject_base64}?=\r\n");
Run Code Online (Sandbox Code Playgroud)

在Python中:

import base64
subject_base64 = base64.encodestring(subject).strip()
subject_line = "Subject: =?UTF-8?B?%s?=" % subject_base64
Run Code Online (Sandbox Code Playgroud)

  • 你应该在这里查看[如何生成国际化标题](http://docs.python.org/library/email.header.html) (2认同)