Python 3 smtplib invia con caratteri unicode
-
07-07-2019 - |
Domanda
Sto riscontrando un problema con l'invio tramite e-mail di caratteri Unicode tramite smtplib in Python 3. Ciò non riesce in 3.1.1, ma funziona 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()
Ho provato un esempio dai documenti, che ha fallito. http://docs.python.org/3.1/library/email-examples. html , Invia i contenuti di una directory come esempio di messaggio MIME
Qualche suggerimento?
Soluzione
La chiave è in i documenti :
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
Una sottoclasse di MIMENonMultipart, il La classe MIMEText viene utilizzata per creare MIME oggetti di tipo testo principale. _text è la stringa per il payload. _subtype è il tipo minore e il valore predefinito è pianura. _charset è il set di caratteri del testo e viene passato come a parametro per MIMENonMultipart costruttore; il valore predefinito è us-ascii. Non viene eseguita alcuna ipotesi o codifica sui dati di testo.
Quindi ciò di cui hai bisogno è chiaramente non msg = MIMEText ('& # 8364; 10')
, ma piuttosto:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
Pur non essendo tutto ciò chiaramente documentato, sendmail necessita di una stringa di byte, non di una Unicode (questo è ciò che specifica il protocollo SMTP); guarda come appare msg.as_string ()
per ciascuno dei due modi di costruirlo - dato il "nessun indovinare o codificare", il tuo modo ha ancora quel carattere euro lì dentro (e no modo per sendmail di trasformarlo in un bytestring), il mio no (e utf-8 è chiaramente specificato in tutto).
Altri suggerimenti
_charset
di MIMEText
viene impostato automaticamente su us-ascii
secondo docs . Poiché & # 8364;
non proviene dal set us-ascii, non funziona.
esempio nei documenti che hai provato afferma chiaramente:
Per questo esempio, supponiamo che il file di testo contenga solo caratteri ASCII.
Puoi usare . get_charset
sul tuo messaggio per indagare sul set di caratteri, per inciso c'è anche .set_charset
.
Gus Mueller ha avuto un problema simile: http://bugs.python.org/issue4403