Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : IMAP, POP3 and NNTP Functions : imap_sort

imap_sort

Gets and sort messages (PHP 4, PHP 5)
array imap_sort ( resource imap_stream, int criteria, int reverse [, int options [, string search_criteria [, string charset]]] )


Code Examples / Notes » imap_sort

ks@edv

just finished:
include('imappop3.php');
$mbox=imap_open($mailbox,$username,$password) or die('keine Verbindung!');
//sortiert reverse nach Größe und liefert UIDs
$sorted_array=imap_sort($mbox,SORTSIZE,1,SE_UID);
$mail=imap_fetchstructure($mbox,next($sorted_array),FT_UID);
echo $mail->bytes.'
';
$mail=imap_fetchstructure($mbox,end($sorted_array),FT_UID);
echo $mail->bytes.'
';
if ($err=imap_errors()) print_r($err);
imap_close ($mbox);
outputs the size of the biggest and smallest EMail:
36476
526


tilmauder

in response to fprado's problem, the solution would be to use array_multisort() function on imap_fetchheader(). sdavey at datalink dot net dot au wrote an excellent example under array_multisort. I have used it to sort POP3 by message size. Unfortunately, my code is much too convoluted to post it here.

boscolau

in reply to graham_NOSPAM at rdb-concepts dot NOSPAM dot co dot uk here is a more elegant way to achieve sorting of search results:
function order_search($searchresults, $sortresults) {
   return array_values(array_intersect($sortresults,$searchresults));
}
example of using function:
  $sortresults = imap_sort($stream, $sort, $sortorder);
  $searchresults = imap_search($stream, $query);
  $sorted_search_results = order_search($searchresults, $sortresults);
sorted version of search results will then be held in the array of $sorted_search_results.


persian-horde

