Python imaplib 库 mail.fetch,为什么我们要硬编码 response[0][1]?

Python imaplib library mail.fetch, why do we hardcode response[0][1]?

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

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)

来自 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