Расшифровать «цитируемый для печати» в Python - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу декодировать закодированные в кавычки строки в Python, но я застрял в какой-то момент.

Я получаю определенные письма из своей учетной записи gmail на основе следующего кода:

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)
.
.
.

Если я, например, печатаю 'to', результат будет такой, если в 'to' есть такие символы, какé, á, ó ...:

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

Я могу успешно декодировать закодированную кодированную строку 'body', используя библиотеку quopri , как таковую:

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

Но та же логика не работает для других частей электронной почты, например, для, от, субъекта.

Кто-нибудь знает подсказку?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Это решает это:

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
0 голосов
/ 27 ноября 2018

Вы пытаетесь декодировать латинские символы, используя utf-8.Вывод, который вы получаете, base64.На нем написано:

Не найдено печатных символов, попробуйте другую исходную кодировку или загрузите ваши данные в виде файла для двоичного декодирования.

Попробуйте. Python: преобразование из ISO-8859-1 / latin1 в UTF-8

...