Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

imap_search limit the number of messages returned

Tags:

php

email

imap

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.

like image 700
aviv Avatar asked Feb 01 '10 14:02

aviv


3 Answers

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

like image 130
Sarfraz Avatar answered Nov 01 '22 17:11

Sarfraz


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.

like image 29
Dominik Avatar answered Nov 01 '22 17:11

Dominik


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

like image 1
jchuck Avatar answered Nov 01 '22 15:11

jchuck