2014-11-18 18 views
5

Sto lavorando all'impostazione di uno script che inoltra la posta in arrivo a un elenco di destinatari.Codifica corpo posta elettronica Python 3

Ecco quello che ho adesso:

ho letto l'e-mail da stdin (che è come postfix passa):

email_in = sys.stdin.read() 

incoming = Parser().parse(email_in) 

sender = incoming['from'] 
this_address = incoming['to'] 

I test per multipart:

if incoming.is_multipart(): 
    for payload in incoming.get_payload(): 
     # if payload.is_multipart(): ... 
     body = payload.get_payload() 
else: 
    body = incoming.get_payload(decode=True)` 

ho creato il messaggio in uscita:

msg = MIMEMultipart() 
msg['Subject'] = incoming['subject'] 
msg['From'] = this_address 
msg['reply-to'] = sender 
msg['To'] = "[email protected]" 
msg.attach(MIMEText(body.encode('utf-8'), 'html', _charset='UTF-8')) 

s = smtplib.SMTP('localhost') 
s.send_message(msg) 
s.quit() 

Funziona piuttosto bene con caratteri ASCII (testo inglese), lo inoltra e tutto.

Quando invio caratteri non ASCII, però, restituisce senza senso (a seconda del byte client di posta elettronica o rappresentazioni ASCII dei caratteri UTF-8 caratteri)

Quale può essere il problema? È sul lato in arrivo o in uscita?

+0

Non dovresti codificare il carico utile per la parte 'MIMEText'; ti codificherà per te, scegliendo comunque un set di caratteri adatto. Non che questo cambi l'output. –

risposta

3

Il problema è che molti client di posta elettronica (incluso Gmail) inviano email non ascii in base64. stdin d'altra parte passa tutto in una stringa. Se lo analizzi con Parser.parse(), restituisce un tipo di stringa con base64 all'interno.

Invece l'argomento decode facoltativo deve essere utilizzato nel metodo get_payload(). Quando viene impostato, il metodo restituisce un tipo di byte. Dopo di che è possibile utilizzare il metodo integrato decode() per ottenere stringa UTF-8 in questo modo:

body = payload.get_payload(decode=True) 
body = body.decode('utf-8') 

C'è grande intuizione in UTF-8 e pitone Ned Batchelder's talk.

mio codice finale funziona un po 'diverso, è puoi controllare anche questo here.

Problemi correlati