2017-01-28 4 views
0

Ich versuche, eine E-Mail zu senden und habe ein kleines Problem mit der Absenderadresse im Header-Teil des Nachrichteninhalts.Wie füge ich eine UTF-8 "From:" -Adresse zu einer E-Mail-Nachricht hinzu?

Im Grunde ist das, was ich in den Headern haben wollen:

From: "Real Name" <[email protected]> 

Und das ist, was ich tue (Python 3.5):

message = email.mime.text.MIMEText(body) 
message.add_header('From', from_hdr) 

Es ist, als für ASCII erwartet funktioniert, aber nicht für UTF-8.

ein Nicht-ASCII-Namen wie "Strángé Nämé" <[email protected]> die Eingabe von add_header() codiert wird Gegeben:

Wenn der Wert enthält Nicht-ASCII-Zeichen ..... es ist automatisch codiert in RFC 2231-Format unter Verwendung eines CHARSET von utf-8 und eine SPRACHE von Keine.

Das Problem ist, dass die ganze Zeichenfolge - nicht nur der echte Name - codiert ist. Das Ergebnis sieht wie eine einzelne Zeichenfolge aus: =?utf-8?.....?= und das ursprüngliche Format ist verloren. Der Mail-Server fügt ihm die scheinbar fehlende Domäne hinzu und der Schaden wird angerichtet.

Der Absender dann (decodiert durch die E-Mail-Programm des Empfängers) gezeigt wird, wie: "\"Strángé Nämé\" <[email protected]>"@server.example.com

Ich habe versucht, die Adresse mit email.utils.parseaddr() und codieren nur den echten Namen Teil mit email.utils.encode_rfc2231() zu teilen, aber das half nicht.

Ich vermeide UTF-8 in der Form: Feld für jetzt, weiß nicht, wie man richtig damit umgeht. Kannst du bitte helfen?

+0

Es sieht aus wie ich eine doppelte Frage gestellt habe. Das tut mir leid. Es gibt eine andere Antwort hier: http://stackoverflow.com/questions/10551933/python-email-module-form-header-from-with-some-unicode-name-email – VPfB

Antwort

1

Die folgende arbeitete für mich (in python2 sowie python3):

# -*- coding: utf-8 -*- 

import smtplib 
from email.mime.text import MIMEText 
from email.header import Header 

msg = MIMEText("Hi! This is Mr. Robot!") 

you = '[email protected]' 
me = Header('Strángé Nämé', 'utf-8') 
me.append('<[email protected]>', 'ascii') 

msg['Subject'] = 'Hi There' 
msg['From'] = me 
msg['To'] = you 

s = smtplib.SMTP('localhost') 
s.sendmail(me.__str__(), [you], msg.as_string()) 
s.quit() 

Der Trick der Header Klasse zu verwenden ist und die append() Methode

Die Nachricht wird dann wie folgt aussieht (msg.as_string()) :

Content-Type: text/plain; charset="us-ascii" 
MIME-Version: 1.0 
Content-Transfer-Encoding: 7bit 
Subject: Hi There 
From: =?utf-8?b?U3Ryw6FuZ8OpIE7DpG3DqQ==?= <[email protected]> 
To: [email protected] 
+0

Ja, der Trick funktioniert auch für mich. Die Dokumentation der 'Header'-Klasse besagt, dass das Mischen von Strings mit verschiedenen Codierungen in Ordnung ist. Ich frage mich nur, wo der Abstand zwischen dem echten Namen und der E-Mail-Adresse liegt. Wie auch immer, das Formularfeld ist jetzt in Ordnung. Vielen Dank. – VPfB

Verwandte Themen