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?

È stato utile?

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

Il parametro

_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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top