2014-11-18 2 views
5

Ich arbeite an der Einrichtung eines Skripts, das eingehende Nachrichten an eine Liste von Empfängern weiterleitet.Python 3 E-Mail-Körpercodierung

Hier ist, was ich habe jetzt:

ich die E-Mail von stdin gelesen (das ist, wie Postfix es geht):

email_in = sys.stdin.read() 

incoming = Parser().parse(email_in) 

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

ich für mehrteiliger Test:

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)` 

I einrichten die ausgehende Nachricht:

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

Das funktioniert sehr gut mit ASCII-Zeichen (engl. Text), leitet sie weiter und alles.

Wenn ich aber nicht-ASCII-Zeichen zu senden, es gibt wieder Kauderwelsch (abhängig von der E-Mail-Client Bytes oder ascii Darstellungen der utf-8 Zeichen)

Was das Problem sein kann? Ist es auf der eingehenden oder der ausgehenden Seite?

+0

Sie sollten die Nutzlast für den 'MIMEText' Teil nicht codieren müssen; Es wird für Sie kodieren und trotzdem einen passenden Zeichensatz auswählen. Nicht dass dies die Ausgabe verändert. –

Antwort

3

Das Problem ist, dass viele E-Mail-Clients (einschließlich Gmail) nicht-ASCII-E-Mails in Base64 senden. stdin hingegen übergibt alles in eine Zeichenfolge. Wenn Sie das mit Parser.parse() analysieren, wird ein Stringtyp mit base64 zurückgegeben.

Stattdessen sollte das optionale Argument decode für die Methode get_payload() verwendet werden. Wenn das festgelegt ist, gibt die Methode einen Byte-Typ zurück. Danach können Sie die eingebaute decode() Methode verwenden können utf-8-String wie so zu erhalten:

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

Es großer Einblick in in utf-8 und Python Ned Batchelder's talk.

Mein letzter Code funktioniert ein bisschen anders ist, Sie kann das auch überprüfen