【问题标题】:Python imaplib library mail.fetch, why do we hardcode response[0][1]?Python imaplib 库 mail.fetch,为什么我们要硬编码 response[0][1]?
【发布时间】:2020-12-23 10:07:56
【问题描述】:

我正在使用下面的代码来阅读一封未读的电子邮件。

mail.fetch 方法中,获取类型、数据作为返回参数,我们正在使用raw_email = data[0][1] 访问原始电子邮件。谁能解释为什么我们将索引硬编码为[0][1] 以获取消息?这是在不进行任何硬编码的情况下获取消息的正确方法吗?

Python 代码如下:

import imaplib

mail = imaplib.IMAP4_SSL('imap.gmail.com')
try:
    mail.login(email_user, email_pass)
    status, messages = mail.select("INBOX")

    (retcode, emailnums) = mail.search(None,'(UNSEEN)')
    if retcode == 'OK':

        for emailnum in emailnums[0].split():

            typ,data = mail.fetch(emailnum,'(RFC822)')
            raw_email = data[0][1]                       
            #converts byte literal to string removing b''
            raw_email_string = raw_email.decode('utf-8')
            email_message = email.message_from_string(raw_email_string)

【问题讨论】:

    标签: python imaplib


    【解决方案1】:

    来自 IMAP 服务器的响应是一个嵌套元组,其中包含状态消息、信封信息以及您请求的电子邮件的实际内容。没有简单的方法可以避免说出您需要响应元组的哪些部分,但如果您不想查看这些细节,也许您会想要寻找 Python 的低级 imaplib 周围的更高级别的包装器-协议级别上事情如何工作的详细细节(或者更确切地说,Python 库如何表示通过网络传输的内容)。

    顺便说一句,将字节解码为 UTF-8 绝对是错误的做法。如果你比较幸运,你不会造成任何直接的伤害(也就是说,消息通常都是 ASCII,并且任何 8 位数据都隐藏在内容传输编码后面),但它仍然是错误的。你应该打电话给email_message = email.message_from_bytes(raw_email)

    明确地说,如果您稍微不那么幸运,该消息包含不是 UTF-8 的 8 位文本,您将获得带有 UnicodeDecodeError 的回溯。您尚未检查该消息,因此绝对无法正确猜测它是否包含字符数据,如果包含,它使用哪种编码。或许也可以看看What is character encoding and why should I bother with it

    【讨论】:

    • 嗨@tripleee,谢谢您的回复,它工作正常!!。我已按照字符编码中的说明进行操作。我在上述问题中包含了修改后的代码。让我知道是否有。实际上我正在从电子邮件内容中下载附件。
    • 我回滚了你的编辑;你的问题应该严格来说是一个问题。如果您想发布自己的答案,请随意这样做。无论如何,该代码有一些明显的缩进错误,并且对 Content-Disposition 标头进行了一些不确定的处理。顺便说一句,在覆盖现有文件之前无需删除它,尽管您可能想检查来自open 的权限错误(如果文件存在并且不允许覆盖它,它可能会失败)。跨度>
    • 谢谢 Trippleee,我正在尝试在邮件中查找附件。因此使用了逻辑内容配置标头。有没有更好的方法来做到这一点。我已经用谷歌搜索并得到了代码。
    • 不保证Content-Disposition的存在与否;每种类型都有一个默认配置。或许也可以看看stackoverflow.com/questions/48562935/…
    • 另外,stackoverflow.com/a/64008532/874188 有针对 Content-Disposition 的注释(所以上面的代码并不正确)。
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2023-01-26
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多