我写信,从IMAP服务器读取电子邮件客户端应用程序,然后将它们存储在数据库中。问题是,一旦我下一次检查的邮件,我只是想下载,因为已经到达邮件。所以,如果我已经检查了邮件服务器的两个小时前,我只想要得到的是,在持续两个小时已经到达的邮件。

我可以使用搜索以来的日期,但有时间+日期不支持可能很容易被欺骗。

我也试过最近标志,但似乎不使用Gmail(在红宝石它示出了零每次)。

有帮助吗?

解决方案

您要使用的唯一ID(UID)的邮件。这是专门创建它的原因。

您会希望跟踪的最后一个UID的要求,然后要求你使用设置邮件的所有新邮件“[UID]:*”,其中[UID]是实际UID值

举例来说,让我们说的最后一条消息feteched具有“123456”的唯一id。你会取

123456:*

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

的UID“应该”是跨会话稳定的,并且不会改变,并且总是在值增加。验证这一点美中不足,就是当你选择文件夹来检查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文件夹,您的应用程序 可以在文件夹中阅读新邮件,然后将它们移动到标准的收件箱文件夹,它的完成之后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top