【问题标题】:PHP imap_search UNSEEN SINCE date with timePHP imap_search UNSEEN SINCE 日期与时间
【发布时间】:2015-12-18 08:12:04
【问题描述】:

我正在使用 PHP imap_search 获取自给定日期以来未见消息的列表,如下所示:

imap_search($stream, 'UNSEEN SINCE 20-Sep-2015');

这工作正常。但是,我每隔几分钟定期检查一次新电子邮件,然后将最后一次检查时间存储在会话中。我希望能够使用 UNSEEN SINCE 日期(包括时间)运行 imap_search。但它似乎不起作用。我试过了:

imap_search($stream, 'UNSEEN SINCE 20-Sep-2015 12:35:03 +0000 (UTC)');
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015 12:35:03 +0000');
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015 12:35:03');

似乎没有任何效果。如果可以做到这一点,有什么想法吗?

【问题讨论】:

    标签: php datetime imap


    【解决方案1】:

    SINCERFC 3501中的定义:

      SINCE <date>
         Messages whose internal date (disregarding time and timezone)
         is within or later than the specified date.
    

    date 被定义为只是一个日期,没有时间:

    date            = date-text / DQUOTE date-text DQUOTE
    
    date-day        = 1*2DIGIT
                        ; Day of month
    
    date-month      = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
                      "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
    
    date-text       = date-day "-" date-month "-" date-year
    
    date-year       = 4DIGIT
    

    因此,您不能使用SINCE 根据比一天更具体的时间来搜索消息。


    另一种方法是记住您看到的最新消息的 UID,然后搜索上面的消息:

    imap_search($stream, 'UID ' . $latest_uid . ':*', SE_UID);
    

    SE_UID 选项是使imap_search 返回 UID 而不是消息序列号所必需的。

    首先要获取最新消息的UID,搜索*,表示邮箱中编号最高的消息:

    imap_search($stream, 'UID *', SE_UID);
    

    【讨论】:

    • 只是一个简单的问题@legoscia。如果 $latest_uid 消息被删除会怎样?这种方法还能用吗?
    • 它仍然可以工作。 IMAP 服务器将跳过丢失的 UID 并返回现有的 UID,直到并包括邮箱中的最新消息。请注意,* 始终代表编号最高的消息,因此如果删除 $latest_uid 并且没有添加任何消息,这将返回最新的仍然存在的消息。
    • 另一个小问题:如何从收到的最后一封电子邮件中检索此 $latest_uid?
    • @GabrielAugusto 我更新了答案以包含它。
    • 谢谢。但是使用 UID 的 imap_search 总是返回 false 。有什么建议吗?即使我将 $lastest_uid 替换为 1 之类的 ID,它也不起作用。只是返回 false。
    【解决方案2】:

    我认为使用 php 和 IMAP 协议是不可能的。似乎 IMAP 在 rfc 5032 中定义了一个 WITHIN 搜索扩展,但看起来 php 还没有这个条件。此外,当您进行搜索操作时,SINCE 标准(基本上是 IMAP 协议中的所有日期时间标准)只会忽略时间和时区。 一种解决方法可能是使用当前查询获取电子邮件,然后获取内部日期并使用 php datetime 函数实现过滤器功能。 希望这可以帮助。 更多关于 IMAP 的信息:rfc 3501

    【讨论】:

      【解决方案3】:

      你无法用“SINCE”实现这一目标

      另一种方法是记住您看到的最新消息的 UID,然后搜索上面的消息:(感谢@legoscia)

      根据http://php.net/manual/en/function.imap-search.php

      $emails = imap_search($inbox, "UID 1:*", SE_UID); 
      

      无效,它不工作。 使用

      $emails = imap_fetch_overview($inbox, "$latest_uid:*", FT_UID); 
      

      这里的 * 指的是最新的邮件 UID。 这将返回一个对象数组,您可以从中提取电子邮件的 UID。您可以使用循环分别制作 UID 数组。 正如PHP imap_search UID SEARCH returns false的回答@

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 2014-05-01
        • 1970-01-01
        • 2010-12-21
        • 2010-10-22
        • 2011-05-18
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        相关资源
        最近更新 更多