Desidero inviare messaggi di posta elettronica con corpi unicode arbitrari in un programma Python 3.2. Ma, in realtà, questi messaggi consisteranno in gran parte di testo ASCII a 7 bit. Quindi mi piacerebbe che i messaggi fossero codificati in utf-8 usando il quoted-printable. Finora, ho trovato questo funziona, ma sembra sbagliato:Come utilizzare il modulo email Python 3.2 per inviare messaggi Unicode codificati in utf-8 con quoted-printable?
c = email.charset.Charset('utf-8')
c.body_encoding = email.charset.QP
m = email.message.Message()
m.set_payload("My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1'), c)
Ciò si traduce in un messaggio di posta elettronica con esattamente il contenuto giusto:
To: [email protected]
From: [email protected]
Subject: This is a subjective subject.
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
My message with an '=D7=90' in it.
In particolare b'\xd7\x90'.decode('utf-8')
risultati nel carattere originale Unicode . Quindi la codifica quoted-printable
sta correttamente rendendo il utf-8
. Sono consapevole che si tratta di un trucco incredibilmente brutto. Ma funziona.
Questo è Python 3. Le stringhe di testo dovrebbero essere sempre unicode. Non dovrei decodificarlo in utf-8. E poi trasformarlo da bytes
di nuovo in str
da .decode('iso8859-1')
è un attacco orribile e non dovrei dovere fare neanche quello.
E 'il modulo email
appena rotto rispetto alle codifiche? Non sto ottenendo qualcosa?
Ho appena provato a impostarlo, senza set di caratteri. Questo mi lascia con un messaggio e-mail unicode, e non è affatto giusto. Ho anche provato a lasciare i passi encode
e decode
. Se li lascio entrambi, si lamenta che lo \u05d0
è fuori portata quando si tenta di decidere se quel carattere deve essere citato nella codifica quoted-printable. Se lascio solo il passaggio encode
, si lamenta amaramente di come sto passando in un bytes
e vuole un str
.
Se ' "Il mio messaggio con un '\ u05d0' in esso."' È l'unicode che desideri, allora non è possibile utilizzare '" Il mio messaggio con un '\ u05d0' in it. ". encode ('utf-8'). decode ('iso8859-1')' poiché questo un unicode differente. (Avrai modificato il messaggio.) – unutbu
@unutbu: Congratulazioni per aver scoperto perché il codice è molto brutto. Ma funziona. Raggiunge il risultato desiderato. Vedi il mio aggiornamento. – Omnifarious