【问题标题】:How do I recieve a html email as a regular text?如何以常规文本形式接收 html 电子邮件?
【发布时间】:2017-07-28 22:38:27
【问题描述】:

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

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

我目前收到的电子邮件带有一堆奇怪的格式。我想以纯文本字符串的形式接收电子邮件正文。

【问题讨论】:

  • 只需使用正则表达式解析 HTML...哦等等,不要那样做。

标签: python email imap


【解决方案1】:

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

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

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

(注意:我必须为 Gmail 收件箱中的第一封邮件执行两次,因为它被编码为 MIMEMultipart,但只有一个叶子。YMMV。)

【讨论】:

  • 正是我想要的。非常感谢
  • 我只能使用 message_from_bytes 而不是来自字符串。怎么样?
  • @JohnAndrews,听起来您的消息的响应类型是字节而不是字符串。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    获取正确的 html/文本并不是那么容易和直接。因为电子邮件可以有 html 作为附件,甚至可以有多个 HTML。 Python 3 为您提供了一个简单的method 来做到这一点

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 谢谢,您对纯文本的看法是正确的。编辑原始问题
        猜你喜欢
        • 2013-06-02
        • 1970-01-01
        • 2019-04-20
        • 1970-01-01
        • 2021-04-12
        • 2012-04-29
        • 1970-01-01
        • 2015-09-19
        • 2015-07-13
        相关资源
        最近更新 更多