2009-07-05 175 views
18

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

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

我也尝试了最近的标志,但这似乎并不适用于Gmail(在红宝石中它每次都显示为零)。

回答

40

您希望使用UniqueId(UID)作为消息。这就是为什么它被创建的原因。

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

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

123456:*

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

UIDs被认为在会话中保持稳定,永远不会改变,并且总是会增加价值。验证这一点的方法是在选择文件夹时检查UID有效性。如果UIDValidity编号没有改变,那么这些UID在各个会话中应该仍然有效。

以下是RFC的相关部分:

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

分配给每个消息,该消息与 唯一标识符的有效性值中使用时(见下文)的32位值形成一个64位的值 必须不参考任何其它消息在邮箱或任何永久存在的同名邮箱中。邮箱中的唯一标识符 以严格递增的方式分配;当每个 消息被添加到邮箱时,它被分配比先前添加的 消息更高的UID。与消息序列号码 不同,唯一标识符不一定是连续的。

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

注:下一个唯一的标识符值试图 提供客户端确定是否有任何 消息已经自 以前的一次检查这个值被传递到该邮箱的手段。

下面是详细信息的链接:

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

我会做什么,也跟踪下载的邮件的INTERNALDATE的。这样,如果您失去了UID同步,您至少可以遍历这些消息,并根据消息的内部日期查找您下载的最后一个消息。

4

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

这里有一个代码片段,它应该给你正确的想法。当然手术位

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

谢谢,但我的应用程序不是唯一有权访问该电子邮件帐户的人。例如,某个特定的消息可能已经在Outlook中读取,因此标记为“已见”。使用“看到”会让我的应用程序错过它。 – 2009-07-05 21:19:02

+0

在这种情况下,您可能只想遍历服务器上的邮件中的Message-Id标题,并与数据库中的信息进行比较。 http://www.freesoft.org/CIE/RFC/850/10.htm – JosefAssad 2009-07-05 21:46:25

0

如果你是你能收到的邮件过滤到服务器端的特定IMAP文件夹,您的应用程序 可以在该文件夹中的阅读新邮件,然后将它们移动到标准收件箱文件夹完成后。

相关问题