【问题标题】:imap_search() unknown search criterion "OR"imap_search() 未知搜索条件“或”
【发布时间】:2017-05-30 19:48:47
【问题描述】:

试图构建一个 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 客户端仅支持 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-client 库源码跟踪:
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-client...

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

【问题讨论】:

  • 您检查过您的服务器没有错误吗?许多“非品牌”服务器的搜索实现很少或损坏。
  • 看起来像一个php bug,看链接。它说的是关于使用新的 cclient 吗?
  • @Max , IMAP 服务器是 gmail 服务器... imap 服务器故障的可能性很小
  • @Max ,您知道任何与 php 5.4 兼容的新 c-client 库吗?如果是这样,请分享链接...

标签: php search imap rfc


【解决方案1】:

我通过几个 imap_search 句子来模拟“或”来解决这个问题。

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

【讨论】:

  • 最后,我也在代码上处理了它,而不是使用搜索字符串...我的目标是根据它们的主题和内容过滤它们,所以使用了一点 php 字符串比较和 unix 的 grep翻阅邮件内容(将其保存为文件后)。还阅读了我为其他答案发布的 cmets... 关于使用 array_intersect()array_unique()
【解决方案2】:

你试过了吗?

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

【讨论】:

  • 您是否检查过“OR”搜索条件是否有效?如果是这样,请与我分享phpinfo()...我怀疑“c-client”库(我有 2007f 版本)可能你会有不同的...
  • IMAP 之父“Mark Crespin”于 2012 年去世,从那时起 php 没有更新 IMAP c-client 库,而是使用仅支持 IMAP2 版本的旧 IMAP-2007f 版本。不要指望 PHP IMAP 很快就会发生任何神奇的更新。似乎唯一的方法是使用 imap 进行多次搜索(与我们查询中的 OR 条件成正比。在我的情况下,它超过 10 个 FEDEX、UPS、USPS、DHL 等条件)和array_unique() / array_intersect() 消息 ID...但是如果我的 IMAP 用户群不断增加,10 次 imap_search() 会杀死我的服务器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多