imap_search ограничивает количество возвращаемых сообщений - PullRequest
8 голосов
/ 01 февраля 2010

У меня есть PHP-скрипт для извлечения сообщений из почтового ящика. Я использую функцию imap_search: $emails = imap_search($mbox, 'UNSEEN');

Есть ли способ ограничить количество возвращаемых сообщений. Прямо сейчас на огромных почтовых ящиках я получаю около 5000 сообщений. Я хочу, чтобы только 20 лучших были упорядочены по дате.

Есть ли способ сделать это?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 01 февраля 2010

Функция imap_search имеет атрибут CRITERIA, который можно использовать для ограничения сообщений несколькими способами:

ALL - вернуть все сообщения, соответствующие остальным критериям
ANSWERED - сопоставлять сообщения с установленным флагом \ ANSWERED
BCC "строка" - сопоставить сообщения с "строкой" в поле СК:
ДО "даты" - сопоставлять сообщения с датой: до "даты"
BODY "string" - сопоставить сообщения с "string" в теле сообщения
CC "строка" - сопоставить сообщения со "строкой" в поле Cc:
УДАЛЕНО - сопоставить удаленные сообщения
FLAGGED - сопоставлять сообщения с установленным флагом \ FLAGGED (иногда называемым Важным или Срочным)
FROM "string" - сопоставить сообщения с "string" в поле From:
КЛЮЧЕВОЕ СЛОВО "строка" - сопоставить сообщения с "строкой" в качестве ключевого слова
NEW - совпадать с новыми сообщениями
СТАРЫЙ - совпадать со старыми сообщениями
ON «дата» - сопоставлять сообщения с датой: соответствует «дате»
RECENT - сопоставлять сообщения с установленным флагом \ RECENT
SEEN - сопоставить прочитанные сообщения (установлен флаг \ SEEN)
ПОСЛЕ «даты» - сопоставлять сообщения с датой: после «даты»
SUBJECT "строка" - сопоставить сообщения с "строкой" в теме:
ТЕКСТ "строка" - сопоставить сообщения с текстом "строка"
TO "string" - сопоставить сообщения с "string" в To: UNANSWERED - совпадать с сообщениями, на которые нет ответа
UNDELETED - сопоставить сообщения, которые не были удалены
UNFLAGGED - сопоставлять сообщения, которые не помечены
UNKEYWORD "string" - сопоставить сообщения, в которых нет ключевого слова "string"
UNSEEN - сопоставлять сообщения, которые еще не были прочитаны

1 голос
/ 05 февраля 2010

imap_sort позволит вам одновременно сортировать и фильтровать

Но, тем не менее, он не позволит ограничиться «топ-20» прямо при вызове функции.

0 голосов
/ 05 апреля 2019

imap_search документы указывают на эту функцию:

Возвращает массив номеров сообщений или UID.

imap_fetch_overview документы указывают, что эта функция также возвращает:

message_id - ID сообщения, uid - UID сообщения в почтовом ящике

Таким образом, мы можем использовать imap_fetch_overview и отсортировать определенное число и порядок с тем же возвратом, что и функция imap_search.

// get information about the current mailbox
$mboxCheck = imap_check($mbox);

// get the total amount of messages
$totalMessages = $mboxCheck->Nmsgs;

// select how many messages you want to see
$showMessages = 20;

// get those messages    
$result = imap_fetch_overview($mbox($totalMessages-$showMessages+1).":".$totalMessages);

$n = 0;
$emails = array();
// loop through returned messages, collect message numbers in same format as output of imap_search
foreach ($result as $mail) {
    $emails[$n] = $mail->msgno;
    $n++;
}  

if($emails) {
// put the newest emails on top 
rsort($emails);
}

Это построено с концепцией от этот ответ

0 голосов
/ 27 августа 2015

Чтобы решить эту проблему так:

1.Вы можете ограничить количество возвращаемых результатов, уменьшив количество данных, используя критерии с 2. Получить несколько последних возвращенных сообщений, например, 15

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

А затем приведен пример получения последних 15 возвращенных значений, а затем переключение вперед и назад для просмотра большего количества результатов или более старых. Обратите внимание, что предполагается, что у вас есть кнопка «вперед» и старше, которая устанавливает переменные $ _GET.

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

            }

Вы можете установить дату, с которой он будет получен, на 90 дней раньше, если его много. Возвратите его по частям, как описано выше. Мои извинения за использование некоторых вспомогательных классов Laravel, все хорошо закомментировано. Надеюсь, это кому-нибудь поможет!

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