为什么 imaplib return 在每封电子邮件后都有一个单独的括号?
Why does imaplib return a lone parenthesis after each email?
概述:在 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 但根据我对该规范的理解(老实说,这并不多)括号不应该出现在有效负载的 END 之前,这在我看来是在阅读完所有消息之后。
编辑:顺便说一句,这个括号显示了您是否正在获取多条消息...即使您遵循 imaplib's own example,您得到的数据看起来像 [(headers, payload), b')']
简单的回答是 imaplib 不是解析器,而是一个简单的 low-level 库。当您发出提取请求时,每条消息的响应如下所示:
* 27 FETCH (A A-DATA B B-DATA C C-DATA)\r\n
也就是说,对 fetch 的响应是 对 数据项的列表。括号向解析器表明这是一个(可能)可变长度的数据项列表。具体来说,当你请求一个主体时,它在概念上看起来像这样:
* 27 FETCH (RFC822 BODYDATA)\r\n
当 IMAP 服务器希望发送可能包含换行符或其他奇怪字符的数据块时,它会使用标准称为文字的转义机制。它在花括号中提供了一个字节数,一个新的行对,然后是那么多字节的原始转储。然后服务器返回它发送的命令。这看起来像这样:
* 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
通过 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 但根据我对该规范的理解(老实说,这并不多)括号不应该出现在有效负载的 END 之前,这在我看来是在阅读完所有消息之后。
编辑:顺便说一句,这个括号显示了您是否正在获取多条消息...即使您遵循 imaplib's own example,您得到的数据看起来像 [(headers, payload), b')']
简单的回答是 imaplib 不是解析器,而是一个简单的 low-level 库。当您发出提取请求时,每条消息的响应如下所示:
* 27 FETCH (A A-DATA B B-DATA C C-DATA)\r\n
也就是说,对 fetch 的响应是 对 数据项的列表。括号向解析器表明这是一个(可能)可变长度的数据项列表。具体来说,当你请求一个主体时,它在概念上看起来像这样:
* 27 FETCH (RFC822 BODYDATA)\r\n
当 IMAP 服务器希望发送可能包含换行符或其他奇怪字符的数据块时,它会使用标准称为文字的转义机制。它在花括号中提供了一个字节数,一个新的行对,然后是那么多字节的原始转储。然后服务器返回它发送的命令。这看起来像这样:
* 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 更像是一个解析器,我会很高兴,但它实际上只是一种低级访问机制。对于更复杂的工作,需要在其之上构建解析器。