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



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

imap_fetch_overview

Read an overview of the information in the headers of the given message (PHP 4, PHP 5)
array imap_fetch_overview ( resource imap_stream, string sequence [, int options] )

Example 1048. imap_fetch_overview() example

<?php
$mbox
= imap_open("{imap.example.org:143}INBOX", "username", "password")
    or die(
"can't connect: " . imap_last_error());

$MC = imap_check($mbox);

// Fetch an overview for all messages in INBOX
$result = imap_fetch_overview($mbox,"1:{$MC->Nmsgs}",0);
foreach (
$result as $overview) {
   echo
"#{$overview->msgno} ({$overview->date}) - From: {$overview->from}
   {$overview->subject}\n"
;
}
imap_close($mbox);
?>

Code Examples / Notes » imap_fetch_overview

xhack

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 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