2010-02-01 9 views
8

J'ai un script PHP qui récupère les messages d'une boîte aux lettres. J'utilise la fonction imap_search: $emails = imap_search($mbox, 'UNSEEN');imap_search limiter le nombre de messages retournés

Y at-il un moyen de limiter le nombre de messages retournés. En ce moment sur les énormes boîtes aux lettres, je reçois comme 5000 messages. Je veux seulement le top 20 commandé par date.

Y a-t-il un moyen de faire cela?

Merci.

Répondre

6

La fonction imap_search a un critère attribut vous pouvez utiliser pour limiter les messages de plusieurs façons:

ALL - retourner tous les messages correspondant au reste des critères
ANSWERED - tous les messages avec le drapeau \ Answered mettre
BCC "string" - tous les messages avec "string" dans le champ Cci
aVANT "date" - tous les messages avec Date: avant "date"
BODY "string" - tous les messages avec "string" dans le corps du message
CC "chaîne" - faire correspondre les messages avec "chaîne" dans le champ Cc:
SUPPRIME - Match messages supprimés
FLAGGED - messages avec le \ Flagged (parfois appelée Important ou Urgent) Drapeau mis
FROM "string" - tous les messages avec "string" dans le champ From:
KEYWORD "string" - tous les messages avec "string" comme mot clé
NEW - nouveaux messages
OLD - anciens messages
ON "date" - tous les messages avec la date "date"
RECENT - faire correspondre les messages avec le jeu d'indicateurs \ RECENT
SEEN - messages de correspondance tha t ont été lus (le marqueur \ SEEN)
DEPUIS "date" - les messages avec Date: après "date" "string"
SUJET - les messages avec "string" dans le sujet:
TEXTE « string "- tous les messages avec le texte "string"
TO "string" - tous les messages avec "string" dans le champ A: UNANSWERED - tous les messages qui ne sont pas répondues
UNDELETED - tous les messages qui ne sont pas supprimés
UNFLAGGED - faire correspondre les messages qui ne sont pas marqués
UNKEYWORD "chaîne" - faire correspondre les messages qui n'ont pas le mot-clé "chaîne"
INVISIBLES - tous les messages qui ne sont pas encore lu

+2

Cela limitera la recherche, mais cela limitera-t-il la quantité de courrier à retourner? –

+0

@Anthony: c'est la seule façon d'affiner les choses un peu plus loin que je le sache. Est-ce qu'il y a un? – Sarfraz

+0

Pour l'affiner, c'est le seul moyen. Mais son critère est un nombre limite pour, ce que je suppose être, * tous * les messages, que 'imap_search' ne fournit pas. Il pourrait y avoir un hack, voir ma modification et laissez-moi savoir ce que vous pensez. –

1

imap_sort vous permettra à la fois tri et de filtrage en même temps

Mais encore, il ne permettra pas de limiter le « top 20 » à droite l'appel de fonction.

0

Pour résoudre ce problème, donc:

1.You pourrait limiter le pas de résultat retourné en réduisant le pas de données en utilisant les critères depuis 2. retreive quelques derniers messages retournés e.g 15

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

Et voici un exemple pour récupérer les 15 derniers retourné puis basculer vers l'avant et vers l'arrière pour voir plus de résultats ou older.Note ceci suppose que un bouton vers l'avant et plus que défini _GET variables $.

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

      } 

Vous pouvez définir la date de se être 90 jours avant cette date si son un lot.return ce morceau par morceau comme excuses above.My pour l'utilisation de certaines classes d'aide de Laravel là, tout est bien commenté. Espérons que cela aide quelqu'un!

Questions connexes