Gmail IMAP有时会返回错误的抓取结果

时间:2014-10-08 17:03:41

标签: python gmail imap gmail-imap

我正在使用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信息。

为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:3)

以下内容于本周早些时候发布在IMAP协议邮件列表中:

“截至昨天[10月7日星期一],Gmail现在支持报告标记更改,我们会报告新的/已删除的消息(即协议允许的大多数地方,但肯定是在IDLE期间)。它仅对gmail启用。 com用户此刻,Google Apps用户将在一周左右的时间内关注,假设我们没有发现任何问题。“

然而,新功能显然存在问题,因为今天他们说它正在回滚:

“我们看到几个程序报告没有预期额外的FETCH响应,我们在周一推出。我们很快就回滚了,因为一个非常受欢迎的客户的旧版本存在问题(尽管我们不知道这部分事情)。“

-Rick

答案 1 :(得分:2)

Gmail正在向您发送未经请求的FLAGS更新(因为有人远程更改了邮件)。这些都不是为了响应您的请求,但IMAP允许服务器随时向您发送任何*信息。许多服务器会为IDLENOOP响应保存这些未经请求的响应,但显然Gmail不希望等待。

然而,直到最近(显然?)Gmail根本没有发送标志更新,只发送EXPUNGE。

*:有一些规则可以在避免竞争条件时发送哪些回复,但这不是其中之一。