我正在使用python通过IMAP连接到gmail。
当我对一堆uid进行取指时,结果有时会包含一些奇怪的结果。
此错误出现间歇性,并在上周左右开始出现。
例如我做了一个像:
的抓取>>>import imaplib
>>>conn = imaplib.IMAP4_SSL('imap.gmail.com')
>>># authenticate etc
>>>conn.uid('fetch', '12,13', '(X-GM-THRID)')
我有时会得到如下结果:
>>>['1 (X-GM-THRID 123123123123 UID 12)',
'2 (X-GM-THRID 123123123123 UID 13)',
'365022 (UID 601722 FLAGS (\\Seen))']
(为了便于阅读,添加了换行符,ids更改了原始版本,通常我提取的内容远远超过两个。)
这很奇怪。我没有要求任何关于额外消息的内容。有时它在那里,有时不在。无论我获取哪些字段,额外的结果(我只见过一两个)都不会包含它们,只包含FLAGS信息。
为什么会发生这种情况的任何想法?
答案 0 :(得分:3)
以下内容于本周早些时候发布在IMAP协议邮件列表中:
“截至昨天[10月7日星期一],Gmail现在支持报告标记更改,我们会报告新的/已删除的消息(即协议允许的大多数地方,但肯定是在IDLE期间)。它仅对gmail启用。 com用户此刻,Google Apps用户将在一周左右的时间内关注,假设我们没有发现任何问题。“
然而,新功能显然存在问题,因为今天他们说它正在回滚:
“我们看到几个程序报告没有预期额外的FETCH响应,我们在周一推出。我们很快就回滚了,因为一个非常受欢迎的客户的旧版本存在问题(尽管我们不知道这部分事情)。“
-Rick
答案 1 :(得分:2)
Gmail正在向您发送未经请求的FLAGS
更新(因为有人远程更改了邮件)。这些都不是为了响应您的请求,但IMAP允许服务器随时向您发送任何*信息。许多服务器会为IDLE
或NOOP
响应保存这些未经请求的响应,但显然Gmail不希望等待。
然而,直到最近(显然?)Gmail根本没有发送标志更新,只发送EXPUNGE。
*:有一些规则可以在避免竞争条件时发送哪些回复,但这不是其中之一。