Я использую imaplib для извлечения сообщений электронной почты, и мне нужно извлечь текст из них.
Мои сообщения состоят из нескольких частей, поэтому
typ , data = account.fetch(msg_uid , '(RFC822)')
raw_email = data[0][1]
msg = email.message_from_bytes(raw_email)
payload_msg = get_message(msg)
def get_message(message):
'''
This function returns an decoded body text of a message, depending on multipart\* or text\*
:param message: message content of an email
:return: body of email message
'''
body = None
if message.is_multipart():
print(str(message.get_content_type()) + ' is the message content type')
for part in message.walk():
cdispo = str(part.get('Content-Disposition'))
if part.is_multipart():
for subpart in part.walk():
cdispo = str(subpart.get('Content-Disposition'))
if subpart.get_content_type() == 'text/plain' and 'attachment' not in cdispo:
body = subpart.get_payload(decode=True)
elif subpart.get_content_type() == 'text/html':
body = subpart.get_payload(decode=True)
elif part.get_content_type() == 'text/plain' and 'attachment' not in cdispo:
body = part.get_payload(decode=True)
elif part.get_content_type() == 'text/html' and 'attachment' not in cdispo:
body = part.get_payload(decode=True)
elif message.get_content_type() == 'text/plain':
body = message.get_payload(decode=True)
elif message.get_content_type() == 'text/html':
body = message.get_payload(decode=True)
return body
Теперь, если вы видите приведенный выше код, msg - это содержимое, которое мы извлекаем и передаем в метод get_payload с decode = True. Но когда я получаю тело и проверяю тип, оно все еще находится в байтах! почему?
Разве это не должно быть преобразовано в строку? И странная вещь, когда я даю раскодировать = False, это в формате строки! Что я здесь не так делаю? Я ожидаю обратной ситуации здесь!
P.S: raw_email здесь это байты, а msg это какой-то тип email.message здесь!