2010-02-01 26 views
8

Tengo un script PHP que recupera los mensajes de un buzón. Uso la función imap_search: $emails = imap_search($mbox, 'UNSEEN');imap_search limitar el número de mensajes devueltos

¿Hay alguna manera de limitar el número de mensajes devueltos? En este momento en enormes buzones, recibo 5000 mensajes. Solo quiero los 20 mejores ordenados por fecha.

¿Hay alguna manera de hacerlo?

Gracias.

Respuesta

6

La función imap_search tiene una CRITERIOS atributo se puede utilizar para limitar los mensajes de varias maneras:

ALL - devolver todos los mensajes que coinciden con el resto de los criterios
respondió - busca mensajes con la bandera \ ANSWERED establecer
BCC "string" - busca mensajes con "cadena" en el campo CCO:
aNTES "fecha" - busca mensajes con fecha: antes de "fecha"
CUERPO "string" - busca mensajes con "cadena" en el cuerpo del mensaje
CC "cadena" - unir mensajes con "cadena" en el campo Cc:
BORRADO - Partido de mensajes eliminados
Marcados - busca mensajes con el \ marcados (a veces referido como importantes o urgentes) con una bandera
DE "string" - busca mensajes con "cadena" en el campo De:
pALABRA cLAVE "string" - busca mensajes con "cadena" como palabra clave
NUEVO - coincide con los mensajes nuevos
vIEJO - busca mensajes viejos
eN "fecha" - busca mensajes con fecha: "fecha" coincidencia
RECIENTE - emparejar mensajes con el indicador \ RECENT establecido
VISTO - coincide con los mensajes tha t haber sido leído (la bandera \ VE está establecido)
DESDE "fecha" - coincide con los mensajes con fecha: después de "fecha" "cadena"
SUJETO - busca mensajes con "cadena" en el Asunto:
TEXT "string "- busca mensajes con el texto 'cadena'
a 'string' - busca mensajes con 'cadena' en el campo Para: sIN RESPUESTA - busca mensajes que no han sido contestadas
no borrados - busca mensajes que no se eliminan
sin bandera - coinciden los mensajes que no están marcados
UNKEYWORD "cadena" - coincide con los mensajes que no tienen la palabra clave "cadena"
UNSEEN - busca mensajes que no se han leído todavía

+2

Eso limitará la búsqueda, pero ¿eso limitará la cantidad de correo a devolver? –

+0

@Anthony: esta es la única forma de reducir un poco las cosas de otra manera, hasta donde yo sé. ¿Hay alguno? – Sarfraz

+0

Para reducirlo, es la única manera. Pero su criterio es un número límite para, lo que estoy asumiendo que son, * todos * mensajes, que 'imap_search' no proporciona. Puede haber un truco, ver mi edición y dejarme saber lo que piensas. –

1

imap_sort te permitirá ordenar y filtrar tanto, al mismo tiempo

Pero aún así, no permitirán a limitar a la 'top 20' a la derecha en la llamada a la función.

0

Para resolver este problema por lo que:

1.You podría limitar el no de resultado devuelto por la reducción del nº de datos a través de los mensajes ya que los criterios 2. retreive pocos última regresaron e.g 15

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

Y entonces aquí es un ejemplo posible recuperar los últimos 15 regresaron y luego alternar hacia delante y hacia atrás para ver más resultados o older.Note esto supone que tiene un botón de avance y mayores que establece $ _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; 

      } 

También podemos establecer la fecha en que recibe de ser 90 días antes de esa fecha si es un lot.return que pedazo a pedazo, como disculpas above.My para el uso de algunas clases de ayuda laravel allí, todo está bien comentada. Espero que esto ayude a alguien!

Cuestiones relacionadas