python - как раскодировать любую кодировку в utf-8?
письма приходят на почту в разных кодировках, мне нужно достать текст из письма, но он бывает в разных кодировках (эта кодировка также задается в параметрах письма). Но у меня не получается раскодировать все текста сообщений, чтобы получить текст. Код получения писем скопировал с сайта http://espressocode.top/python-fetch-your-gmail-emails-from-a-particular-user/:
import email, imaplib
user = '[email protected]'
password = 'parol'
imap_url = 'imap.gmail.com'
# Функция для получения части содержимого электронной почты, т.е. его части тела
def get_body(msg):
if msg.is_multipart():
return get_body(msg.get_payload(0))
else:
return msg.get_payload(None, True)
# Функция для поиска пары ключ-значение
def search(key, value, con):
result, data = con.search(None, key, '"{}"'.format(value))
return data
# Функция для получения списка электронных писем под этим ярлыком
def get_emails(result_bytes):
msgs = [] # все данные электронной почты помещаются в массив
for num in result_bytes[0].split():
typ, data = con.fetch(num, '(RFC822)')
msgs.append(data)
return msgs
# это сделано для соединения SSL с GMAIL
con = imaplib.IMAP4_SSL(imap_url)
# вход пользователя в
con.login(user, password)
# вызов функции для проверки электронной почты под этим ярлыком
con.select('Inbox')
# получение писем от этого пользователя "tu**h*****[email protected]"
msgs = get_emails(search('FROM', '[email protected]', con))
# Поиск необходимого контента в наших сообщениях
# Пользователь может вносить пользовательские изменения в этой части
# получить необходимый контент, который ему нужен
# распечатывать их в порядке их отображения в вашем Gmail
for msg in msgs[::-1]:
for sent in msg:
if type(sent) is tuple:
# кодировка установлена как utf-8
content = str(sent[1], 'utf-8')
data = str(content)
# Обработка ошибок, связанных с unicodenecode
try:
print(data)
except UnicodeEncodeError as e:
pass
break
При кодировке 8bit письма перекодируются в нормальную (читабельную) кодировку, но когда приходят другие кодировки, например base64, то перекодирование не срабатывает.