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 документы для 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);

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

наблюдения и ссылки:
мерзавец репо: 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://tools.ietf.org/html/rfc1064 ] [страница: 13] IMAP4 RFC2060 => [ссылка: http://www.faqs.org/rfcs/rfc2060.html ] [раздел: 6.4.4]

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

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

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

4

Решение

Я решил это, выполнив несколько предложений 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);
1

Другие решения

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

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

По вопросам рекламы [email protected]