2010-02-01 3 views
8

Ich habe PHP-Skript, die Nachrichten aus einem Postfach abrufen. Ich verwende die Funktion imap_search: $emails = imap_search($mbox, 'UNSEEN');imap_search begrenzen die Anzahl der Nachrichten

Gibt es eine Möglichkeit, die Anzahl der zurückgegebenen Nachrichten zu begrenzen. Gerade jetzt auf riesigen Postfächern bekomme ich wie 5000 Nachrichten. Ich möchte nur die Top 20 nach Datum sortiert haben.

Gibt es eine Möglichkeit, das zu tun?

Danke.

Antwort

6

Die imap_search Funktion hat ein Kriterium Attribut können Sie die Nachrichten in einer Reihe von Möglichkeiten zu begrenzen verwenden:

ALL - Rückkehr aller Nachrichten passend zum Rest der Kriterien
BEANTWORTET - entsprechen Nachrichten mit der \ BEANTWORTET Flagge set
BCC "string" - Nachrichten mit "string" in der Bcc: Feld
BEFORE "date" - sucht Nachrichten mit Datum: vor "Datum"
BODY "string" - Nachrichten mit "string" in der Nachrichtentext
CC "string" - Nachrichten mit "string" in Übereinstimmung bringen das Feld Cc:
GESTRICHEN - Spiel Nachrichten gelöscht
Gemeldet - Match-Nachrichten mit der \ Gemeldet (manchmal als wichtig oder dringend bezeichnet) flag
FROM „string“ gesetzt - Nachricht enthält „string“ im Feld Von:
STICHWORT "string" - Nachricht enthält "string" als Schlüsselwort
nEU - passen alte Nachrichten
ON "Datum" - -
OLD neuen Nachrichten entsprechen übereinstimmen Nachrichten mit Datum: matching "Datum"
LETZTEN - Übereinstimmungen mit dem \ RECENT-Flag setzen
GESEHEN - Nachrichten übereinstimmen tha t gelesen worden sind (die \ SEEN Flag gesetzt ist)
DA "date" - sucht Nachrichten mit Datum: nach "Datum"
SUBJECT "string" - Nachrichten mit "string" im Betreff:
TEXT „string "- passen Nachrichten mit Text "string"
TO "string" - Nachrichten mit "string" in der To: UNANSWERED - Match-Nachrichten, die nicht beantwortet wurden
UNDELETED - Nachrichten, die nicht gelöscht werden
UNFLAGGED - Übereinstimmungsnachrichten, die nicht markiert sind
UNKEYWORD "Zeichenfolge" - Übereinstimmungen, die das Schlüsselwort "Zeichenfolge" nicht enthalten
UNSEEN - Spiel Nachrichten, die bisher noch nicht

+2

Das wird die Suche eingrenzen, aber wird das begrenzen, wie viel Post zurückgeben? –

+0

@Anthony: das ist der einzige Weg, um das Zeug ein bisschen anders einzugrenzen, soweit ich weiß. Ist dort eines? – Sarfraz

+0

Um es zu verengen, ist es der einzige Weg. Aber sein Kriterium ist eine Grenzzahl für, was ich annehmen werde, * alle * Nachrichten, die "imap_search" nicht bietet. Es könnte einen Hack geben, sehe meine Bearbeitung und lass mich wissen, was du denkst. –

1

imap_sort Sie können sowohl Sortier- und Filter zugleich

Aber noch gelesen haben, wird es nicht zulassen, dass Recht auf die ‚Top 20‘ begrenzen auf der Funktionsaufruf.

0

Um dieses Problem zu lösen, indem so:

1.You die seit Kriterien 2. Retreive wenig zurück Nachrichten e zuletzt die Anzahl des zurückgegebene Ergebnisses durch die Reduzierung der Anzahl der Daten unter Verwendung einschränken könnte.15 g

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

Und dann ist hier ein Beispiel der letzten 15 zurückgeführt und dann retreive wechseln vorwärts und rückwärts mehr Ergebnisse anzuzeigen oder older.Note dies voraus, dass Sie eine Taste nach vorne haben und älter, die $ _GET Variablen gesetzt.

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

      } 

könnten Sie das Datum aus erhalten 90 Tage dauern, bis dann, wenn es ein lot.return es durch Brocken Brocken wie above.My Entschuldigungen für dort einige Laravel Helfer-Klassen, ist alles gut kommentiert werden. Hoffe das hilft jemandem!