Попытка создать поисковый запрос 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 …
Я решил это, выполнив несколько предложений 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);
Вы пробовали это?
$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);