imap_search()未知搜索条件“OR”

时间:2016-04-01 12:45:16

标签: php search imap rfc

尝试构建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

当提及php docs for IMAP时,它说文档可能不准确并且定向到RFC 2060所以当引用6.4.4的搜索命令时,它提到我们可以使用OR,NOT和一些额外的搜索条件...

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

同时遇到php bug entry,但不确定这是否是一个错误,或者需要以其他方式使用它!

有解决方案/解决方法吗?

我讨厌迭代每封邮件并检查代码是否满足条件......我希望通过IMAP搜索完成

修改/更新

imap_search函数与IMAP4不完全兼容。截至目前使用的c-client仅支持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 repo: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 - &gt;行号:4126
    imap_search =&gt;行号:4148

c-client库源跟踪:
src / c-client / mail.c - &gt;行号:3973

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

IMAP2 RFC1064 =&gt; [ref:https://tools.ietf.org/html/rfc1064] [page:13]
IMAP4 RFC2060 =&gt; [ref:http://www.faqs.org/rfcs/rfc2060.html] [section:6.4.4]

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

但我不确定哪个PHP版本使用IMAP4兼容的c-client ...

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

2 个答案:

答案 0 :(得分:1)

我解决了这几个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);

答案 1 :(得分:0)

你试过这个吗??

$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);