Как получить русскоязычный текст письма, используя билиотеки 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()