Python 3 smtplib mit Unicode-Zeichen senden
-
07-07-2019 - |
Frage
Ich habe ein Problem mit Unicode-Zeichen E-Mail mit smtplib in Python 3. Dies scheitert in 3.1.1, funktioniert aber in 2.5.4:
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
Ich habe versucht, ein Beispiel aus der Dokumentation, die ebenfalls fehlgeschlagen. http://docs.python.org/3.1/library/email-examples. html , das senden den Inhalt eines Verzeichnisses als MIME-Nachricht Beispiel
Irgendwelche Vorschläge?
Lösung
Der Schlüssel ist in der Dokumentation :
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
Eine Unterklasse von MIMENonMultipart, die Mime Klasse wird verwendet, MIME zu erstellen Objekte der Haupttyp Text. _text ist die Zeichenfolge für die Nutzlast. _subtype ist der kleinere Typ und Standardwerte einfach. _charset ist der Zeichensatz des Textes und wird als eine bestandene Parameter an die MIMENonMultipart Konstrukteur; Der Standardwert ist us-ascii. Kein erraten oder Codierung durchgeführt werden auf den Textdaten.
Also, was Sie brauchen, ist klar, nicht msg = MIMEText('€10')
, sondern:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
Auch wenn nicht alle, die eindeutig dokumentiert, Sendmail muss ein Byte-String, kein Unicode ein (das ist, was das SMTP-Protokoll spezifiziert); Blick auf das, was msg.as_string()
sieht aus wie für jede der beiden Möglichkeiten, es zu bauen - angesichts der „no Erraten oder Codierung“, Ihren Weg hat immer noch, dass Euro-Zeichen in dort (und keine Möglichkeit für Sendmail in eine bytestring zu drehen), Mine nicht (und utf-8 ist eindeutig im gesamten angegeben).
Andere Tipps
_charset
Parameter MIMEText
standardmäßig us-ascii
gemäß der docs . Da €
nicht von der US-ASCII-Zeichensatz es nicht funktioniert.
Beispiel in der Dokumentation, die Sie versucht haben, eindeutig fest:
Für dieses Beispiel wird angenommen, dass die Textdatei nur ASCII-Zeichen enthält.
könnten Sie .get_charset
Methode auf Ihre Nachricht die charset zu untersuchen, gibt es übrigens .set_charset
auch.
Gus Mueller hatte ein ähnliches Problem: http://bugs.python.org/issue4403