如何将HTML邮件以普通文本接收?

6 投票
5 回答
15440 浏览
提问于 2025-04-16 02:34

这是我目前写的代码:

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 个回答

6

获取正确的HTML或文本内容并不是那么简单。因为电子邮件可能会有HTML作为附件,或者甚至有多个HTML文件。Python 3提供了一个简单的方法,可以帮助你处理这些内容,具体可以参考这个链接

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

在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

现在你可以打印出body变量,它会以纯文本格式显示 :) 如果这个方法对你来说足够好,那就把它选为认可的答案吧。

11

(我刚刚用我的Gmail账户试过这个。)问题不在于HTML邮件,而在于你的邮件是MIME多部分格式,你打印的是整个字符串。这是因为电子邮件本质上是一个纯文本格式(如上所述);当人们想要在邮件中发送丰富内容时,他们想出了MIME,这是一种在不修改邮件标准的情况下实现这一点的方法。当你print mail时,你打印的是完整的MIME消息,这种格式经过编码可以作为电子邮件发送。你需要提取有效内容。

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

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

(注意:我在Gmail收件箱的第一封邮件上需要做这个两次,因为它被编码为MIMEMultipart,但只有一个部分。具体情况可能会有所不同。)

撰写回答