有效地检查整个帐户的未读计数

时间:2011-03-23 01:49:01

标签: ruby imap

根据我的理解,无论邮箱如何,都无法在整个IMAP帐户中查询总未读计数或所有最近邮件的UID。要获得帐户的未读计数,您需要遍历所有mbox并检查其状态。我已经做到了,但它很慢(我的一个帐户有很多邮箱45秒)。

Mail.app可以在几秒钟内找到新邮件,即使是在深层嵌套的邮箱中也是如此。

这里的速度只是使用Net :: IMAP的限制吗?或者我错过了一些功能,这些功能将返回一组更有限的邮箱,例如只有那些拥有最新邮件的邮箱?

我能想到的另一个选择是使用响应处理程序,还保留一个mbox拥有计数器的缓存> 1,然后只检查每个循环的两个组合。但是,由于我希望在脚本中执行此操作,因此如果不需要,则无需携带缓存是理想的。

1 个答案:

答案 0 :(得分:3)

在IMAP中检测新邮件的规范方法是UIDNEXT。发出

A001 STATUS "foldername" (UIDVALIDITY UIDNEXT)
在您关心的每个文件夹上的

将为您提供该文件夹的预期下一个UID。 Here's what the RFC has to say

  

唯一标识符      在邮箱中以严格提升的方式分配;每个人      邮件被添加到邮箱,它被分配了比UQ更高的UID      先前添加的消息。与消息序列不同      数字,唯一标识符不一定是连续的。

     

下一个唯一标识符值是预测值      分配给邮箱中的新邮件。除非独特      标识符有效性也会发生变化(见下文),下一个唯一的      标识符值必须具有以下两个特征。第一,      除非有新消息,否则下一个唯一标识符值不得更改      被添加到邮箱;第二,下一个唯一标识符      每当新邮件添加到邮箱时,值必须更改,      即使这些新消息随后被删除。

因此,只需跟踪每个文件夹的预期下一个UID和UID有效值。如果STATUS命令导致UIDNEXTUIDVALIDITY更改了缓存值,则表示您需要检查新邮件(如果是前者)或重新同步(如果是后者)。

Something like this

imap.status("foldername", ["UIDNEXT", "UIDVALIDITY"])