2011-08-02 12 views
14

estoy usando módulo de Python MimeWriter para construir un mensaje y smtplib para enviar un mensaje de correo construida es:electrónico Codificación sujeto (SMTP) en Python con caracteres no ASCII

file msg.txt: 
----------------------- 
Content-Type: multipart/mixed; 
from: me<[email protected]> 
to: [email protected] 
subject: 主題 

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

主題 

utilizo el código de abajo para enviar un mail:

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) 

que recibo cuerpo del correo correctamente, pero sujeto no es adecuado,

subject: some junk characters 

主題   <- body is correct. 

s Please uggest? ¿Hay alguna manera de especificar la descodificación que se utilizará para el sujeto también, como se especifica para el cuerpo. ¿Cómo puedo obtener el tema decodificado correctamente?

+1

oh caracteres chinos están distorsionados aquí después de publicar la pregunta – Rakesh

+0

relacionado: [¿Cómo puedo enviar un correo electrónico usando Python?] (http://stackoverflow.com/q/9272257/4279) – jfs

Respuesta

23

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

Asunto: = utf-8 b 5Li76aGM =

más simple:????????

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

= utf-8 b 5Li76aGM =

+1

Esta debería ser la respuesta aceptada. –

6

El asunto se transmite como un encabezado SMTP, y se requiere que sean ASCII -solo. Para admitir las codificaciones en el tema, debe prefijar el sujeto con la codificación que desee utilizar. En su caso, le sugiero que prefija el tema con? UTF-8? B? lo que significa UTF-8, Base64 codificado.

En otras palabras, creo que el tema de cabecera debe más o menos el siguiente aspecto:

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

En PHP que podría ir en ello como esto:

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

En Python:

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

intentaré esto, mientras tanto, hay alguna aplicación python para convertir al formato anterior. es decir, anexar automáticamente los caracteres en función de la codificación requerida – Rakesh

+1

No estoy seguro. Acabo de recordar esa parte de hace mucho tiempo cuando me metía con este problema. [Esta respuesta] (http://stackoverflow.com/questions/5910104/python-how-to-send-utf-8-e-mail#answer-5910530) parece sugerir que se hace bien si usa el MIMEMultipart clase en lugar de MimeWriter. – AHM

+2

debe buscar aquí [cómo generar encabezados internacionalizados] (http://docs.python.org/library/email.header.html) – mata

Cuestiones relacionadas