2010-02-01 134 views
8

我有從腳本中獲取郵件的PHP腳本。我使用imap_search函數: $emails = imap_search($mbox, 'UNSEEN');imap_search限制返回消息的數量

有沒有辦法限制返回的消息數量。現在在巨大的郵箱我得到像5000條消息。我只想要按日期排序的前20名。

有沒有辦法做到這一點?

謝謝。

回答

6

的imap_search函數有一個條件屬性,你可以使用多種方式來限制消息:

ALL - 與\ Answered標記匹配消息 - 返回
回答準則其餘符合所有消息設置
BCC「串」 - 在密件抄送「串」匹配消息:場
之前的「日期」 - 與日期相符的消息:「日期」
BODY「字符串」之前 - 與「串」相匹配的消息正文消息
CC「string」 - 將消息與「string」匹配抄送:字段
DELETED - 匹配刪除的消息
FLAGGED - 匹配與\ FLAGGED消息(有時被稱爲重要或緊急的)標誌設置
FROM「字符串」 - 在從匹配消息以「串」:場
KEYWORD 「串」 - 比賽的消息與 「字符串」 作爲關鍵詞
NEW - 匹配新的消息
OLD - 匹配的舊消息
「日期」 - 與日期相符的消息:匹配 「日期」
近期 - 將消息與\ RECENT標誌集合匹配
SEEN - 匹配消息tha噸有被讀取(在\ SEEN標誌設置)
SINCE「日期」 - 與日期相符的消息:後「日期」
SUBJECT「串」 - 在主題爲「串」匹配消息:
TEXT「字符串「 - 匹配短信‘串’
爲‘字符串 - 字符串’相匹配的消息‘’在To: 解答 - 匹配沒有得到回答
未刪除的消息 - 未刪除
未標記匹配的消息 - 匹配未標記的郵件
UNKEYWORD「string」 - 匹配沒有關鍵字「string」的郵件
級UNSEEN - 還沒有被讀取尚未匹配的消息

+2

這將縮小搜索範圍,但會限制返回多少郵件? – 2010-02-01 14:33:42

+0

@Anthony:據我所知,這是唯一可以縮小東西的方法。有一個嗎? – Sarfraz 2010-02-01 14:52:16

+0

要縮小範圍,它是唯一的方法。但是他的標準是我所假設的所有*消息的限制數字,其中'imap_search'沒有提供。有可能是黑客,看我的編輯,讓我知道你的想法。 – 2010-02-01 14:56:55

1

imap_sort可以讓你既排序和過濾器在同一時間

但儘管如此,它不會允許限制的「前20名」就在函數調用。

0

讓這樣解決這個問題:

1.You可能會限制沒有結果的使用,因爲標準 2. Retreive最後幾個回短信E降低了數據不會返回。×15

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

然後在這裏是中檢索的例子在過去的15返回,然後切換向前和向後查看更多結果或older.Note這裏假設你有一個向前按鈕和老年人是設置$ _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天,然後如果其lot.return它由一塊像above.My道歉使用一些laravel輔助類有大塊,一切都好註釋掉的日期。 希望這可以幫助別人!