imap_search() 未知搜索条件"OR"



正在尝试构建IMAP搜索查询,以通过php代码筛选出特定的邮件。。。被推向一种我必须使用";OR";搜索条件。

<?php
$search_string = 'OR (SUBJECT "FedEx" SUBJECT "USPS")';
$search_string = 'OR SUBJECT "FedEx" SUBJECT "USPS"';
$search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"';
$search_string = 'OR (SUBJECT "FedEx") OR (SUBJECT "USPS")';
$search_string = 'OR (SUBJECT "FedEx") (SUBJECT "USPS")';
//all of the search strings when used separately didn't work
$emails = imap_search($inbox, $search_string);
?>

但是当使用时,php抛出错误PHP Notice: Unknown: Unknown search criterion: OR (errflg=2) in Unknown on line 0

当引用IMAP的php文档时,它说文档可能不准确,并指向RFC 2060,所以当引用第6.4.4节的搜索命令时,它提到我们可以使用OR、NOT和一些额外的搜索条件。。。

所以在前缀位置、中缀位置使用了它,并尝试使用RFC 2060中建议的括号,但都是徒劳的

还遇到了php错误条目,但不确定这是一个错误还是需要以其他方式使用!

有人有解决方案/变通办法吗?

如果满足条件,我不愿意迭代每封邮件并签入代码。。。我希望通过IMAP搜索来完成


编辑/更新:

imap_search函数与IMAP4不完全兼容。到目前为止使用的c客户端仅支持IMAP2,并且某些搜索标准将不可用于使用;OR";

所以php代码类似于:

$inbox   = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'foo@example.com', 'pass123', OP_READONLY);
$search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"';   
$emails = imap_search($inbox, $search_string);

将抛出一个错误,说";未知搜索标准";

观察和参考:
git回购:https://github.com/php/php-src

PHP源跟踪:(参考:https://github.com/php/php-src/blob/master/ext/imap/php_imap.c)
/ext/imap/php_imap.c->行号:4126
imap_search=>行号:4148

c-客户端库源跟踪:
src/c-client/mail.c->行号:3973

/docs/internal.txt->行号:1919=>mail_criteria()
条件IMAP2格式搜索条件字符串
警告:此功能不接受IMAP4搜索条件。

IMAP2 RFC1064=>[参考:https://www.rfc-editor.org/rfc/rfc1064][页码:13]
IMAP4 RFC2060=>[参考:http://www.faqs.org/rfcs/rfc2060.html][章节:6.4.4]

注:核心模块(IMAP)中的核心搜索功能在PHP中仍然不可用。希望这能引起开发者社区的注意。。。

但我不确定哪个PHP版本使用IMAP4兼容的c客户端。。。

  1. 有没有办法强制php只更新/使用最新的c客户端图书馆
  2. 还是当前最新的(截至2016年4月11日)c客户端仅支持IMAP2
  3. 我们是否应该修改库源代码并编译安装
  4. 或者我们是否有其他由第三方开发的PHP库可以使用来完成相同的(imap协议邮件搜索、检索对于那些不支持OAuth2)的邮件提供商

我通过几个imap_search语句来模拟"OR"来解决这个问题。

$criteria = 'UNSEEN FROM "someaddr@gmail.com"|UNSEEN FROM "@onedomain.com"|UNSEEN FROM "@anotherdomain.org"'
$criterias = explode('|', $criteria);
$emails = array();
foreach ($criterias as $search) {
    $emails_ = imap_search($inbox, $search);
    if ($emails_)
        $emails = array_merge($emails, $emails_);
}
$emails = array_unique($emails);

你试过这个吗。?

$inbox   = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'foo@example.com', 'pass123', OP_READONLY);
$search_string = 'SINCE "08-Mar-2011" OR SUBJECT "FedEx" OR SUBJECT "USPS"';
$emails = imap_search($inbox, $search_string);

最新更新