代码之家  ›  专栏  ›  技术社区  ›  aviv

imap_search限制返回的邮件数

  •  8
  • aviv  · 技术社区  · 14 年前

    我有从邮箱获取消息的PHP脚本。我使用imap_搜索功能: $emails = imap_search($mbox, 'UNSEEN');

    是否有方法限制返回的消息数?现在在巨大的邮箱里,我收到了5000条信息。我只想要按日期排序的前20位。

    有办法吗?

    谢谢。

    3 回复  |  直到 9 年前
        1
  •  7
  •   Sarfraz    14 年前

    imap_search函数有一个criteria属性,您可以通过多种方式限制消息:

    全部-返回与其余条件匹配的所有消息
    已应答-将消息与\已应答标志集匹配
    bcc“string”-将消息与bcc:字段中的“string”匹配
    在“日期”之前-将消息与日期匹配:在“日期”之前
    正文“string”-将消息与消息正文中的“string”匹配
    cc“string”-将cc:字段中的消息与“string”匹配
    已删除-匹配已删除邮件
    已标记-将邮件与已标记(有时称为重要或紧急)标志集匹配
    From“String”-将消息与From:字段中的“String”匹配
    关键字“string”-将消息与关键字“string”匹配
    新建-匹配新邮件
    旧-匹配旧邮件
    在“日期”上-将消息与日期匹配:匹配“日期”
    最近-将邮件与\最近的标志集匹配
    seen-匹配已读取的消息(设置了\seen标志)
    自“日期”—将消息与日期匹配:在“日期”之后
    主题“字符串”-将邮件与主题中的“字符串”匹配:
    文本“string”-将消息与文本“string”匹配
    to“string”-将消息与to中的“string”匹配: 未应答-匹配未应答的消息
    未删除-匹配未删除的邮件
    未标记-匹配未标记的邮件
    unkeyword“string”-匹配没有关键字“string”的消息
    看不见-匹配尚未阅读的邮件

        2
  •  1
  •   Dominik    14 年前

    imap_sort将允许您同时进行排序和筛选

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

        3
  •  0
  •   Alofe Oluwafemi    9 年前

    通过这样解决这个问题:

    1.可以通过使用“自”条件减少数据数量来限制返回的结果数量。 2。检索最近返回的几条消息,例如15条

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

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

    $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天前开始的日期设定为90天。像上面那样一块一块地返回它。我很抱歉在那里使用了一些Laravel助手类,所有这些都被很好地注释掉了。 希望这能帮助别人!