Problemas de encoding y deencoding de correo electrónico de Python

Básicamente, quiero leer todos los nuevos correos electrónicos de una bandeja de entrada y ponerlos en una base de datos. La razón por la que uso python es porque tiene imaplib , pero no sé nada al respecto.

Actualmente, tengo algo como esto:

 def primitive_get_text_blocks(email_message_instance): maintype = email_message_instance.get_content_maintype() if maintype == 'multipart': return_parts = "" for part in email_message_instance.get_payload(): if part.get_content_maintype() == 'text': return_parts+= " "+ part.get_payload() return return_parts elif maintype == 'text': return email_message_instance.get_payload() return "" fromField=con.escape(email_message["From"]) contentField=con.escape(primitive_get_text_blocks(email_message)) 

primitivo get_text_blocks es una copia pegada desde algún lugar. El resultado es que obtengo entradas de base de datos como esta:

  

Por lo que entiendo, eso tiene algo que ver con estar codificado en utf-7 . Así que cambié a get_payload(decode=True) , pero eso me da matrices de bytes. Si agrego otra decode('utf-8') , a veces se bloquea con errores como

‘error de códec no puede decodificar a …’.

No sé cómo funcionan las codificaciones, solo quiero una cadena Unicode con el cuerpo de mi correo electrónico.

¿Por qué no hay un simple convert(charset from, charset to) ? ¿Cómo obtengo un cuerpo de correo electrónico legible (y dirección)? Descubrí IMAP Fetch Encoding y al usar decode_header no obtuve más.

Supongo que la encoding es la forma en que los bytes representan los caracteres, por lo que con esto en mente, ¿no debería decodificarse tomar una matriz de bytes y escupir una cadena? y aquí en el desbordamiento de stack me encontré con alguien que decía que tenía algo que ver con estar codificado con utf-8 y utf-7 . ¿Y eso que significa?

Hice google y parece que hay toneladas de duplicados, pero las respuestas que obtuvieron no me ayudaron (he intentado la mayoría de ellos)

Resulta que es bastante fácil. Aunque toda la documentación apunta al pasado glorioso cuando la función Unicode aún era una cosa real, ‘str’ hace lo mismo.

Entonces, para recapitular, debes pasar ‘decode = True’ con ‘getPayload’ y envolver eso alrededor de un str (…, ‘utf-8’).