如何以常规文本形式接收HTML电子邮件?

时间:2010-08-10 13:06:52

标签: python email imap

这是我到目前为止的代码:

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 个答案:

答案 0 :(得分:5)

(我刚刚尝试使用我的Gmail帐户。)问题不在于HTML邮件,而是您的邮件是MIME多部分,并且您正在打印完整的字符串。这是因为电子邮件基本上是一种纯文本格式(如上所述);当人们想要在电子邮件中发送丰富内容时,他们提出了MIME,这是一种在不修改电子邮件标准的情况下执行此操作的方法。当您print mail时,您正在打印完整的MIME邮件,并对其进行编码,以便将其作为电子邮件发送。您想要提取有效负载。

但是 - 你已经完成了所有艰苦的工作!只需获取已解析的email.message.Message实例的有效负载:

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

(注意:我必须为我的Gmail收件箱中的第一条消息执行此操作两次,因为它被编码为MIMMultipart,但只有一个叶子.YMMV。)

答案 1 :(得分:4)

在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 :(得分:2)

电子邮件是一种纯文本格式,它不知道格式化。因此,如果您收到HTML邮件,那么该格式已被“走私”到纯文本主体您有一个多部分邮件,其中第一部分是纯文本,第二部分是HTML格式版本。

因此,请检查您是否有多部分邮件(see the docs)并相应地进行过滤。如果它不是多部分邮件,请使用Beautiful Soup之类的HTML库来获取文本。

答案 3 :(得分:1)

获得正确的HTML /文本并非那么容易和直接。由于电子邮件可以将html作为附件或甚至多个HTML。 Python 3为您提供了一个简单的method来完成

mail = email.message_from_string(email_body, policy=policy.default)
mail.get_body().get_payload(decode=True)

答案 4 :(得分:0)

  

我想收到电子邮件正文   作为ascii字符串。

您极不可能无法做到这一点:如果不是 ascii怎么办?即使一切都是英文,它也可能包含ascii范围之外的字符。 imaplib的文档不会涉及任何编码问题,因此我认为数据以字节字符串形式到达,我希望它们是utf-8编码的。其他库可能会为您提供Unicode字符串,您可以使用您想要的任何编码进行编码(但utf-8是一个不错的选择)。

但是,我想你并不是指“ascii”,而是你所说的“纯文本” - 电子邮件的文本,而不是html版本。它可能是多部分邮件,在这种情况下,您可以从收到的字符串中提取“text / plain”部分。如果不是,并且邮件正文仅为html,则可以使用第三方库。 this SO thread中讨论了许多选项。