imap_sort uses the c-client library to sort messages. This library currently does not
support locale-based sort for foreign languages (Although it has charset option).
They are working on this(http://www.washington.edu/imap/IMAP-FAQs/#1.12),
but you can use the following function which uses strcoll() for locale-based sorting.
Pease note that this is required for SUBJECT field sorting, because most of
other fields are sorted correctly by imap_sort in any locale:
function imap_locale_sort($stream,$criteria,$reverse,$locale,$options)
{
       if ($criteria!=SORTSUBJECT)
               return (imap_sort($stream,$criteria,$reverse,$options));
       $unsorted = array();
       $sortresult = array();
       $MC=imap_check($stream);
       $MN=$MC->Nmsgs;
       $overview = imap_fetch_overview($stream,"1:$MN",0);
       $k=0;
       while( list($key,$val) = each($overview))
       {
               $unsorted[$k]["uid"]=$val->uid;
               $unsorted[$k]["subject"]=MIME::decode($val->subject, NLS::getCharset());
               $k++;
       }
       usort ($unsorted, create_function('$a,$b','setlocale(LC_ALL,$locale);return strcoll($a["subject"],$b["subject"]);'));
       for ($m=0;$m<count($unsorted);$m++)
               array_push($sortresult,$unsorted[$m]["uid"]);
       if ($reverse)
               $sortresult = array_reverse($sortresult);
       return $sortresult;
}
Usage example:
$sorted = imap_locale_sort($stream,SORTSUBJECT,0,'fa_IR',0);


naryaattolkiendildotcom

I've discovered while hacking IMP that imap_sort() allow you to define search options :
imap_sort ($stream, $criteria, $reverse, SE_UID, $search);
where $search is an imap_search() query.


antoine dot spam-nono

I worked a lot with IMAP functions since I wrote a complete webmail and I've got a little tip about the imap_sort function :
There is a big difference between :
<?php
imap_sort($imap, SORTDATE, 1);
// and
imap_sort($imap, SORTARRIVAL, 1);
?>
The first command will issue a
>> FETCH 1:last (UID ENVELOPE BODY.PEEK[HEADER.FIELDS (Newsgroups Content-MD5 Content-Disposition Content-Language Content-Location Followup-To References)] INTERNALDATE RFC822.SIZE FLAGS)
While the second resulted in
>> FETCH 1:last (UID INTERNALDATE RFC822.SIZE FLAGS)
As a result, using SORTDATE took 3 seconds longer to complete on a 800-emails mailbox, while the results are quite the same (except if you have to deal with forged dates or timezones, but the arrival order is far more logical)
My advice if you sort your emails by arrival is to actually use SORTARRIVAL, or better don't use imap_sort and go straight with message numbers (not UIDs). On large mailboxes, if you display messages per page, you will have significant performance increases (by avoiding 5 seconds of sorting).


fprado

I use imap_sort() to go through POP3 accounts. However, sometimes, when the mailbox is too large, the response is incredibly slow.
I tried sniffing the network to discover the source of the problem and found that when imap_sort() is called for a POP3 server, it downloads the full body & attachs of ALL the messages in the mailbox. Since my POP server and my Web server are on differente machines, this caused the considerably slow response.
I've been trying a work-around this issue and if I manage to do this I'll post it here.


persian-horde

Hello,
We used MIME and NLS libraries in our previous code(imap_locale_sort) that
are part of PEAR and Horde projects, and so our function
was so specific. Here is the general (pure php) code for this
function:
function imap_locale_sort($stream,$criteria,$reverse,$locale,$options)
{
       if ($criteria!=SORTSUBJECT)
               return (imap_sort($stream,$criteria,$reverse,$options));
       $unsorted = array();
       $sortresult = array();
       $MC=imap_check($stream);
       $MN=$MC->Nmsgs;
       $overview = imap_fetch_overview($stream,"1:$MN",0);
       $k=0;
       while( list($key,$val) = each($overview))
       {
               $unsorted[$k]["uid"]=$val->uid;
               $unsorted[$k]["subject"]=imap_utf8($val->subject);
               $k++;
       }
       usort ($unsorted, create_function('$a,$b','setlocale(LC_ALL,$locale);return strcoll($a["subject"],$b["subject"]);'));
       for ($m=0;$m<count($unsorted);$m++)
               array_push($sortresult,$unsorted[$m]["uid"]);
       if ($reverse)
               $sortresult = array_reverse($sortresult);
       return $sortresult;
}
Sample usage:
$mbox = imap_open("{localhost:143}INBOX.sent-mail","userid","password");
if ($mbox)
   echo ("Connection Successful!");
$sorted = imap_locale_sort($mbox,SORTSUBJECT,0,'fa_IR',0);
print_r($sorted);
print ("\n\n");
$sorted = imap_sort($mbox,SORTSUBJECT,SE_UID);
print_r($sorted);
imap_close($mbox);


graham_nospam

for those of you with an old version of PHP that doesn't support the extra search paramater you may want to use this function:
function order_search($searchresults, $sortresults) {
$searchhash = array();
$returnresults = array();
$count = 0;
for ($i = 0; $i < sizeof($searchresults); $i++) {
$searchhash[$searchresults[$i]] = true;
}
for ($i = 0; $i < sizeof($sortresults); $i++) {
if (@$searchhash[$sortresults[$i]]) {
$returnresults[$count] = $sortresults[$i];
$count++;
}
}
return $returnresults;
}
example of using function:
   $sortresults = imap_sort($stream, $sort, $sortdir, SE_UID);
   $searchresults = imap_search($stream, $search, SE_UID);
   $results = order_search($searchresults, $sortresults);
$results will then hold a sorted array of search results.


Change Language


Follow Navioo On Twitter
imap_8bit
imap_alerts
imap_append
imap_base64
imap_binary
imap_body
imap_bodystruct
imap_check
imap_clearflag_full
imap_close
imap_createmailbox
imap_delete
imap_deletemailbox
imap_errors
imap_expunge
imap_fetch_overview
imap_fetchbody
imap_fetchheader
imap_fetchstructure
imap_get_quota
imap_get_quotaroot
imap_getacl
imap_getmailboxes
imap_getsubscribed
imap_header
imap_headerinfo
imap_headers
imap_last_error
imap_list
imap_listmailbox
imap_listscan
imap_listsubscribed
imap_lsub
imap_mail_compose
imap_mail_copy
imap_mail_move
imap_mail
imap_mailboxmsginfo
imap_mime_header_decode
imap_msgno
imap_num_msg
imap_num_recent
imap_open
imap_ping
imap_qprint
imap_renamemailbox
imap_reopen
imap_rfc822_parse_adrlist
imap_rfc822_parse_headers
imap_rfc822_write_address
imap_savebody
imap_scanmailbox
imap_search
imap_set_quota
imap_setacl
imap_setflag_full
imap_sort
imap_status
imap_subscribe
imap_thread
imap_timeout
imap_uid
imap_undelete
imap_unsubscribe
imap_utf7_decode
imap_utf7_encode
imap_utf8
eXTReMe Tracker