Как получить русскоязычный текст письма, используя билиотеки Python - imaplib и email?

Пытаюсь решить задачку чтения письма из почты питоном, с использованием библиотек email и imaplib. Написал такой код:

# создаю соединение
imap = imaplib.IMAP4_SSL(imap_host)

# логинюсь
imap.login(imap_user, imap_pass)

# выбираем папку входящие
imap.select('INBOX')

# ищем все письма с кодировкой ...
typ, data = imap.search(None, 'ALL')

# перевод в список
data = data[0].split()

for i in data:

    status, data = imap.fetch(i, '(RFC822)')
    data = data[0][1]
    enc = chardet.detect(data)
    print("\n\n\nКодировка: ", enc)

    msg = email.message_from_bytes(data)
    print("From: ", msg['From'])
    print("Date: ", msg['Date'])
    print("Subject: ", msg['Subject'])

    if msg.is_multipart():
        print("Multipart: Yes")
        for part in msg.walk():
            payload = part.get_payload(None)
            
    else:
        print("Multipart: No")
        payload = msg.get_payload(None)
        
        
    print("Тип Payload: ", type(payload))
    print("Payload: ", payload)

imap.close()

Проблема в том, что письма на русском выходят в закодированном виде. Подскажите, как и на каком этапе их перекодировать?


Ответы (2 шт):

Автор решения: Ян Морозов

Попробуйте поменять message_from_bytes на message_from_string или message_from_file

→ Ссылка
Автор решения: Igor Stras

создаю соединение

imap = imaplib.IMAP4_SSL(imap_host)

логинюсь

imap.login(imap_user, imap_pass)

выбираем папку входящие

imap.select('INBOX')

ищем все письма с кодировкой ...

typ, data = imap.search(None, 'ALL')

перевод в список

data = data[0].split()

for i in data:

status, data = imap.fetch(i, '(RFC822)')
data = data[0][1]
enc = chardet.detect(data)
print("\n\n\nКодировка: ", enc)

msg = email.message_from_bytes(data)
print("From: ", msg['From'])
print("Date: ", msg['Date'])
print("Subject: ", msg['Subject'])

if msg.is_multipart():
    print("Multipart: Yes")
    for part in msg.walk():
        payload = part.get_payload(decode=True).decode('utf-8')
        
else:
    print("Multipart: No")
    payload = msg.get_payload(None).decode('utf-8')
    
    
print("Тип Payload: ", type(payload))
print("Payload: ", payload)

imap.close()

→ Ссылка