2010-02-01 2 views
8

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

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

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

Спасибо.

ответ

6

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

ALL - возвращать все сообщения, соответствующие остальные критерии
ОТВЕТИЛ - совпадать с сообщениями с \ ANSWERED флага набор
BCC «строка» - совпадать с сообщениями с «строка» в Bcc: поле
ДО «дата» - совпадать с сообщениями с Date: перед «датой»
ТЕЛА «строка» - совпадать с сообщениями с «строка» в тело сообщения
CC «строка» - сопоставление сообщений с «строкой» в Копия: поле
УДАЛИТЬ - матч удаленных сообщений
FLAGGED - совпадать с сообщениями с \ FLAGGED (иногда упоминается как важные или срочные) флаг установлен
FROM «строка» - совпадать с сообщениями с «строка» в поле От:
СЛОВО «строка» - совпадать с сообщениями с «строка» в качестве ключевого слова
NEW - сопрягать новые сообщения
OLD - сопрягать старые сообщения
ON «дата» - совпадать с сообщениями с датой: соответствие «дата»
ПОСЛЕДНЕЕ - совпадающие сообщения с установленным флагом \ RECENT
SEEN - сообщения соответствия tha т был считан (увиденный флаг \ установлен)
SINCE «дата» - совпадать с сообщениями с датой: после того, как «дата» «строка»
ПРЕДМЕТА - совпадать с сообщениями с «строкой» в теме:
TEXT «строки "- совпадать с сообщениями с текстом„строкой“
TO„строка“- ​​совпадать с сообщениями с„строкой“в To: без ответа - совпадать с сообщениями, которые не ответили
Восстановлены - матч сообщение, которые не удаляются
UNFLAGGED - совпадающие сообщения, которые не помечены
UNKEYWORD "string" - сопоставить сообщения, которые не имеют ключевое слово "string"
UNSEEN - совпадать с сообщениями, которые еще не читали

+2

Это сузило бы поиск, но это ограничит количество почты, чтобы вернуться назад? –

+0

@ Энтони: это единственный способ сузить материал немного другим способом, насколько я знаю. Есть ли это? – Sarfraz

+0

Чтобы сузить его, это единственный способ. Но его критерии - это предельное число, для которого я предполагаю, * все * сообщения, которые 'imap_search' не предоставляет. Там может быть взлома, см. Мое редактирование и дайте мне знать, что вы думаете. –

1

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

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

0

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

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

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

А потом вот пример, чтобы извлечь последний 15 вернулся, а затем переключаться вперед и назад, чтобы посмотреть больше результатов или older.Note это предполагает, что у вас есть кнопка вперед и старше, которые устанавливают $ _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 дней до этого, если его lot.return так ли куска по куску, как above.My извинения за использование некоторых Laravel вспомогательных классов, там, все хорошо закомментировано. Надеюсь, это поможет кому-то!

Смежные вопросы