imap_search限制返回的消息数

时间:2010-02-01 14:26:20

标签: php email imap

我有PHP脚本从邮箱中获取邮件。我使用imap_search函数: $emails = imap_search($mbox, 'UNSEEN');

有没有办法限制返回的邮件数量。现在在巨大的邮箱上我得到5000条消息。我只希望按日期订购前20名。

有办法吗?

感谢。

4 个答案:

答案 0 :(得分:7)

imap_search函数有一个CRITERIA属性,可用于以多种方式限制消息:

ALL - 返回符合其余条件的所有邮件
ANSWERED - 使用\ ANSWERED标志设置来匹配消息 BCC“string” - 在Bcc:字段中匹配带有“string”的消息 在“日期”之前 - 将消息与日期匹配:在“日期”之前
BODY“string” - 在邮件正文中匹配带有“string”的邮件 CC“string” - 在Cc:字段中匹配带有“string”的消息 删除 - 匹配已删除的邮件
标记 - 使用\ FLAGGED(有时称为重要或紧急)标记集来匹配消息 FROM“string” - 在From:字段中匹配带有“string”的消息 KEYWORD“string” - 匹配带有“string”作为关键字的消息
新 - 匹配新邮件
旧 - 匹配旧邮件
ON“日期” - 匹配带有日期的消息:匹配“日期”
最近 - 使用\ RECENT标志设置来匹配消息 SEEN - 匹配已读取的消息(设置了\ SEEN标志)
SINCE“date” - 将消息与日期匹配:在“date”之后
SUBJECT“string” - 匹配主题中带有“string”的消息:
TEXT“string” - 匹配带有文本“string”的消息
TO“string” - 在To中匹配带有“string”的消息: UNANSWERED - 匹配未回答的消息
UNDELETED - 匹配未删除的邮件
UNFLAGGED - 匹配未标记的消息
UNKEYWORD“string” - 匹配没有关键字“string”的消息
UNSEEN - 匹配尚未阅读的消息

答案 1 :(得分:1)

imap_sort将允许您同时进行排序和过滤

但是,它仍然不允许在函数调用时限制为“前20名”。

答案 2 :(得分:0)

通过这样解决这个问题:

1.您可以通过使用自标准减少数据的数量来限制返回的结果的数量 2.回顾几个最后返回的消息,例如15

$this->msgCounts = imap_search($imap_resource, 'SUBJECT "hello dolly" SINCE "8 April 2003"', SE_UID);

然后这是一个示例,用于检索返回的最后15个,然后向前和向后切换以查看更多结果或更旧。注意这假设您有一个向前和向前设置$ _GET变量的按钮。

$this->msgCounts = $messageCounts;
        $multiarray=[];
        \Session::put('totalmsg',$this->msgCounts);             //Sav etotal no of message in folder to session to determine if to allow next or previous

        if($this->msgCounts > 15)                               //MESSAGES IS MORE THAN WE NEED GET 20
        {
            $offcut = 15;                                       //default offcut

            /**
            * Viewing previous or next messages
            **/
                if(isset($_GET['msgs']) && $_GET['msgs'] == 'older')
                {
                 $this->msgCounts =  \Cache::has('msgpointer') ? \Cache::get('msgpointer') : $this->msgCounts;
                    $msgOffset = $this->msgCounts - $offcut;    //get +15 messages

                    if($offcut > $msgOffset) {
                        $msgOffset = $msgOffset + 5;            //if less than 15 get 10
                        $offcut = 10;
                    }
                    if($offcut > $msgOffset) {
                        $msgOffset = $msgOffset + 5;            //if less than 10 get 5
                        $offcut = 5;
                    }
                    if($offcut > $msgOffset) {
                        $msgOffset = $msgOffset + 3;            //if less than 3 get 2
                        $offcut = 2;
                    }
                    if($offcut > $msgOffset) {
                        $msgOffset = $msgOffset + 2;            //if less than 2 get 1
                        $offcut = 1;
                    }


                    \Cache::put('msgpointer',$msgOffset,60 * 60 * 24);
                }

                if(isset($_GET['msgs']) && $_GET['msgs'] == 'newest')
                {
                    $this->msgCounts =  \Cache::has('msgpointer') ? \Cache::get('msgpointer') : $this->msgCounts;
                    $msgOffset = $this->msgCounts + $offcut;    //get +15 messages

                    if($msgOffset > $messageCounts) {
                        $msgOffset = $msgOffset - 5;            //if not up to 15 get 10
                        $offcut = 10;
                    }
                    if($msgOffset > $messageCounts) {
                        $msgOffset = $msgOffset - 5;            //if not up to 10 get 5
                        $offcut = 5;
                    }
                    if($msgOffset > $messageCounts) {
                        $msgOffset = $msgOffset - 3;            //if not up to 5 get 2
                        $offcut = 2;
                    }
                    if($msgOffset > $messageCounts) {
                        $msgOffset = $msgOffset - 2;            //if not up to 2 get 1
                        $offcut = 1;
                    }


                    \Cache::put('msgpointer',$msgOffset,60 * 60 * 24);
                }


            // LOOP THROUGH LAST 20 MESSAGES IF THERE MORE THAN 10 MESSAGES
            for ($i = $this->msgCounts; $i > $this->msgCounts - $offcut; $i--) 
            { 

                 $header = imap_header($this->conn,$i);                             //GET HEADER INFO USING IMAP FUNCTION
                 $uid    = imap_uid($this->conn,$i);                                //GET UNIQUE MESSAGE ID FOR READING MESSAGE LATER


                 //SAVE ALL MESSAGE INFO IN ARRAY
                 $tobox    = $header->reply_to[0]->mailbox ? $header->reply_to[0]->mailbox : 'noreply';
                 $tohost   = $header->reply_to[0]->mailbox ? $header->reply_to[0]->host : 'email.com';
                 $toaddress = $tobox.'@'.$tohost;


                 $mailbox = isset($header->from[0]->mailbox) ? $header->from[0]->mailbox : 'no-reply';
                 $host    = isset($header->from[0]->host) ? $header->from[0]->host : 'email.com';
                 $fromaddress = $mailbox.'@'.$host;

                 $array = ['toaddress' => isset($header->toaddress) ? $header->toaddress : isset($header->to) ? $header->to[0]->mailbox.'@'.$header->to[0]->host : $toaddress,'date' => isset($header->date) ? $header->date : date('Y-m-d'),'subject' => isset($header->subject) ? $header->subject : "no subject" ,'from' => isset($header->from[0]->personal) ? $header->from[0]->personal :$fromaddress,'unseen' => isset($header->Unseen) ? $header->Unseen : 'S', 'uid' => isset($uid) ? $uid : $i,'fromemail' => $fromaddress];
                //PASS A MESSAGE INFO INTO A MULTI ARRAY
                $multiarray[] = $array;

            }

你可以将它的日期设置为90天之前,如果它很多的话。按照上面的块来回复它。我很抱歉在那里使用了一些laravel助手类,所有这些都很好地被注释掉了。 希望这有助于某人!

答案 3 :(得分:0)

imap_search文档指示此功能:

  

返回消息号或UID的数组。

imap_fetch_overview 文档指示此函数还返回:

  

message_id-消息ID,   uid-邮件在邮箱中的UID

因此,我们可以使用imap_fetch_overview并按与imap_search函数相同的返回值对特定的数字和顺序进行排序。

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

中的概念构建的