【问题标题】:How can I use the Conditional OR to search emails with imap_search - PHP IMAP library如何使用条件 OR 通过 imap_search 搜索电子邮件 - PHP IMAP 库
【发布时间】:2011-03-10 05:16:11
【问题描述】:

我需要在 imap_search() 命令中使用 OR 语句。

我发现此库不支持条件 OR。 Imap_search Bug Report Link 必须有一种方法可以使用条件 OR 搜索电子邮件,我将如何去做?我不确定从哪里开始。

我想做的事:

$boxes = imap_search($connection,'SINCE "08-Mar-2011" AND (BODY "bobby" OR BODY "robert" OR BODY "bob"');

【问题讨论】:

  • 您的SEARCH 语法错误,因为操作是前缀而不是中缀。试试'SINCE "08-Mar-2011" (OR BODY "bobby" OR BODY "robert" BODY "bob")' 看看是否有效...
  • 抱歉没有用 - 我什至尝试在“robert”和 BODY 之间添加最后一个 OR,但仍然没有。

标签: php email imap


【解决方案1】:

您的 SEARCH 语法错误,因为运算符是前缀而不是中缀。正确的搜索字符串应该是'SINCE "08-Mar-2011" OR BODY "bobby" OR BODY "robert" BODY "bob"'。

但是,如果 PHP 根本不支持 imap_search 中的 OR - 并且您的链接表明它们不支持,尽管 c-client 支持它近 10 年 - 那么您将不得不这样做申请中的条件 OR。运行

$box_bobby  = imap_search($connection, 'SINCE "08-Mar-2011" BODY "bobby"');
$box_robert = imap_search($connection, 'SINCE "08-Mar-2011" BODY "robert"');
$box_bob    = imap_search($connection, 'SINCE "08-Mar-2011" BODY "bob"');

然后合并三个结果集。

【讨论】:

  • +1 表示前缀/中缀的区别。非 PHP 应用程序需要这个(好吧,我的邮箱使用 IMAP 作为 shell 的命令行管理,因为我们中的一些人喜欢 shell)并且从未掌握布尔运算符。
【解决方案2】:

或者使用 array_merge 将结果合并到一个数组中:

//search codes: 1 -> FROM, 2 -> SUBJECT
array_push($filtri, array(1,"no-reply@accounts.google.com"));
array_push($filtri, array(1,"Tophost"));
array_push($filtri, array(2,"promemoria"));

$yesterday = date("Y-m-d", strtotime ("-1 days"));

foreach($filtri as $filtro){
    if ($filtro[0] == 1) $addFiltri = ' FROM "'.$filtro[1].'" ';
    if ($filtro[0] == 2) $addFiltri = ' SUBJECT "'.$filtro[1].'" ';
    $temp = imap_search($inbox,'SINCE "'.$yesterday.'" '.$addFiltri);
    $emails = array_merge($emails , $temp); 

}

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多