获得唯一的新邮件从IMAP服务器
-
23-08-2019 - |
题
我写信,从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文件夹,您的应用程序 可以在文件夹中阅读新邮件,然后将它们移动到标准的收件箱文件夹,它的完成之后。