Почему я получаю строку байтов даже после декодирования при разборе почтового сообщения Python-3? - PullRequest
1 голос
/ 16 мая 2019

Я использую 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 здесь!

1 Ответ

1 голос
/ 16 мая 2019

Согласно документам , флаг decode относится не к кодировке текста, а к кодировке с печатью в кавычках и кодировке base64. Так что нельзя менять тип возвращаемого значения, только его содержимое.

Также в документации говорится о get_payload() методе:

Это устаревший метод. В классе EmailMessage его функциональность заменена на get_content () и iter_parts () .

Так что вам следует рассмотреть возможность использования этих методов.

...