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.
imap_fetch_overview
(PHP 4, PHP 5)
imap_fetch_overview — 주어진 메시지 헤더의 전체 정보를 읽어 온다
Description
array imap_fetch_overview
( int $imap_stream
, string $sequence
[, int $flags
] )
이 함수는 주어진 sequence 일련번호에 대한 헤더를 페치하고, 전체 정보를 돌려준다. sequence 값은 flags 가 FT_UID를 갖는다면 UID나 메시지 인덱스(indices)의 일련번호(sequence)가 된다. 돌려받는 값은 메시지 헤더의 각각을 서술하는 다음과 같은 속성을 갖는 객체의 배열이다:
- subject - the messages subject
- from - who sent it
- date - when was it sent
- message_id - Message-ID
- references - is a reference to this message id
- size - size in bytes
- uid - UID the message has in the mailbox
- msgno - message sequence number in the maibox
- recent - this message is flagged as recent
- flagged - this message is flagged
- answered - this message is flagged as answered
- deleted - this message is flagged for deletion
- seen - this message is flagged as already read
- draft - this message is flagged as being a draft
Example#1 imap_fetch_overview() example
$mbox = imap_open("{your.imap.host:143}","username","password")
|| die("can't connect: ".imap_last_error());
$overview = imap_fetch_overview($mbox,"2,4:6",0);
if(is_array($overview)) {
reset($overview);
while( list($key,$val) = each($overview)) {
print $val->msgno
. " - " . $val->date
. " - " . $val->subject
. "\n";
}
}
imap_close($mbox);
imap_fetch_overview
xhack at web dot de
20-Mar-2007 08:05
20-Mar-2007 08:05
raja at aonic dot net
14-Mar-2007 12:22
14-Mar-2007 12:22
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
09-Apr-2004 05:21
09-Apr-2004 05:21
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.
mails at slueoend dot ch
14-Dec-2003 04:15
14-Dec-2003 04:15
Not that this function and all other imap_fetch*-functions will download the whole message and not just the header information.
se at designlinks dot net
02-Jul-2003 06:42
02-Jul-2003 06:42
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)
suurenbroekNoSpam at ov35 dot NoSpam dot nl
14-Oct-2002 04:34
14-Oct-2002 04:34
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="";
trionon at mail dot ru
25-Feb-2002 10:13
25-Feb-2002 10:13
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.
steve at stevenchalker dot net
09-Nov-2001 08:26
09-Nov-2001 08:26
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'<BR>";
imap_close($mbox);
?>
