2012-05-11 23 views
11

Estoy generando correo electrónico con la ayuda del módulo de correo electrónico de Python.
Éstos son pocas líneas de código, lo que demuestra mi pregunta:Módulo de correo electrónico de Python: encabezado de formulario "De" con un nombre unicode + correo electrónico

msg = email.MIMEMultipart.MIMEMultipart('alternative') 

msg['From'] = "[email protected]" 

msg.as_string() 

Out[7]: 'Content-Type: multipart/alternative;\n boundary="===============9006870443159801881=="\nMIME-Version: 1.0\nFrom: [email protected]\n\n--===============9006870443159801881==\n\n--===============9006870443159801881==--' 

Como se puede ver, todo está bien aquí, Del El campo contiene la hormiga de correo electrónico que esté fría. ¿Pero qué sucede si quiero agregar algún nombre antes del correo electrónico? Especialmente Unicode uno:

In [8]: u.get_full_name() 
Out[8]: u'\u0414\u0438\u043c\u0430 \u0426\u0443\u043a\u0430\u043d\u043e\u0432' 

In [9]: msg = email.MIMEMultipart.MIMEMultipart('alternative') 

In [10]: msg['From'] = "%s <%s>" % (u.get_full_name(), "[email protected]") 

In [11]: msg.as_string() 
Out[11]: 'Content-Type: multipart/alternative;\n boundary="===============5792069034892928634=="\nMIME-Version: 1.0\nFrom: =?utf-8?b?0JTQuNC80LAg0KbRg9C60LDQvdC+0LIgPGVtYWlsQGF0LmNvbT4=?=\n\n--===============5792069034892928634==\n\n--===============5792069034892928634==--' 

Aquí se puede ver, que toda la cadena (nombre, e-mail) fue codificado en base 64 (e incluso es bastante lógico, ¿cómo MimeMultipart sabrá que la cadena contiene Unicode y no Unicode piezas)
lo tanto, mi pregunta es: ¿Por qué tengo que decirle módulo de e-mail para hacerme bastante encabezado "De" como:
From: =?UTF-8?B?0JLQmtC+0L3RgtCw0LrRgtC1?= <[email protected]> ?

Además, he aprendido un poco RFC2822 (http: //www.faqs .org/rfcs/rfc2822.html, p.3.6.2). Cuenta:

Los campos del autor indican los buzones de la fuente del mensaje . El campo "De:" especifica el autor (es) del mensaje, , es decir, el/los buzón (es) de la (s) persona (s) o sistema (s) responsables para la escritura del mensaje. El campo "Remitente:" especifica el buzón del agente responsable de la transmisión real del mensaje . Por ejemplo, si una secretaria enviara un mensaje para otra persona, el buzón de la secretaria aparecería en el campo "Remitente:" y el buzón del autor real aparecería en el campo "De:". Si el originador del mensaje puede indicarse por un solo buzón y el autor y el transmisor son idénticos, el campo "Remitente:" NO DEBE utilizarse. De lo contrario, aparecerán ambos campos DEBERÍA aparecer .

¿Significa que debería combinar estos dos encabezados? (De y remitente). Estoy un poco confundido, porque noté una gran cantidad de mensajes de correo electrónico en mi gmail (mirando a través de "Mostrar original"), donde aparecen en el campo Nombre de campo y correo electrónico.

Gracias por la ayuda.

Respuesta

32

Usted necesita para codificar la parte del nombre por separado utilizando email.header.Header:

from email.MIMEMultipart import MIMEMultipart 
from email.header import Header 
from email.utils import formataddr 

author = formataddr((str(Header(u'Alał', 'utf-8')), "[email protected]")) 
msg = MIMEMultipart('alternative') 
msg['From'] = author 
print msg 

espero que esto ayudará.

+0

¡INCREÍBLE! Esto es exactamente lo que necesito, ¡gracias! –

+0

¡He estado tratando de resolverlo durante varias horas! ¡Gracias! – Ofir

+0

gracias, para las personas que confunden el segundo paréntesis de formataddr, representa la tupla. – iownthegame

Cuestiones relacionadas