Расшифровка Hex при извлечении многоязычных данных электронной почты с помощью imaplib в Python - PullRequest
0 голосов
/ 31 октября 2019

Как мне превратить это:

With Best Regards, JS Chen*\r\n\r\n=E9=A0=8E=E9=82=A6=E7=A7=91=E6=8A=80=E8=82=A1=E4=BB=BD=E6=9C=89=E9=99=90=E5=\r\n=85=AC=E5=8F=B8/Chipbond Technology 

в это:

With Best Regards, JS Chen*\r\n\r\n頎邦科技股份有限公司/Chipbond Technology

с использованием Python?

Я извлекаю данные электронной почты на разных языках, используя imaplib ион дает мне этот шестнадцатеричный код с символами равенства между ними, когда есть другие языковые символы

Вот мой код:

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

mail.select('Inbox')

type, data = mail.search(None,'(SUBJECT "ULVAC RSH-820")')
mail_ids = data[0]
id_list = mail_ids.split()
print('searching...')

for num in data[0].split():
    typ, data = mail.fetch(num, '(RFC822)' )
    raw_email = data[0][1]
    raw_email_string = raw_email.decode('utf-8')
    email_message = email.message_from_string(raw_email_string)
    print('decoding..')
    for response_part in data:
        if isinstance(response_part, tuple):
            msg = email.message_from_string(response_part[1].decode('utf-8')) 

            if msg.is_multipart():
                print('de-partitioning...')
                for part in msg.walk():
                    ctype = part.get_content_type()
                    cdispo = str(part.get('Content-Disposition'))
                    if ctype == 'text/plain' and 'attachment' not in cdispo:
                        body = part.get_payload()


            else:
                body = msg.get_payload()

1 Ответ

0 голосов
/ 31 октября 2019

Ваши электронные письма имеют кодировку передачи контента , в частности, цитируемую-кодируемую кодировку , которая используется для обеспечения безопасности потока данных электронной почты в формате ASCII.

Просто скажите Python для декодирования полезной нагрузки, передав decode=True методу Message.get_payload() :

body_data = part.get_payload(decode=True)
charset = part.get_param("charset", "ASCII")
body = body_data.decode(charset, errors="replace")

Однако это означает, что выданные двоичные , даже для типов текстового содержимого и, следовательно, должны явно декодировать данные. get_payload() здесь не так уж полезно. Это также часть устаревшего API;Вы хотите переключиться на более новый Unicode-дружественный API. При загрузке сообщения используйте политику, отличную от compat32 (по умолчанию):

from email import policy

# ...

raw_email = data[0][1]
# you may have to use policy.default instead, depending on the line endings
# convention used.
email_message = email.message_from_bytes(raw_email, policy=policy.SMTP)

и далее вниз

msg = email.message_from_bytes(response_part[1], policy=policy.SMTP)

Обратите внимание, что я не декодируюсначала значение bytes. Используя email.message_from_bytes() вместо email.message_from_string(), вы делегируете декодирование данных парсеру email.

Теперь email_message - это email.message.EmailMessage экземпляр вместо старого email.message.Message() типа , и вы можете использовать EmailMessage.get_content() метод , который для текстовых типов MIME возвращает текстовую строку Unicode:

body = part.get_content()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...