概述:在 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/