Python IMAP от проблемы кодировки GMAIL - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать соединитель IMAP в Python для получения почты до ее обработки. Сейчас я делаю свой тест с GMAIL.

Вот письмо, которое я пытаюсь обработать: http://i.imgur.com/i1WU1gU.png

В моем коде вот что я делаю для сейчас:

import email
import chardet
import imaplib
for mail_id in data:
    res, data = self.conn.fetch(mail_id, '(BODY[HEADER.FIELDS (FROM)] BODY[HEADER.FIELDS (TO)] UID BODY[TEXT])')
    raw_body = data[0][1]
    encoding_body = chardet.detect(raw_body)['encoding']
    body = email.message_from_string(raw_body.decode(encoding_body))
    dest_email = data[1][1]
    sender_email = data[2][1]

    f = open('/home/nathan/PycharmProjects/test.html', 'w+')
    f.write(body.get_payload())
    f.close()

У меня не было ошибок, но вот результат тела:

https://pastebin.com/fhzqsCRM

Любая идея почему какой-то странный символ здесь? Кроме того, символ с акцентом неправильно декодирован ..

Заранее спасибо

РЕДАКТИРОВАТЬ:

Я уже пробую со следующим:

res, data = self.conn.fetch(mail_id, '(RFC822)')
msg = email.message_from_bytes(data[0][1])
for part in msg.walk():
    if part.get_content_type() == 'text/html':
        print(part)

У меня просто HTML, но та же проблема с кодировкой ..

ФИНАЛЬНОЕ РЕДАКТИРОВАНИЕ:

Благодаря @Botje кажется, что электронная почта была закодирована с помощью 'Quoted-printable ». Итак, вот решение для этого типа кодировки:

import quopri
res, data = self.conn.fetch(mail_id, '(RFC822)')
msg = email.message_from_bytes(data[0][1])
for part in msg.walk():
    if part.get_content_type() == 'text/html':
        part = quopri.decodestring(part.get_payload()).decode('UTF-8')
...