python - 为什么 imaplib 在每封电子邮件后返回一个单独的括号?

标签 python imap imaplib

概述:在 Python 中使用 imaplib 通过 imap 获取电子邮件时,返回的有效负载是电子邮件元组列表...具有单个字节 b')' 在每个元组之间。

我使用您的标准 imaplib fetch 调用给定一个逗号分隔的 UID 字节字符串:

resp, data = mailbox.fetch(b'1,2,3'), 'RFC822')

但是,data 看起来像:

[ 
  (b'1 (BODY[HEADER.FIELDS (DATE TO CC FROM SUBJECT)] {181}',
    b'Date: Thu, 18 Jul 2013 16:08:07 -0700 From: Blah Blah\r\n\r\n'
  ),
  b')',
  (b'1 (BODY[HEADER.FIELDS (DATE TO CC FROM SUBJECT)] {181}',
    b'Date: Thu, 18 Jul 2013 16:08:07 -0700 From: Blah Blah\r\n\r\n'
  ),
  b')',
  ...
]

所以现在,当我遍历该列表时,我必须跳过所有其他元素以避免 b')'。显然,这并不难......但感觉我做错了什么,或者 imaplib 应该更好地解析这个右括号。

为什么会有那个括号,有没有办法更正确地使用 IMAP 来消除它?


想法:

看起来右括号是 built-in part of RFC822但根据我对该规范的理解(老实说,这并不多)括号不应该出现在有效负载的末尾,在我看来应该是在读取所有消息之后。

编辑:顺便说一句,这个括号会显示您是否正在获取多条消息...即使您关注 imaplib's own example。 ,你得到的数据看起来像 [(headers, payload), b')']

最佳答案

简单的回答是,imaplib 不是解析器,而是一个简单的低级库。当您发出提取请求时,每条消息的响应如下所示:

* 27 FETCH (A A-DATA B B-DATA C C-DATA)\r\n

也就是说,对 fetch 的响应是一个数据项的列表。括号向解析器表明这是一个(可能)可变长度的数据项列表。具体来说,当你请求一个主体时,它在概念上看起来像这样:

* 27 FETCH (RFC822 BODYDATA)\r\n

当 IMAP 服务器希望发送可能包含换行符或其他奇怪字符的数据 block 时,它会使用标准称为文字的转义机制。它在花括号中提供了一个字节数,一个新的行对,然后是那么多字节的原始转储。然后服务器返回它发送的命令。这看起来像这样:

* 27 FETCH (RFC822 {457}\r\n___457 bytes of body data here___)\r\n

imaplib 只知道换行符和文字,但除了告诉您它是什么类型之外,它不会解析响应。它把它分成这样的部分:

* 27 FETCH (RFC822 {457}\r\n
___457 bytes of body data here___
)\r\n

这三行是​​您看到的响应的三个部分:文字之前的内容、文字本身和文字之后的内容。在本例中,它是一个单括号,用于关闭在第一部分中打开的列表。如果您请求多个需要文字来传输的提取片段,您会看到更多片段。

如果 imaplib 更像是一个解析器,我会很高兴,但它实际上只是一种低级访问机制。对于更复杂的工作,需要在其之上构建解析器。

关于python - 为什么 imaplib 在每封电子邮件后返回一个单独的括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34542742/

相关文章:

python - web2py 添加用户名验证

python - NameError:未定义全局名称 'unicode' - 在 Python 3 中

python - 如何理解Python中list结构的内存?

python - 使用 Python 转发邮件并添加新内容

python - rpy2:将 FloatVector 或 Matrix 转换回 Python 数组或列表?

javascript - Javascript 中的 POP3/IMAP 直接实现

ruby-on-rails - 如何使用 ActionMailer 在 IMAP "Sent"框中保存外发电子邮件的副本?

php - 如何使用 PHP IMAP 下载所有带有附件的邮件到服务器?

Python:不断检查新电子邮件并提醒更多新电子邮件