2010-09-29 7 views
2

J'utilise les fonctions IMAP intégrées de PHP pour créer un client webmail strict (qui sera principalement utilisé pour accéder aux comptes gmail). J'ai actuellement frappé un bloc de route dans les affichages de liste de boîte aux lettres, où j'affiche une liste paginée des messages dans cette boîte aux lettres triée par date (ascendant ou descendant). Mon implémentation initiale récupérait TOUS les messages de la boîte aux lettres avec imap_headers() et triait ce tableau en fonction de la date, puis retournait le segment du tableau qui correspondait à la page courante de la liste que l'utilisateur voulait voir. Cela fonctionnait bien pour les boîtes aux lettres avec un petit nombre de messages, mais les performances diminuaient considérablement à mesure que la taille de la boîte aux lettres augmentait (pour une boîte aux lettres avec ~ 600 messages, la durée d'exécution était en moyenne de 10 secondes). Et pour certains des utilisateurs de ce client, 600 messages sont un petit nombre pour une boîte aux lettres, avec certains facilement entre 5 et 10 mille messages dans leur boîte de réception. Donc mon deuxième coup au problème était au lieu de récupérer les en-têtes pour tous les messages dans la boîte aux lettres, j'ai obtenu le nombre total de messages avec imap_num_msg() et en utilisant ce nombre j'ai construit une boucle for, où le compteur de boucle est utilisé comme numéro de message. et pour chaque itération j'appelle imap_headerinfo() avec ce numéro de message.Bibliothèque PHP IMAP - Récupération d'une liste limitée de messages d'une boîte aux lettres

Cela fonctionne mieux, mais j'avais l'impression que le numéro de message correspondait directement à quand ce message a été reçu, alors le message no. 1 était le message le plus ancien et le numéro renvoyé par imap_num_msg() était le numéro de message du message le plus récent. Donc, en utilisant cela, je pourrais toujours fournir le tri par date dans ma liste paginée. Mais après le test, il semble que le numéro de message ne correspond pas à la date de réception, et vraiment je n'ai aucune idée de comment ils sont assignés.

Toute aide ou direction serait grandement appréciée.

Répondre

1

J'ai joué avec ceci et voici quelques coupures de ce que je fais, la pagination fonctionne très bien avec seulement quelques mails par page. Je ne vais pas coller tout le code, juste les parties principales. Espérons que cela aide :)

// main method to get the mails __getFormattedBasics() just calls imap_hearderinfo() loop runs backwards by default to get newest first 
private function __getMails($Model, $query) { 
      $pagination = $this->_figurePagination($query); 

      $mails = array(); 
      for ($i = $pagination['start']; $i > $pagination['end']; $i--) { 
       $mails[] = $this->__getFormattedBasics($Model, $i); 
      } 

      unset($mail); 

      return $mails; 
     } 

// this just uses the current page number, limit per page and figures the start/end for the loop above you can sort in the other direction passing asc/desc 
protected function _figurePagination($query) { 
      $count = $this->_mailCount($query); // total mails 
      $pages = ceil($count/$query['limit']); // total pages 
      $query['page'] = $query['page'] <= $pages ? $query['page'] : $pages; // dont let the page be more than available pages 

      $return = array(
       'start' => $query['page'] == 1 
        ? $count // start at the end 
        : ($pages - $query['page'] + 1) * $query['limit'], // start at the end - x pages 
      ); 

      $return['end'] = $query['limit'] >= $count 
       ? 0 
       : $return['start'] - $query['limit']; 

      $return['end'] = $return['end'] >= 0 ? $return['end'] : 0; 

      if (isset($query['order']['date']) && $query['order']['date'] == 'asc') { 
       return array(
        'start' => $return['end'], 
        'end' => $return['start'], 
       ); 
      } 

      return $return; 
     } 

    private function __getFormattedBasics($Model, $message_id) { 
     $mail = imap_headerinfo($this->MailServer, $message_id); 
     $structure = imap_fetchstructure($this->MailServer, $mail->Msgno); 

     $toName = isset($mail->to[0]->personal) ? $mail->to[0]->personal : $mail->to[0]->mailbox; 
     $fromName = isset($mail->from[0]->personal) ? $mail->from[0]->personal : $mail->from[0]->mailbox; 
     $replyToName = isset($mail->reply_to[0]->personal) ? $mail->reply_to[0]->personal : $mail->reply_to[0]->mailbox; 

....

Questions connexes