如何将html电子邮件作为常规文本接收?

2024-05-16 03:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我目前掌握的代码:

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

我现在收到的邮件格式很奇怪。我想收到一个纯文本字符串的电子邮件正文。


Tags: 代码importssldataemailpwdusernamebody
3条回答

在Python3.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变量,它将是纯文本格式:)如果它对您足够好,那么选择它作为接受的答案将是很好的。

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

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

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

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

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

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

相关问题 更多 >