Codificar MIMEText como imprimibles citados

Python es compatible con una biblioteca MIME bastante funcional llamada email.mime .

Lo que quiero lograr es obtener una parte MIME que contenga texto en formato UTF-8 para codificarlo como imprimibles entre comillas y no como base64. Aunque toda la funcionalidad está disponible en la biblioteca, no logré usarla:

Ejemplo:

 import email.mime.text, email.encoders m=email.mime.text.MIMEText(u'This is the text containing ünicöde', _charset='utf-8') m.as_string() # => Leads to a base64-encoded message, as base64 is the default. email.encoders.encode_quopri(m) m.as_string() # => Leads to a strange message 

El último comando lleva a un mensaje extraño:

 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Transfer-Encoding: quoted-printable GhpcyBpcyB0aGUgdGV4dCBjb250YWluaW5nIMO8bmljw7ZkZQ=3D=3D 

Obviamente, esto no está codificado como imprimibles entre comillas, el encabezado de doble transfer-encoding es extraño por fin (si no es ilegal).

¿Cómo puedo obtener mi texto codificado como imprimibles entre comillas en el mensaje mime?

De acuerdo, tengo una solución que es muy intrincada, pero al menos lleva en alguna dirección: MIMEText asume base64 y no sé cómo cambiar esto. Por esta razón utilizo MIMENonMultipart :

 import email.mime, email.mime.nonmultipart, email.charset m=email.mime.nonmultipart.MIMENonMultipart('text', 'plain', charset='utf-8') #Construct a new charset which uses Quoted Printables (base64 is default) cs=email.charset.Charset('utf-8') cs.body_encoding = email.charset.QP #Now set the content using the new charset m.set_payload(u'This is the text containing ünicöde', charset=cs) 

Ahora el mensaje parece estar codificado correctamente:

 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is the text containing =C3=BCnic=C3=B6de 

Incluso se puede construir una nueva clase que oculta la complejidad:

 class MIMEUTF8QPText(email.mime.nonmultipart.MIMENonMultipart): def __init__(self, payload): email.mime.nonmultipart.MIMENonMultipart.__init__(self, 'text', 'plain', charset='utf-8') utf8qp=email.charset.Charset('utf-8') utf8qp.body_encoding=email.charset.QP self.set_payload(payload, charset=utf8qp) 

Y úsalo así:

 m = MIMEUTF8QPText(u'This is the text containing ünicöde') m.as_string() 

Adaptado del número 1525919 y probado en python 2.7:

 from email.Message import Message from email.Charset import Charset, QP text = "\xc3\xa1 = \xc3\xa9" msg = Message() charset = Charset('utf-8') charset.header_encoding = QP charset.body_encoding = QP msg.set_charset(charset) msg.set_payload(msg._charset.body_encode(text)) print msg.as_string() 

Te regalaré:

 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =C3=A1 =3D =C3=A9 

También vea esta respuesta de un comentarista de Python.