Как я получу письмо в формате HTML в виде обычного текста? - PullRequest
2 голосов
/ 10 августа 2010

Вот код, который у меня есть:

import email, imaplib

user = 'some username'
pwd = 'some password'

m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user, pwd)

m.select("[Gmail]/All Mail")

resp, data = m.fetch(1, "(RFC822)")

email_body = data[0][1]

mail = email.message_from_string(email_body)

print mail

В настоящее время я получаю письмо со странным форматированием.Я хотел бы получить тело письма в виде простой текстовой строки.

Ответы [ 5 ]

5 голосов
/ 10 августа 2010

(Я только что попробовал это с моей учетной записью Gmail.) Проблема не в почте HTML, а в том, что ваши сообщения состоят из нескольких частей MIME, и вы печатаете полную строку этого сообщения.Это потому, что электронная почта в основном представляет собой простой текстовый формат (как было упомянуто выше);когда люди хотели отправить богатый контент по электронной почте, они придумали MIME, который является способом сделать это без изменения стандарта электронной почты.Когда вы print mail, вы печатаете полное сообщение MIME, закодированное так, чтобы его можно было отправить как электронное письмо.Вы хотите извлечь полезную нагрузку.

Но - вы уже проделали всю тяжелую работу!Просто получите полезную нагрузку проанализированного email.message.Message экземпляра:

mail.get_payload()[ 0 ].get_payload()

(Примечание: мне пришлось сделать это дважды для первого сообщения в папке входящих сообщений Gmail, потому что оно было закодировано как MIMEMultipart, но только с однимлист. YMMV.)

4 голосов
/ 02 февраля 2014

В Python 3.x вы можете сделать это очень простым способом, импортировав пакеты 'imaplib' и 'email'.Хотя это более старая запись, но, возможно, мой ответ может помочь новичкам в этой записи.

status, data = self.imap.fetch(num, '(RFC822)')
        email_msg = email.message_from_bytes(data[0][1]) #email.message_from_string(data[0][1])

        #If message is multi part we only want the text version of the body, this walks the message and gets the body.

        if email_msg.is_multipart():
            for part in email_msg.walk():       
                if part.get_content_type() == "text/plain":
                    body = part.get_payload(decode=True) #to control automatic email-style MIME decoding (e.g., Base64, uuencode, quoted-printable)
                    body = body.decode()

                elif part.get_content_type() == "text/html":
                    continue

Теперь вы можете напечатать переменную тела, и она будет в формате открытого текста :)было бы неплохо выбрать его в качестве принятого ответа.

2 голосов
/ 10 августа 2010

EMail - текстовый формат, он не знает о форматировании. Таким образом, если вы получаете письмо в формате HTML, то это форматирование было «ввезено контрабандой» в текстовое тело или , у вас есть письмо, состоящее из нескольких частей, где первая часть представляет собой чистый текст, а вторая часть - HTML отформатированная версия.

Поэтому проверьте, есть ли у вас многочастное письмо ( см. Документы ) и отфильтруйте соответственно. Если это не многочастное письмо, используйте библиотеку HTML, например Beautiful Soup , чтобы получить текст.

1 голос
/ 28 июля 2017

Получение правильного html / текста не так просто и просто.Как электронная почта может иметь HTML в качестве вложения или даже несколько HTML.Python 3 дает вам простой метод , чтобы сделать это

mail = email.message_from_string(email_body, policy=policy.default)
mail.get_body().get_payload(decode=True)
0 голосов
/ 10 августа 2010

Я хотел бы получить тело письма в виде строки ascii.

Маловероятно, что вы не сможете сделать это: что если это не ascii? Даже если все написано на английском языке, оно может содержать символы вне диапазона ascii. Документация imaplib не затрагивает вопросы кодирования, поэтому я предполагаю, что данные поступают в виде байтовых строк, и я ожидаю, что они будут в кодировке utf-8. Другие библиотеки могут предоставлять вам строки Unicode, которые вы можете кодировать в любой интересующей вас кодировке (но utf-8 - хороший выбор).

Тем не менее, я полагаю, вы на самом деле имеете в виду не «ascii», а то, что вы называете «простым текстом» - текст, а не html, версия электронного письма. Это может быть многочастное письмо, в этом случае вы можете извлечь текстовую / обычную часть из полученной вами строки. Если это не так, а тело письма было только html, вы можете использовать стороннюю библиотеку. Есть ряд опций, обсуждаемых в этой теме SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...