我正在开发一个邮件客户端应用程序,该应用程序使用IMAP c客户端库为GMail帐户同步电子邮件。
如何在不盲目搜索所有未读电子邮件的情况下获取邮箱中最近的未读/未读电子邮件?
邮件搜索需要在每次同步时将所有未读电子邮件拉到客户端,但在每次同步中执行这是一项相当昂贵的操作。有没有更好的方法来与客户端沟通任何未读的电子邮件,这些电子邮件在之前与服务器的交互中没有同步?
例如,Thunderbird能够通过某种机制同步看不见的电子邮件(可能是通过对所有看不到的电子邮件进行盲搜索),因为IDLE命令不会通知客户对他们的看法。
是否有某种机制可以告诉客户端自上次同步以来出现的未读电子邮件?
有一个IMAP扩展用于快速标志更改重新同步(RFC-4551)。使用此扩展,可以搜索自上次同步以来更改的所有消息(基于某种时间戳)。然而,这种扩展并没有得到广泛支持,尤其是gmail的IMAP服务器:
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE
有一个信息性RFC描述了IMAP客户端应该如何进行同步(RFC-4549,第4.3节)
tag1 UID FETCH <lastseenuid+1>:* <descriptors>
tag2 UID FETCH 1:<lastseenuid> FLAGS
第一个命令用于获取所有未知邮件所需的信息(不知道有多少邮件)。第二个命令用于同步已经看到的邮件的标志。
这种方法被广泛使用。因此,许多IMAP服务器都包含一个优化,以便快速提供这些信息。通常,网络带宽是限制因素。
如果您只对UNSEEN标志感兴趣,那么UID SEARCH可能是您能做的最好的方法。