PHP: imap_search / imap_fetch_overview на основе uid для нумерации страниц, такой как Gmail Webmail - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу добиться того же, что и веб-почтовый клиент gmail: показать последние, например. 50 входящих сообщений с использованием imap_fetch_overview и возможностью разбиения на страницы. Я нашел этот старый пост 2012 года о stackoverflow, который говорит, что это невозможно с uid, только с обходным решением, которое будет слишком медленным.

Я использовал следующий фрагмент кода от php. net

Вот функция для получения сообщений из IMAP и сортировки их для нумерации страниц.

public function listMessages($page = 1, $per_page = 25, $sort = null) {
        $limit = ($per_page * $page);
        $start = ($limit - $per_page) + 1;
        $start = ($start < 1) ? 1 : $start;
        $limit = (($limit - $start) != ($per_page-1)) ? ($start + ($per_page-1)) : $limit;
        $info = imap_check($this->_imap_stream);
        $limit = ($info->Nmsgs < $limit) ? $info->Nmsgs : $limit;

        if(true === is_array($sort)) {
            $sorting = array(
                        'direction' => array(   'asc' => 0,
                                                'desc' => 1),

                        'by'        => array(   'date' => SORTDATE,
                                                'arrival' => SORTARRIVAL,
                                                'from' => SORTFROM,
                                                'subject' => SORTSUBJECT,
                                                'size' => SORTSIZE));
            $by = (true === is_int($by = $sorting['by'][$sort[0]]))
                            ? $by
                            : $sorting['by']['date'];
            $direction = (true === is_int($direction = $sorting['direction'][$sort[1]]))
                            ? $direction
                            : $sorting['direction']['desc'];

            $sorted = imap_sort($this->_imap_stream, $by, $direction);

            $msgs = array_chunk($sorted, $per_page);
            $msgs = $msgs[$page-1];
        }
        else
            $msgs = range($start, $limit); //just to keep it consistent

        $result = imap_fetch_overview($this->_imap_stream, implode($msgs, ','), 0);
        if(false === is_array($result)) return false;

        //sorting!
        if(true === is_array($sorted)) {
            $tmp_result = array();
            foreach($result as $r)
                $tmp_result[$r->msgno] = $r;

            $result = array();
            foreach($msgs as $msgno) {
                $result[] = $tmp_result[$msgno];
            }
        }

        $return = array('res' => $result,
                        'start' => $start,
                        'limit' => $limit,
                        'sorting' => array('by' => $sort[0], 'direction' => $sort[1]),
                        'total' => imap_num_msg($this->_imap_stream));
        $return['pages'] = ceil($return['total'] / $per_page);
        return $return;
    }

Работает хорошо, но при сортировке по последним сообщений (date des c), это займет очень много времени - похоже, он запрашивает / сортирует весь почтовый ящик.

Я обнаружил, что вы можете использовать imap_search, используя SINCE и BEFORE для выбора определенного диапазона дат, но он не оптимален для нумерации страниц. Я ищу что-то вроде imap_search, используя uid, чтобы я мог использовать нумерацию страниц. Есть ли быстрое решение?

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