根据我的理解,无论邮箱如何,都无法在整个IMAP帐户中查询总未读计数或所有最近邮件的UID。要获得帐户的未读计数,您需要遍历所有mbox并检查其状态。我已经做到了,但它很慢(我的一个帐户有很多邮箱45秒)。
Mail.app可以在几秒钟内找到新邮件,即使是在深层嵌套的邮箱中也是如此。
这里的速度只是使用Net :: IMAP的限制吗?或者我错过了一些功能,这些功能将返回一组更有限的邮箱,例如只有那些拥有最新邮件的邮箱?
我能想到的另一个选择是使用响应处理程序,还保留一个mbox拥有计数器的缓存> 1,然后只检查每个循环的两个组合。但是,由于我希望在脚本中执行此操作,因此如果不需要,则无需携带缓存是理想的。
答案 0 :(得分:3)
在IMAP中检测新邮件的规范方法是UIDNEXT
。发出
A001 STATUS "foldername" (UIDVALIDITY UIDNEXT)
在您关心的每个文件夹上的将为您提供该文件夹的预期下一个UID。 Here's what the RFC has to say:
唯一标识符 在邮箱中以严格提升的方式分配;每个人 邮件被添加到邮箱,它被分配了比UQ更高的UID 先前添加的消息。与消息序列不同 数字,唯一标识符不一定是连续的。
下一个唯一标识符值是预测值 分配给邮箱中的新邮件。除非独特 标识符有效性也会发生变化(见下文),下一个唯一的 标识符值必须具有以下两个特征。第一, 除非有新消息,否则下一个唯一标识符值不得更改 被添加到邮箱;第二,下一个唯一标识符 每当新邮件添加到邮箱时,值必须更改, 即使这些新消息随后被删除。
因此,只需跟踪每个文件夹的预期下一个UID和UID有效值。如果STATUS
命令导致UIDNEXT
或UIDVALIDITY
更改了缓存值,则表示您需要检查新邮件(如果是前者)或重新同步(如果是后者)。
imap.status("foldername", ["UIDNEXT", "UIDVALIDITY"])