2010-02-01 31 views
8

Tôi có tập lệnh PHP tìm nạp thư từ hộp thư. Tôi sử dụng hàm imap_search: $emails = imap_search($mbox, 'UNSEEN');imap_search giới hạn số lượng thư trả lại

Có cách nào giới hạn số lượng thư trả về không. Ngay bây giờ trên hộp thư lớn tôi nhận được như 5000 tin nhắn. Tôi chỉ muốn 20 người đứng đầu được sắp xếp theo ngày.

Có cách nào để làm điều đó không?

Cảm ơn.

Trả lời

6

Chức năng imap_search có thuộc tính một tiêu chí mà bạn có thể sử dụng để hạn chế các tin nhắn trong một số cách:

ALL - trả lại tất cả các thông điệp phù hợp với phần còn lại của tiêu chí
TRẢ LỜI - phù hợp với các thông điệp với cờ \ TRẢ LỜI thiết lập
BCC "chuỗi" - thông báo trùng khớp với "chuỗi" trong trường Bcc:
TRƯỚC KHI "ngày" - khớp thông báo với Ngày: trước "ngày"
BODY "string" - khớp thông điệp với "chuỗi" trong nội dung của thông báo
"Chuỗi" CC - khớp các thông điệp có "chuỗi" trong Cc: Trường
xóa - trận đấu xóa thông điệp
gắn cờ - phù hợp với các thông điệp với \ FLAGGED (đôi khi được gọi là quan trọng hoặc khẩn cấp) cờ thiết
TỪ "string" - phù hợp với tin nhắn với "chuỗi" trong ô From:
KEYWORD "chuỗi" - thông điệp phù hợp với "chuỗi" như một từ khóa
mỚI - phù hợp với thông điệp mới
OLD - phù hợp với thông điệp cũ
ON "hẹn hò" - phù hợp với các thông điệp với ngày: phù hợp với "ngày"
GẦN ĐÂY - thông điệp phù hợp với cờ \ RECENT đặt
SEEN - thông điệp trùng khớp tha t đã được đọc (cờ \ SEEN được đặt)
SINCE "ngày" - thông báo trùng khớp với Ngày: sau "ngày"
SUBJECT "chuỗi" - khớp thông điệp với "chuỗi" trong chuỗi Chủ đề:
TEXT " "- phù hợp với tin nhắn với nội dung 'chuỗi'
đẾN 'string' - phù hợp với tin nhắn với 'chuỗi' trong To: chưa được trả lời - phù hợp với thông điệp mà chưa được trả lời
mới phục hồi - thông điệp phù hợp mà không bị xóa
không gắn cờ - đối sánh các thư không bị gắn cờ
UNKEYWORD "chuỗi" - đối sánh các thư không có từ khóa "chuỗi"
vô hình - thông điệp phù hợp mà chưa được đọc chưa

+2

Điều đó sẽ thu hẹp tìm kiếm, nhưng điều đó có hạn chế số lượng thư cần trả lại không? –

+0

@Anthony: đây là cách duy nhất để thu hẹp nội dung một chút không có cách nào khác theo như tôi biết. Có cái nào không? – Sarfraz

+0

Để thu hẹp nó xuống, đó là cách duy nhất. Nhưng tiêu chí của anh ta là một số giới hạn, những gì tôi giả định là, * tất cả * tin nhắn, mà 'imap_search' không cung cấp. Có thể có một hack, xem chỉnh sửa của tôi và cho tôi biết những gì bạn nghĩ. –

1

imap_sort sẽ cho phép bạn để cả hai sắp xếp và lọc cùng một lúc

Nhưng vẫn còn, nó sẽ không cho phép để hạn chế đến 'top 20' ngay tại cuộc gọi hàm.

0

Để giải quyết vấn đề này bằng cách như vậy:

1.You có thể giới hạn không của kết quả trả về bằng cách giảm không dữ liệu bằng cách sử dụng các thông điệp từ tiêu chí 2. truy xuất vài trở cuối cùng e.g 15

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

Và sau đó ở đây là một ví dụ để truy xuất cuối cùng 15 trở lại và sau đó chuyển về phía trước và lạc hậu để xem thêm kết quả hoặc older.Note này giả sử bạn có một nút chuyển tiếp trở lên mà đặt $ _GET biến.

$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; 

      } 

Bạn có thể thiết lập ngày nó nhận được từ là 90 ngày trước khi sau đó nếu một mình lot.return nó đoạn bởi đoạn như lời xin lỗi above.My cho việc sử dụng một số lớp laravel helper đó, tất cả được cũng nhận xét ra. Hy vọng điều này sẽ giúp ai đó!

Các vấn đề liên quan