2012-05-11 9 views
11

Sto generando e-mail con l'aiuto del modulo email Python.
Qui ci sono poche righe di codice, che dimostra la mia domanda:Modulo email Python: intestazione modulo "Da" con un nome unicode + email

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==--' 

Come si può vedere, è tutto a posto qui, Dal campo contiene email formica è fresco. Ma cosa succede se voglio aggiungere un nome prima dell'email? Soprattutto 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==--' 

Qui si può vedere, che tutta la stringa (nome, e-mail) è stato codificato in base64 (ed è anche abbastanza logico, come MimeMultipart saprà che stringa contiene unicode e non-unicode parti).
Quindi, la mia domanda è: come devo dire modulo e-mail per farmi bella "From" del tipo:
From: =?UTF-8?B?0JLQmtC+0L3RgtCw0LrRgtC1?= <[email protected]> ?

Inoltre, ho imparato un po 'di RFC2822 (http: //www.faqs .org/rfcs/rfc2822.html, p.3.6.2). Indica:

I campi di origine indicano la/e cassetta/e della sorgente del messaggio . Il campo "Da:" specifica l'autore (i) del messaggio, ovvero, la/e cassetta/e della (e) persona (e) o dei sistemi responsabili per la scrittura del messaggio. Il campo "Mittente:" specifica la cassetta postale dell'agente responsabile della trasmissione effettiva del messaggio . Ad esempio, se un segretario dovesse inviare un messaggio per ad un'altra persona, la casella di posta della segreteria apparirebbe nel campo "Sender:" e la cassetta postale dell'autore effettivo comparirà nel campo "Da:" nel campo . Se il mittente del messaggio può essere indicato con da una singola casella di posta e l'autore e il trasmettitore sono identici, il campo "Sender:" NON DEVE essere utilizzato. In caso contrario, verranno visualizzati entrambi i campi DOVREBBE .

Significa che dovrei combinare queste due intestazioni? (Da e mittente). Sono un po 'confuso, perché ho notato molte e-mail nella mia gmail (guardando attraverso "Mostra originale") in cui vengono visualizzati il ​​nome e l'e-mail del campo Da.

Grazie per l'aiuto.

risposta

32

È necessario codificare la parte del nome separatamente utilizzando 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 

Spero che questo vi aiuterà.

+0

FANTASTICO! Questo è esattamente ciò di cui ho bisogno, grazie! –

+0

Ho cercato di capirlo per diverse ore! Grazie! – Ofir

+0

grazie, per le persone che confondono la seconda parentesi di formataddr, rappresenta la tupla. – iownthegame

Problemi correlati