Кодирование темы почты (SMTP) в Python с символами, отличными от ASCII
Я использую модуль Python MimeWriter
для создания сообщения и smtplib для отправки сообщения, созданного по почте:
file msg.txt:
-----------------------
Content-Type: multipart/mixed;
from: me<[email protected]>
to: [email protected]
subject: 主題
Content-Type: text/plain;charset=utf-8
主題
Я использую следующий код для отправки почты:
import smtplib
s=smtplib.SMTP('smtp.abc.com')
toList = ['[email protected]']
f=open('msg.txt') #above msg in msg.txt file
msg=f.read()
f.close()
s.sendmail('[email protected]',toList,msg)
Я получаю почтовый ящик правильно, но субъект не является правильным,
subject: some junk characters
主題 <- body is correct.
Пожалуйста, предложите? Есть ли способ указать декодирование, которое будет использоваться для объекта, также,
как указано для тела. Как я могу получить объект, декодированный правильно?
Ответы
Ответ 1
Из 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? =
Ответ 2
Объект передается как заголовок 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