imap_search limit the number of messages returned

21,276

Solution 1

The imap_search function has a CRITERIA attribute you can use to limit the messages in a number of ways:

ALL - return all messages matching the rest of the criteria
ANSWERED - match messages with the \ANSWERED flag set
BCC "string" - match messages with "string" in the Bcc: field
BEFORE "date" - match messages with Date: before "date"
BODY "string" - match messages with "string" in the body of the message
CC "string" - match messages with "string" in the Cc: field
DELETED - match deleted messages
FLAGGED - match messages with the \FLAGGED (sometimes referred to as Important or Urgent) flag set
FROM "string" - match messages with "string" in the From: field
KEYWORD "string" - match messages with "string" as a keyword
NEW - match new messages
OLD - match old messages
ON "date" - match messages with Date: matching "date"
RECENT - match messages with the \RECENT flag set
SEEN - match messages that have been read (the \SEEN flag is set)
SINCE "date" - match messages with Date: after "date"
SUBJECT "string" - match messages with "string" in the Subject:
TEXT "string" - match messages with text "string"
TO "string" - match messages with "string" in the To : UNANSWERED - match messages that have not been answered
UNDELETED - match messages that are not deleted
UNFLAGGED - match messages that are not flagged
UNKEYWORD "string" - match messages that do not have the keyword "string"
UNSEEN - match messages which have not been read yet

Solution 2

imap_sort will allow you to both sort and filter at the same time

But still, it won't allow to limit to the 'top 20' right at the function call.

Solution 3

imap_search docs indicate this function:

Returns an array of message numbers or UIDs.

imap_fetch_overview docs indicate this function also returns:

message_id - Message-ID, uid - UID the message has in the mailbox

So we can use the imap_fetch_overview and sort a certain number and order with the same return as the imap_search function.

// get information about the current mailbox
$mboxCheck = imap_check($mbox);

// get the total amount of messages
$totalMessages = $mboxCheck->Nmsgs;

// select how many messages you want to see
$showMessages = 20;

// get those messages    
$result = imap_fetch_overview($mbox($totalMessages-$showMessages+1).":".$totalMessages);

$n = 0;
$emails = array();
// loop through returned messages, collect message numbers in same format as output of imap_search
foreach ($result as $mail) {
    $emails[$n] = $mail->msgno;
    $n++;
}  

if($emails) {
// put the newest emails on top 
rsort($emails);
}

This is built with the concept from this answer

Share:
21,276
aviv
Author by

aviv

"Just" a programmer

Updated on July 09, 2022

Comments

  • aviv
    aviv almost 2 years

    I have PHP script that fetch messages from a mailbox. I use the imap_search function: $emails = imap_search($mbox, 'UNSEEN');

    Is there a way to limit the number of returned messages. Right now on huge mailboxes i get like 5000 messages. I want only the top 20 ordered by date.

    Is there a way to do that?

    Thanks.

  • Anthony Forloney
    Anthony Forloney over 14 years
    That will narrow down the search, but will that limit how much mail to return back?
  • Sarfraz
    Sarfraz over 14 years
    @Anthony: this is the only way to narrow down the stuff a bit no other way as far as i know. Is there one?
  • Anthony Forloney
    Anthony Forloney over 14 years
    To narrow it down, its the only way. But his criteria is a limit number for, what I am assuming to be, all messages, which imap_search does not provide. There might be a hack, see my edit and let me know what you think.
  • Brijesh Tanwar
    Brijesh Tanwar over 2 years
    How to get the mails from a particular label. ??