Deseo enviar mensajes de correo electrónico que tengan cuerpos Unicode arbitrarios en un programa Python 3.2. Pero, en realidad, estos mensajes consistirán en gran parte de texto ASCII de 7 bits. Entonces me gustaría que los mensajes codificados en utf-8 usen citado-imprimible. Hasta el momento, he encontrado que esto funciona, pero parece mal:¿Cómo uso el módulo de correo electrónico Python 3.2 para enviar mensajes Unicode codificados en utf-8 con imprimible entre comillas?
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)
Esto se traduce en un mensaje de correo electrónico con exactamente el contenido correcto:
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.
En particular b'\xd7\x90'.decode('utf-8')
resultados en el carácter Unicode originales . Por lo tanto, la codificación quoted-printable
representa correctamente el utf-8
. Soy muy consciente de que este es un hack increíblemente feo. Pero funciona.
Esto es Python 3. Se espera que las cadenas de texto siempre sean unicode. No debería tener que decodificarlo para utf-8. Y luego convertirlo de bytes
de nuevo en str
por .decode('iso8859-1')
es un truco horrible, y no debería tener que hacer eso tampoco.
¿El módulo email
acaba de romperse con respecto a las codificaciones? ¿No estoy recibiendo algo?
He intentado simplemente establecerlo antiguo, sin juego de caracteres. Eso me deja con un mensaje de correo electrónico Unicode, y eso no está bien. También intenté dejar los pasos encode
y decode
. Si los dejo a ambos, se queja de que el \u05d0
está fuera de rango al tratar de decidir si ese carácter necesita ser citado en la codificación imprimible entre comillas. Si salgo solo en el paso encode
, se queja amargamente de cómo estoy pasando en un bytes
y quiere un str
.
Si ' "Mi mensaje con un '\ u05d0' en ella."' Es el Unicode que desea, entonces no se puede usar '" Mi mensaje con un '\ u05d0' en it. ". encode ('utf-8'). decode ('iso8859-1')' ya que este es un unicode diferente. (Habrá alterado el mensaje.) – unutbu
@unutbu: Felicidades por descubrir por qué el código es muy feo. Pero funciona. Alcanza el resultado deseado. Ver mi actualización – Omnifarious