c - 除了邮件搜索技术之外,如何获取邮箱中未见过/未读的电子邮件

标签 c imap

我正在开发一个邮件客户端应用程序,该应用程序使用 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 搜索可能是您能做的最好的选择。

关于c - 除了邮件搜索技术之外,如何获取邮箱中未见过/未读的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9894781/

相关文章:

Python:IMAP 连接到 gmail 返回错误

c# - 我无法为 ImapClient (c#) 选择邮箱

mysql - dovecot passdb 中的密码无效 : Not a valid MD5-CRYPT or PLAIN-MD5 password

PHPUnit 电子邮件测试

ios - 如何使用 Mail Core2 IOS Swift 获取电子邮件正文

c - fflush 和 while 循环

c - 替换C中字符串中的字符

c - 由于超时而终止

c - 运行程序时出错 - C

c - C 中的静态结构初始化