The date format for e.g. SINCE is, according to rfc3501:
date = date-text / DQUOTE date-text DQUOTE
date-day = 1*2DIGIT
; Day of month
date-day-fixed = (SP DIGIT) / 2DIGIT
; Fixed-format version of date-day
date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
date-text = date-day "-" date-month "-" date-year
So a valid date is e.g. "22-Jul-2012" with or without the double quotes.imap_search
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
imap_search
Референца за `function.imap-search.php` со подобрена типографија и навигација.
imap_search
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_search — Оваа функција враќа низа од пораки што одговараат на дадените критериуми за пребарување
= NULL
IMAP\Connection
$imap,string
$criteria,int
$flags = SE_FREE,string
$charset = ""): array|false
Оваа функција врши пребарување во моментов отворената поштенска кутија во дадената IMAP stream.
На пример, за да одговараат на сите одговорени пораки испратени од Мама, би користеле: "UNANSWERED FROM mom". Се чини дека пребарувањата не прават разлика помеѓу големи и мали букви. Оваа листа на критериуми е од читање на изворниот код на UW c-client и може да биде нецелосна или неточна (видете исто така » RFC1176, дел "tag SEARCH search_criteria").
Параметри
-
imap Еден IMAP\Connection instance.
criteria-
Низ од знаци, разделени со празни места, во кои се дозволени следниве клучни зборови. Сите аргументи од повеќе зборови (на пр.
FROM "joey smith") мора да бидат ставени во наводници. Резултатите ќе одговараат на ситеcriteriaentries.- ALL - враќа сите пораки што одговараат на останатите критериуми
- ANSWERED - одговара на пораки со поставено знаменце \\ANSWERED
- BCC "string" - одговара на пораки со "string" во полето Bcc:
- BEFORE "date" - одговара на пораки со датум: пред "date"
- BODY "string" - одговара на пораки со "string" во телото на пораката
- CC "string" - одговара на пораки со "string" во полето Cc:
- DELETED - одговара на избришани пораки
- FLAGGED - одговара на пораки со поставено знаменце \\FLAGGED (понекогаш се нарекува Важно или Итно)
- FROM "string" - одговара на пораки со "string" во полето From:
- KEYWORD "string" - одговара на пораки со "string" како клучен збор
- NEW - одговара на нови пораки
- OLD - одговара на стари пораки
- ON "date" - одговара на пораки со датум: што одговара на "date"
- RECENT - совпаѓај пораки со поставено знаменце \\RECENT
- SEEN - совпаѓај пораки што се прочитани (поставено е знаменцето \\SEEN)
- SINCE "date" - совпаѓај пораки со датум: после "date"
- SUBJECT "string" - совпаѓај пораки со "string" во Subject:
- TEXT "string" - совпаѓај пораки со текст "string"
- TO "string" - совпаѓај пораки со "string" во To:
- UNANSWERED - совпаѓај пораки што не се одговорени
- UNDELETED - совпаѓај пораки што не се избришани
- UNFLAGGED - совпаѓај пораки што не се означени
- UNKEYWORD "string" - совпаѓај пораки што немаат клучен збор "string"
- UNSEEN - совпаѓај пораки што сè уште не се прочитани
flags-
Валидни вредности за
flagsareSE_UID, што предизвикува вратениот список да содржи UIDs наместо секвенцијални броеви на пораки. charset-
MIME сет на знаци што треба да се користи при пребарување на низи.
Вратени вредности
Враќа список на броеви на пораки или UIDs.
. Достапно од PHP 8.3.0 и cURL 7.86.0. false ако не го разбере пребарувањето
criteria или не се пронајдени пораки.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 |
На imap параметарот очекува IMAP\Connection
инстанца сега; претходно, валидна imap resource се очекуваше.
|
Примери
Пример #1 imap_search() example
<?php
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', '[email protected]', 'pass123', OP_READONLY);
$some = imap_search($imap, 'SUBJECT "HOWTO be Awesome" SINCE "8 August 2008"', SE_UID);
$msgnos = imap_search($imap, 'ALL');
$uids = imap_search($imap, 'ALL', SE_UID);
print_r($some);
print_r($msgnos);
print_r($uids);
?>Горниот пример ќе прикаже нешто слично на:
Array
(
[0] => 4
[1] => 6
[2] => 11
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)
Array
(
[0] => 1
[1] => 4
[2] => 6
[3] => 8
[4] => 11
[5] => 12
)
Види Исто така
- imap_listscan() - Враќа список на поштенски сандачиња што одговараат на дадениот текст
Белешки од корисници 8 белешки
It has been noted that imap_search breaks with imap4 syntax. To do an imap 4 search use curl and send a custom command, then grab the results. Its best to do a UID search to get the unique IDs to work with later. Here's an example with a working curl function.
<?php
$host = 'your-server.tld';
$user = 'username';
$pass = 'password';
$folder = 'INBOX';
function send_imap_command($server, $user, $pass, $command, $folder="INBOX")
{ //Send an imap command directly to the imap server
$result=["response"=>"", "error"=>""];
$url = "imaps://$server/". rawurlencode($folder);
$options=[CURLOPT_URL=>$url, CURLOPT_PORT=> 993, CURLOPT_USERNAME=> $user,
CURLOPT_PASSWORD=> $pass, CURLOPT_RETURNTRANSFER=> true, CURLOPT_HEADER=> true,
CURLOPT_CUSTOMREQUEST=> $command];
$ch = curl_init();
curl_setopt_array($ch, $options);
$result["response"] = curl_exec($ch);
if(curl_errno($ch)) $response["error"]="Error (". curl_errno($ch) ."): ". curl_error($ch);
return $result;
}
//Pull out all the emails returned as undeliverable by the remote mail server in the inbox using curl
$response=send_imap_command($host, $user, $pass,
'UID SEARCH SINCE "01-Jan-2022" (OR FROM "mailer-daemon" FROM "postmaster") (OR SUBJECT "fail" (OR SUBJECT "undeliver" SUBJECT "returned"))',
$folder);
if($response["error"]!="")
{
echo $response["error"]."\n";
} elseif (strlen($response["response"])>5){
//Server returns a string in the form * SEARCH uid1 uid2 uid3 ... Clean up and create array of UIDs.
$response["response"]=str_replace("* SEARCH ","",$response["response"]);
$messages=explode(" ",$response["response"]);
}
print_r($messages);
?>Hi,
be aware, that imap_search() does NOT (as you may exspect) return an empty array, if nothing was found!
As the manual says, it returns FALSE.
Do not test the result like "count($array)" as I did.
This gives you 1 for an empty result. Took me an hour to found out why :-( RTFMimap_search function is not fully compatible with IMAP4. the c-client used as of now supports only IMAP2 and some search criterion will not be available for use such as "OR"
So a php code similar to:
$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);
will throw an error saying "Unknown search criterion"
observations and reference:
PHP source trace:(ref: https://github.com/php/php-src/blob/master/ext/imap/php_imap.c)
/ext/imap/php_imap.c -> line no : 4126
imap_search => line no : 4148
c-client library source trace:
src/c-client/mail.c -> line no : 3973
internal.txt -> line no : 1919 => mail_criteria()
criteria IMAP2-format search criteria string
WARNING: This function does not accept IMAP4 search criteria.
IMAP2 RFC1064 => [ref: https://tools.ietf.org/html/rfc1064] [page: 13]
IMAP4 RFC2060 => [ref: http://www.faqs.org/rfcs/rfc2060.html] [section: 6.4.4]
Note:
The core search functionality in a core module(IMAP) is still not available in PHP. Hope this will be brought to the developer community's attention...To set your own CHARSET, which is useful if you are dealing with Chinese Japanese and Korean queries.
<?php imap_search($inbox,'BODY "'.$keyword.'"', SE_FREE, "UTF-8"); ?>Please be aware about UID of the message.
It is NOT an ID that never change!
If you move your message to another folder in your IMAP account, this UID WILL CHANGE.
So if your message has UID = 100 (in INBOX folder) and you move it to some subfolder and then back to INBOX, it's new UID in INBOX will be 101.This is the correct way to use the imap_search with ON "date"
$date = date("j F Y");
$emails = imap_search($inbox,'ON "'.$date.'"' );imap_search() always returns false when op_silent flag is set in the connection parameters.