imap_search() неизвестный критерий поиска ИЛИ

Попытка создать поисковый запрос IMAP для фильтрации определенных писем с помощью php-кода... Возникла ситуация, когда я должен использовать критерии поиска «ИЛИ».

<?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 для IMAP говорится, что документация может быть неточной и направлена ​​на RFC 2060, поэтому в разделе 6.4.4 для команды поиска упоминается, что мы можем использовать ИЛИ , НЕ и несколько дополнительных критериев поиска...

поэтому использовал его в позиции префикса, позиции инфикса и пытался использовать круглые скобки, как это предлагается в RFC 2060, но все напрасно

Также наткнулся на запись об ошибке php, но не уверен, является ли это ошибкой или нужно использовать как-то иначе!

У кого-нибудь есть решения/обходные пути?

Я бы не хотел перебирать каждое письмо и проверять код, если он удовлетворяет условию... Я бы хотел, чтобы это выполнялось с помощью поиска IMAP.


Изменить/обновить:

Функция imap_search не полностью совместима с IMAP4. c-клиент, используемый на данный момент, поддерживает только IMAP2, и некоторые критерии поиска будут недоступны для использования, например, «ИЛИ»

Итак, php-код похож на:

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

выдает ошибку "Неизвестный критерий поиска"

наблюдения и ссылки:
репозиторий git: https://github.com/php/php-src

Трассировка источника PHP:( ref: 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 string
ПРЕДУПРЕЖДЕНИЕ. Эта функция не принимает критерии поиска IMAP4.

IMAP2 RFC1064 => [ссылка: https://tools.ietf.org/html/rfc1064 ] [страница: 13]
IMAP4 RFC2060 => [ ref: http://www.faqs.org/rfcs/rfc2060.html ] [раздел: 6.4.4]

Примечание. Основные функции поиска в основном модуле (IMAP) по-прежнему недоступны в PHP. Надеюсь, это будет доведено до сведения сообщества разработчиков...

Но я не уверен, какая версия PHP использует c-client, совместимый с IMAP4...

  1. Есть ли способ заставить php просто обновить/использовать последнюю библиотеку c-client?
  2. Или текущий последний (по состоянию на 11 апреля 2016 г.) c-client поддерживает только IMAP2?
  3. Должны ли мы изменить исходный код библиотеки, скомпилировать и установить?
  4. Или существуют какие-либо другие PHP-библиотеки, разработанные сторонними компаниями, которые мы можем использовать для выполнения того же самого (поиск почты по протоколу imap, извлечение для тех почтовых провайдеров, которые не поддерживают OAuth2)?

person Crystal Paladin    schedule 01.04.2016    source источник
comment
Вы проверили, что на вашем сервере нет ошибок? Многие сторонние серверы имеют минимальные или неработающие реализации поиска.   -  person Max    schedule 01.04.2016
comment
Похоже на ошибку php, глядя на ссылку. Это что-то говорит об использовании нового клиента?   -  person Max    schedule 01.04.2016
comment
@Max, IMAP-сервер - это сервер gmail ... Крайне маловероятно, что сервер IMAP неисправен.   -  person Crystal Paladin    schedule 11.04.2016
comment
@Max, знаете ли вы какую-нибудь новую библиотеку c-client, совместимую с php 5.4? если да то поделитесь ссылкой...   -  person Crystal Paladin    schedule 11.04.2016


Ответы (2)


Я решил это, сделав несколько предложений imap_search для имитации «ИЛИ».

$criteria = 'UNSEEN FROM "[email protected]"|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);
person Ale de Haro    schedule 30.05.2017
comment
Наконец, я тоже обработал это в коде, а не с помощью строки поиска... Моя цель состояла в том, чтобы отфильтровать их на основе их темы и содержимого, поэтому я использовал немного сравнения строк php и grep unix, чтобы рыться в содержимом почты (после сохранить в виде файла). также прочитайте комментарии, которые я разместил для другого ответа... об использовании array_intersect() и array_unique() - person Crystal Paladin; 30.05.2017

Вы пробовали это.?

$inbox   = imap_open('{imap.example.com:993/imap/ssl}INBOX', '[email protected]', 'pass123', OP_READONLY);

$search_string = 'SINCE "08-Mar-2011" OR SUBJECT "FedEx" OR SUBJECT "USPS"';

$emails = imap_search($inbox, $search_string);
person hemnath mouli    schedule 06.04.2016
comment
Вы проверяли, работает ли вообще критерий поиска ИЛИ? если да, пожалуйста, поделитесь со мной phpinfo()... у меня есть подозрение на библиотеку c-client (у меня версия 2007f), возможно, у вас другая... - person Crystal Paladin; 11.04.2016
comment
Отец IMAP Марк Креспин умер в 2012 году, и с тех пор php не обновлял библиотеку IMAP c-client и использовал старую версию IMAP-2007f, которая поддерживает только версию IMAP2. IMAP. Кажется, единственный способ - это выполнить поиск несколько раз с помощью imap (пропорционально количеству условий ИЛИ, которые у нас есть в нашем запросе. в моем случае это более 10 FEDEX, UPS, USPS, DHL, ... и другие условия) и array_unique() / array_intersect() идентификаторы сообщений... но 10 раз imap_search() убьет мой сервер, если моя пользовательская база IMAP продолжит расти - person Crystal Paladin; 11.04.2016