Decodificar 'QP' en Python

votos
0

Quiero decodificar cadenas 'imprimibles citados' codificados en Python, pero me parece que estoy atascado en un punto.

Voy a buscar ciertos correos de mi cuenta de Gmail basado en el código siguiente:

import imaplib
import email
import quopri


mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('mail@gmail.com', '*******')
mail.list()

mail.select('[Gmail]/All Mail') 



typ, data = mail.search(None, 'SUBJECT', '{}'.format('123456'))

data[0].split()

print(data[0].split())

for e_mail in data[0].split():
    typ, data = mail.fetch('{}'.format(e_mail.decode()),'(RFC822)')
    raw_mail = data[0][1]
    email_message = email.message_from_bytes(raw_mail)
    if email_message.is_multipart():
        for part in email_message.walk():
            if part.get_content_type() == 'text/plain':
                if part.get_content_type() == 'text/plain':
                    body = part.get_payload()
                    to = email_message['To']

                    utf = quopri.decodestring(to)

                    text = utf.decode('utf-8')
                    print(text)
.
.
.

Si imprimo 'to'por ejemplo, el resultado es este el caso 'a' tiene caracteres como E, A, O ...:

=?UTF-8?B?UMOpdGVyIFBldMWRY3o=?=

Puedo decodificar la ' bodycadena citado imprimible' codificado utilizando con éxito el quopri biblioteca como tal:

quopri.decodestring(sometext).decode('utf-8') 

Pero la misma lógica no funciona para otras partes del correo electrónico, como el hacia, desde sujeto.

Alguien conoce una pista?

Publicado el 27/11/2018 a las 16:56
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Esto resuelve que:

from email.header import decode_header
      def mail_header_decoder(header):
            if header != None:
                mail_header_decoded = decode_header(header)
                l=[]  
                header_new=[]
                for header_part in mail_header_decoded: 
                    l.append(header_part[1])

                if all(item == None for item in l):
                    # print(header)
                    return header
                else:
                    for header_part in mail_header_decoded:
                        header_new.append(header_part[0].decode())
                    header_new = ''.join(header_new) # convert list to string
                    # print(header_new)
                    return header_new
Respondida el 28/11/2018 a las 21:43
fuente por usuario

votos
0

Usted está tratando de descifrar los caracteres latinos con UTF-8. La salida que está recibiendo es base64. Se lee:

No hay caracteres imprimibles que se encuentran, intentan otra fuente de juego de caracteres, o cargue sus datos como un archivo binario para la decodificación.

Seguirlo. Python: La conversión de ISO-8859-1 / latin1 a UTF-8

Respondida el 27/11/2018 a las 18:15
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more