|
imap_fetch_overview
Read an overview of the information in the headers of the given message
(PHP 4, PHP 5)
Example 1048. imap_fetch_overview() example<?php Code Examples / Notes » imap_fetch_overviewxhack
you want a sortet list of mails, but you get always the same order? your c-client seems to cause this. i realized this with linux libc6-2.3.6 and php-5.2.0 try this little code: # here you try to sort by your criteria $sort=@imap_sort($mbox,SORTDATE,1,SE_UID); # here the order of the messages to fetch should be recognised, but it isn't $tmp=@imap_fetch_overview($mbox,implode(',',$sort),FT_UID); # so try to work around simply: for($i=0;$i<count($tmp);$i++) { $liste[$i]=$tmp[array_search($tmp[$i]->uid,$sort)]; } so now you can use the sort by date, address, and so on. se
To further explain 'warrenfalk's comment, the following sequences are exactly the same, and always returns messages with lowest UID to highest UID: 1:5 5:1 1,2,3,4,5 5,4,3,2,1 3,2,5,1,4 (always returned as 1,2,3,4,5) trionon
This performance hint is useful if you need to print the result of imap_sort(): It's faster to prepare large string with UIDs and then to call imap_fetchoverview once than calling imap_fetchoverview in a loop. suurenbroeknospam
Note that these object-variables only exist when they are actually in the mail. This means that if a mail has no subject, the property $val->subject will not exist. Calling $val->subject will generate an notice: Notice: Undefined property: subject in /home/html/inc/Mbox.php on line xxx Use this to check it: if (array_key_exists( "subject", get_object_vars($val))) $subj=$val->subject; else $subj=""; mails
Not that this function and all other imap_fetch*-functions will download the whole message and not just the header information.
steve
I think if you go like a list, you can list your "hotmail" messages. <?php $mbox=imap_open("{imap.server.com}","user","pass"); $MC=imap_check($mbox); $MN=$MC->Nmsgs; $overview=imap_fetch_overview($mbox,"1:$MN",0); $size=sizeof($overview); for($i=$size-1;$i>=0;$i--){ $val=$overview[$i]; $msg=$val->msgno; $from=$val->from; $date=$val->date; $subj=$val->subject; echo "#$msg: From:'$from' Date:'$date' Subject:'$subj' "; imap_close($mbox); ?> raja
Here is a function to get messages from IMAP and sort them for pagination. <?php /** * Return array of IMAP messages for pagination * * @param int $page page number to get * @param int $per_page number of results per page * @param array $sort array('subject', 'asc') etc * * @return mixed array containing imap_fetch_overview, pages, and total rows if successful, false if an error occurred * @author Raja K */ public function listMessages($page = 1, $per_page = 25, $sort = null) { $limit = ($per_page * $page); $start = ($limit - $per_page) + 1; $start = ($start < 1) ? 1 : $start; $limit = (($limit - $start) != ($per_page-1)) ? ($start + ($per_page-1)) : $limit; $info = imap_check($this->_imap_stream); $limit = ($info->Nmsgs < $limit) ? $info->Nmsgs : $limit; if(true === is_array($sort)) { $sorting = array( 'direction' => array( 'asc' => 0, 'desc' => 1), 'by' => array( 'date' => SORTDATE, 'arrival' => SORTARRIVAL, 'from' => SORTFROM, 'subject' => SORTSUBJECT, 'size' => SORTSIZE)); $by = (true === is_int($by = $sorting['by'][$sort[0]])) ? $by : $sorting['by']['date']; $direction = (true === is_int($direction = $sorting['direction'][$sort[1]])) ? $direction : $sorting['direction']['desc']; $sorted = imap_sort($this->_imap_stream, $by, $direction); $msgs = array_chunk($sorted, $per_page); $msgs = $msgs[$page-1]; } else $msgs = range($start, $limit); //just to keep it consistent $result = imap_fetch_overview($this->_imap_stream, implode($msgs, ','), 0); if(false === is_array($result)) return false; //sorting! if(true === is_array($sorted)) { $tmp_result = array(); foreach($result as $r) $tmp_result[$r->msgno] = $r; $result = array(); foreach($msgs as $msgno) { $result[] = $tmp_result[$msgno]; } } $return = array('res' => $result, 'start' => $start, 'limit' => $limit, 'sorting' => array('by' => $sort[0], 'direction' => $sort[1]), 'total' => imap_num_msg($this->_imap_stream)); $return['pages'] = ceil($return['total'] / $per_page); return $return; } ?> group-office developer
About the sequence sorting again. I've found that there's a significant speed improvement by preparing the sequence and then fetch them at once with large mailboxes. On small mailboxes wyou will not notice a speed difference. But then there's the sorting problem. I've spent all night fiuring out how to do this myself. I found the solution! Prepare an array of messages with imap_sort. Create a second array that maps the message numbers to the actuall place in the fetched array. You know it will be in numeric order so you can make an array map with the sort() function sorting it from high to low. Then you can proces the array fetched with imap_fetch_overview with the array_map and you will have them sorted. If you need an example look in the Group-Office code classes/imap.class.inc in a version later then 2.04. |
Change Languageimap_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 |