PHP imap_search UNSEEN SINCE日期与时间

时间:2015-09-21 14:56:19

标签: php datetime imap

我使用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');

似乎没什么用。如果可以的话,有什么想法吗?

3 个答案:

答案 0 :(得分:14)

查看RFC 3501SINCE的定义:

  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返回UID而不是邮件序列号,需要imap_search选项。

要首先获取最新消息的UID,请搜索*,它代表邮箱中编号最大的消息:

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

答案 1 :(得分:1)

您无法通过“ 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

所回答

答案 2 :(得分:0)

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

的更多信息