PHP imap_search UNSEEN SINCE 日期和时间
PHP imap_search UNSEEN SINCE date with time
我正在使用 PHP imap_search 来获取自给定日期以来未看到的消息列表,如下所示:
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015');
这工作正常。但是,我会每隔几分钟定期检查新电子邮件,然后将上次检查时间存储在会话中。我希望能够 运行 imap_search 与 UNSEEN SINCE 日期包括时间。但这似乎行不通。我试过:
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');
似乎没有任何效果。有什么想法可以做到吗?
查看RFC 3501中SINCE
的定义:
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
return UID 而不是消息序列号。
要首先获取最新消息的UID,请搜索*
,它代表邮箱中编号最大的消息:
imap_search($stream, 'UID *', SE_UID);
我认为使用 php 和 IMAP 协议是不可能的。 IMAP 似乎在 rfc 5032 中定义了一个 WITHIN 搜索扩展,但看起来 php 还没有这个条件。此外,SINCE 标准(基本上是 IMAP 协议中的所有日期时间标准)在您执行搜索操作时只会忽略时间和时区。
一种解决方法是获取包含当前查询的电子邮件,然后获取内部日期并使用 php 日期时间函数实现过滤函数。
希望这可以帮助。
有关 IMAP 的更多信息:rfc 3501
你无法通过 "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。
这将 return 一个对象数组,您可以从中提取电子邮件的 UID。您可以使用循环分别制作 UID 数组。
正如在
的回答
我正在使用 PHP imap_search 来获取自给定日期以来未看到的消息列表,如下所示:
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015');
这工作正常。但是,我会每隔几分钟定期检查新电子邮件,然后将上次检查时间存储在会话中。我希望能够 运行 imap_search 与 UNSEEN SINCE 日期包括时间。但这似乎行不通。我试过:
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');
似乎没有任何效果。有什么想法可以做到吗?
查看RFC 3501中SINCE
的定义:
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
return UID 而不是消息序列号。
要首先获取最新消息的UID,请搜索*
,它代表邮箱中编号最大的消息:
imap_search($stream, 'UID *', SE_UID);
我认为使用 php 和 IMAP 协议是不可能的。 IMAP 似乎在 rfc 5032 中定义了一个 WITHIN 搜索扩展,但看起来 php 还没有这个条件。此外,SINCE 标准(基本上是 IMAP 协议中的所有日期时间标准)在您执行搜索操作时只会忽略时间和时区。 一种解决方法是获取包含当前查询的电子邮件,然后获取内部日期并使用 php 日期时间函数实现过滤函数。 希望这可以帮助。 有关 IMAP 的更多信息:rfc 3501
你无法通过 "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。
这将 return 一个对象数组,您可以从中提取电子邮件的 UID。您可以使用循环分别制作 UID 数组。
正如在