Библиотека PHP IMAP - получение ограниченного списка сообщений из почтового ящика - PullRequest
2 голосов
/ 29 сентября 2010

Я использую встроенные в PHP функции IMAP для создания простого клиента веб-почты (в основном будет использоваться для доступа к учетным записям gmail). В настоящее время я столкнулся с дорожным блоком в представлениях списка почтовых ящиков, где я показываю разбитый на страницы список сообщений в этом почтовом ящике, отсортированный по дате (по возрастанию или по убыванию).

Моя первоначальная реализация извлекла ВСЕ сообщения из почтового ящика с помощью imap_headers () и отсортировала этот массив на основе даты, а затем вернула сегмент массива, который соответствует текущей странице списка, которую пользователь хотел просмотреть. Это работало нормально для почтовых ящиков с небольшим количеством сообщений, но производительность значительно снизилась с ростом размера почтового ящика (для почтового ящика с ~ 600 сообщениями время выполнения составляло в среднем около 10 секунд). А для некоторых пользователей этого клиента 600 сообщений - это небольшое число для почтового ящика, а некоторые из них могут легко содержать от 5 до 10 тысяч сообщений в папке «Входящие».

Таким образом, моя вторая проблема в том, что вместо того, чтобы извлекать заголовки для всех сообщений в почтовом ящике, я получил общее количество сообщений с помощью imap_num_msg () и, используя это число, я создал цикл for, где счетчик цикла используется в качестве номера сообщения. и для каждой итерации я вызываю imap_headerinfo () с этим номером сообщения.

Это работает лучше, однако у меня сложилось впечатление, что номер сообщения напрямую соответствовал моменту получения этого сообщения, поэтому сообщение нет. 1 было самым старым сообщением, а число, возвращаемое imap_num_msg (), было номером самого нового сообщения. Таким образом, используя это, я все еще мог обеспечить сортировку по дате в моем разбитом на страницы списке. Но после тестирования кажется, что номер сообщения не соответствует полученной дате, и на самом деле я понятия не имею, как они назначены.

Любая помощь или направление будет принята с благодарностью.

1 Ответ

1 голос
/ 16 октября 2010

Я играл с этим, и вот несколько примеров того, что я делаю, нумерация страниц работает хорошо, получая только несколько писем на страницу. Я не буду вставлять весь код, только основные части. надеюсь, это поможет:)

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

....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...