php - PHP IMAP库从邮箱检索有限的邮件列表

  显示原文与译文双语对照的内容
0 0

我使用在IMAP函数中构建的php来构建一个裸的webmail客户端( 主要用于访问gmail帐户) 。 我现在在邮箱列表视图中点击了一条路,其中显示了一个分页的邮件列表,该列表按日期( 升序或者降序) 排序。

我的初始邮箱实现检索所有的消息与 imap_headers() array 根据日期排序,然后返回段的array 对应于当前页面的用户想查看列表。 这对具有少量消息的邮箱进行了工作,但是随着邮箱大小的增加,( 对于带有 ~600 消息的邮箱,执行时间大约在 10秒左右)的性能大大降低。 对于这个客户端的一些用户来说,600个消息对于邮箱来说是一个小的数字,在他们的收件箱中,5和上的消息。

所以我的第二个问题是,不为邮箱中的所有邮件检索邮件头,我得到了 imap_num_msg()的消息总数,并使用该数字循环计数器作为消息编号。 对于每次迭代我都用这个消息号调用 imap_headerinfo() 。

这效果更好,但是我在印象中,消息号码与接收到的消息直接对应,所以消息没有被接收到。 1是最早的消息,imap_num_msg() 返回的数字是最新消息的消息号。 因此,使用该选项仍然可以在已经分页的列表中按日期提供排序。 但是经过测试之后,似乎消息号与接收到的日期不一致,实际上我不知道它们是如何被分配的。

任何帮助或者方向都会非常感激。

时间: 原作者:

0 0

我一直在玩这个,这里有一些我正在做的事情,分页工作很好,每页只有几封邮件。 我不会粘贴所有代码,只是主要部分。 希望能有帮助: )


//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 上面 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;

原作者:
...