仅从IMAP服务器获取新邮件

我正在编写一个客户端应用程序,它从IMAP服务器获取电子邮件,然后将它们存储在数据库中。 问题是,一旦我检查了邮件,下次我只想下载自那以后到达的邮件。 因此,如果我在两小时前检查过服务器邮件,我只想收到过去两小时内收到的邮件。

我可以在SINCE DATE使用SEARCH,但是没有时间支持+日期可能很容易被欺骗。

我也尝试了RECENT标志,但这似乎不适用于gmail(在ruby中它每次都显示为nil)。

您希望将UniqueId(UID)用于消息。 这就是创建它的具体原因。

您需要跟踪请求的最后一个UID,然后,请求使用消息集“[UID]:*”的所有新消息,其中[UID]是实际的UID值。

例如,假设最后一条消息具有唯一ID“123456”。 你会去取

123456:*

然后,丢弃第一个返回的消息。

UID被认为在各个会话中保持稳定,并且永远不会改变,并且总是会增加价值。 validation这一点的方法是在选择文件夹时检查UIDValidity。 如果UIDValidity编号未更改,则UID在会话期间仍应有效。

以下是RFC的相关部分:

2.3.1.1。 唯一标识符(UID)消息属性

分配给每条消息的32位值,当与唯一标识符有效性值(见下文)一起使用时,形成一个64位值,该值绝不能引用邮箱中的任何其他消息或永远具有相同名称的任何后续邮箱。 唯一标识符在邮箱中以严格升序的方式分配; 当每条消息被添加到邮箱时,它被分配了比先前添加的消息更高的UID。 与消息序列号不同,唯一标识符不一定是连续的。

消息的唯一标识符在会话期间不得更改,并且不应在会话之间更改。 必须使用下面讨论的UIDVALIDITY机制检测会话之间唯一标识符的任何更改。 客户端需要持久唯一标识符来重新同步其与服务器的先前会话的状态(例如,断开连接或脱机访问客户端); 这将在[IMAP-DISC]中进一步讨论。

注意:下一个唯一标识符值旨在为客户端提供一种方法,以确定自上次检查此值以来是否已将任何邮件传递到邮箱。

这是更多信息的链接:

http://www.faqs.org/rfcs/rfc3501.html

我会做的,也是跟踪下载的消息的InternalDate。 这样,如果您丢失了UID同步,您至少可以根据消息的InternalDate迭代消息,并找到您下载的最后一个消息。

有一个名为“看到”的imap标志。 大多数客户端会在查看消息时标记出一条消息,因此您希望迭代服务器上没有设置该标志的消息。

这是一个代码片段,可以给你正确的想法。 当然有效的是

imap.search(["NOT", "SEEN"]).each do bla.bla.bla 

如果您能够将传入邮件过滤到服务器端的特定IMAP文件夹,则您的应用程序可以读取该文件夹中的新邮件,然后在完成后将其移动到标准的INBOX文件夹中。