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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top