2010-02-01 16 views
8

Mam skrypt PHP, który pobiera wiadomości ze skrzynki pocztowej. Używam funkcji imap_search: $emails = imap_search($mbox, 'UNSEEN');imap_search ogranicza liczbę zwracanych wiadomości

Czy istnieje sposób na ograniczenie liczby zwracanych wiadomości. W tej chwili na wielkich skrzynkach pocztowych dostaję 5000 wiadomości. Chcę tylko 20 najlepszych zamówionych według daty.

Czy jest jakiś sposób na zrobienie tego?

Dzięki.

Odpowiedz

6

Funkcja imap_search ma KRYTERIA atrybutu można użyć do ograniczenia wiadomości na kilka sposobów:

ALL - zwróci wszystkie wiadomości pasujące do pozostałych kryteriów
odpowiedział - pasuje wiadomości z \ odpowiedział flagą ustawić
BCC „ciąg” - pasuje do wiadomości z „string” w polu UDW:
before „data” - pasuje do wiadomości z dnia: przed „terminem”
ciało „string” - pasuje do wiadomości z „string” w treść wiadomości
CC "ciąg" - dopasowywanie wiadomości z "ciągiem" w polu DW
skreślony - mecz usunięte wiadomości
oflagowane - pasuje wiadomości z \ oflagowane (czasami określane jako ważne lub pilne) flag set
z „string” - Match wiadomości z „string” w polu Od:
KEYWORD "string" - komunikaty mecz z "string" jako słowa kluczowego
nowe - dopasować nowe wiadomości
OLD - pasuje do starych wiadomości
ON "data" - pasuje do wiadomości z dnia: dopasowywanie "data"
OSTATNIE - dopasuj wiadomości z flagą \ RECENT set
SEEN - dopasuj wiadomości tha t zostały odczytane (the \ SEEN flaga jest ustawiona)
ponieważ "data" - pasuje do wiadomości z dnia: po "date"
osobnik "string" - pasuje do wiadomości z "string" w Temat:
TEKST „string "- pasuje do wiadomości z tekstem«ciąg»
do«string»- pasuje do wiadomości z«łańcucha»w celu: bez odpowiedzi - pasuje do wiadomości, które nie zostały wysłuchane
nieusuniętych - wiadomości meczu, które nie zostały usunięte
UNFLAGGED - dopasuj wiadomości niezarejestrowane
"ciąg" UNKEYWORD - dopasuj wiadomości, które nie mają słowa kluczowego "ciąg"
Unseen - mecz wiadomości, które nie zostały jeszcze odczytane

+2

To zawęzi wyszukiwanie, ale czy to ograniczy liczbę wiadomości do zwrotu? –

+0

@Anthony: to jedyny sposób, aby zawęzić to wszystko w inny sposób, o ile wiem. Czy jest jeden? – Sarfraz

+0

Aby go zawęzić, jest to jedyny sposób. Ale jego kryteria to liczba limitów dla, jak zakładam, * wszystkich * wiadomości, których 'imap_search' nie dostarcza. Może być hack, zobacz moją edycję i daj mi znać, co myślisz. –

1

imap_sort pozwoli Ci zarówno sortowanie i filtrowanie w tym samym czasie

Ale nadal to nie pozwoli, aby ograniczyć do „top 20” w prawo wywołanie funkcji.

0

Aby rozwiązać ten problem tak:

1.You może ograniczyć no wyniku zwrócony przez zmniejszenie no danych przy użyciu ponieważ kryteria 2. retreive kilka wiadomości e ostatni zwrócony.g 15

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

I to tutaj jest przykładem dla retreive ostatnie 15 powrócił, a następnie przełączać się w przód iw tył, aby wyświetlić więcej wyników lub older.Note ten zakłada, że ​​masz przycisk do przodu i starsze, które wyróżniają $ _GET zmienne.

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

      } 

Można ustawić datę dostać od do 90 dni wcześniej, jeśli jego lot.return nim fragmencie przez fragmencie jak przeprosiny above.My korzystania istnieje kilka klas laravel pomocnik, wszystko jest dobrze wypowiedziało się. Mam nadzieję, że to pomoże komuś!

Powiązane problemy