Кодирование темы письма (SMTP) в Python с не-ASCII символами - PullRequest
17 голосов
/ 02 августа 2011

Я использую модуль 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

主題

Я использую код ниже для отправки почты:

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)

Я получаю тело письма правильно, но тема не указана,

subject: some junk characters

主題           <- body is correct.

Пожалуйста, предложите? Есть ли способ указать декодирование, которое будет использоваться для предмета также, как указано для тела. Как я могу правильно расшифровать объект?

Ответы [ 2 ]

31 голосов
/ 22 октября 2012

С 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()

Тема: =? Utf-8? B? 5Li76aGM? =

более просто:

from email.header import Header
print Header('主題', 'utf-8').encode()

=? UTF-8? Б? 5Li76aGM? =

6 голосов
/ 02 августа 2011

Тема передается в виде заголовка SMTP, и они должны быть ASCII -только.Для поддержки кодировок в предмете вам необходимо добавить в префикс любую кодировку, которую вы хотите использовать.В вашем случае я бы предложил префикс темы с «UTF-8» B?что означает UTF-8 , Base64 закодировано.

Другими словами, я считаю, что ваш заголовок темы должен более или менее выглядеть следующим образом:

Subject: =?UTF-8?B?JiMyMDAyNzsmIzM4OTg4Ow=?=

В PHP вы можете сделать это следующим образом:

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

В Python:

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