2016-04-01 4 views
2

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

<?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. с-клиент использовал как сейчас поддерживает только 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

РНР источник трассировки: (ссылка: https://github.com/php/php-src/blob/master/ext/imap/php_imap.c)
/ext/imap/php_imap.c -> линия №: 4126
imap_search => линия №: 4148

с-клиентский компьютер-источник библиотеки трассировки : не
SRC/с-клиент/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 версия использует IMAP4 совместимый с-клиент ...

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

Вы проверили, что на вашем сервере нет ошибки? Многие серверы «offbrand» имеют минимальные или сломанные поисковые реализации. – Max

+1

Похож на ошибку php, глядя на ссылку. Он говорит что-то об использовании нового cclient? – Max

+0

@Max, IMAP-сервер - это сервер gmail ... Очень маловероятно, что imap-сервер неисправен –

ответ

0

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

$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

Вы проверили, работает ли критерий поиска «ИЛИ»? если так, пожалуйста, поделитесь мной с phpinfo(). ... У меня есть подозрение на библиотеку «c-client» (у меня версия 2007f), может быть, у вас будет другой ... –

+0

Отец IMAP «Марк Crespin "умер в 2012 году, и с тех пор php не обновлял библиотеку c-client IMAP и использовал старую версию IMAP-2007f, которая поддерживает только версию IMAP2, мы не можем ожидать, что скоро появятся волшебные обновления для PHP IMAP. Кажется, единственный способ - искать несколько раз с помощью imap (пропорционально количеству OR условий, которые мы имеем в нашем запросе. В моем случае это более 10 ФЕДЕРАЛ ЕХПРЕСС, UPS, USPS, DHL, ... и другие условия) и 'array_unique()'/'array_intersect()' идентификаторы сообщений ... но 10 раз 'imap_search()' собирается убить мой сервер, если моя база пользователей IMAP продолжает увеличиваться –

1

Я решил это сделать несколько предложений 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); 
+0

Наконец, я тоже обработал ее на коде, а не на используя строку поиска ... Моя цель состояла в том, чтобы отфильтровать их по их предмету и содержимому, поэтому использовалось немного сравнения строк php и grep unix, чтобы перебирать содержимое почты (после сохранения в виде файла). также читайте комментарии, которые я написал для другого ответа ... об использовании 'array_intersect()' и 'array_unique()' –