PHP IMAP. Остановить сообщения, помеченные как увиденные - PullRequest
0 голосов
/ 04 мая 2018

Я получаю почту Gmail через IMAP. Я устанавливаю параметр FT_PEEK везде, где могу, и, наконец, я даже открыл почтовый ящик только для чтения (OP_READONLY). Тем не менее, мой код помечает сообщения как прочитанные.

Вот код:

class imap{
   CONST HOSTNAME='{imap.gmail.com:993/imap/ssl}INBOX';
   CONST USERNAME = '[Address hidden]';
   CONST PASSWORD = '[Password hidden]'; //App password from Google

   function getMessagesSince($date){
      //This will return a collection of email objects.

      $messages=array();
      if(!$imap=imap_open($this::HOSTNAME, $this::USERNAME, $this::PASSWORD, OP_READONLY)) throw new exception("Unable to connect to IMAP mailbox. ".imap_last_error());

      $since=date_format($date, 'j F Y');

      $emails=imap_search($imap, 'SINCE "'.$since.'"', SE_UID|FT_PEEK);

      foreach($emails as $email){
         $messages[]=$this->getMessage($email, $imap);
      }

      imap_close($imap);

      return $messages;
   }

   private function getMessage($uid, $imap){
      //First get the headers
      $headers=$this->getHeaders($uid, $imap);
      $datereceived=date('Y-m-d H:i:s', strtotime($headers->date));
      $sender=$headers->from[0]->mailbox."@".$headers->from[0]->host;
      $cc=$headers->cc;
      $subject=$headers->subject;

      //Now get the message body
      $message=$this->getBody($uid, $imap);

      $email=new email();
      $email->uid=$uid;
      $email->datereceived=$datereceived;
      $email->sender=$sender;
      $email->cc=$cc;
      $email->subject=$subject;
      $email->message=$message;
      return $email;
   }

   private function getHeaders($uid, $imap){
      //Return an array of headers for the referenced message
      //$overview = imap_fetch_overview($imap, $uid, FT_UID); //As we used the SE_UID flag when searching, we have to use it when fetching.
      //We use this, rather than fetch_overview, because the overview doesn't have the cc information.
      $hText = imap_fetchbody($imap, $uid, '0', FT_UID|FT_PEEK);
      $headers = imap_rfc822_parse_headers($hText);
      return $headers;
   }
   private function getBody($uid, $imap){
      $body = $this->get_part($imap, $uid, "TEXT/HTML");
      // if HTML body is empty, try getting text body
      if ($body == "") {
         $body = $this->get_part($imap, $uid, "TEXT/PLAIN");
      }
      return $body;
   }

   private function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false){
      if (!$structure) {
         $structure = imap_fetchstructure($imap, $uid, FT_UID);
      }
      if ($structure) {
         if ($mimetype == $this->get_mime_type($structure)) {
               if (!$partNumber) {
                  $partNumber = 1;
               }
               $text = imap_fetchbody($imap, $uid, $partNumber, FT_UID|FT_PEEK);
               switch ($structure->encoding) {
                  case 3:
                     return imap_base64($text);
                  case 4:
                     return imap_qprint($text);
                  default:
                     return $text;
               }
         }

         // multipart
         if ($structure->type == 1) {
               foreach ($structure->parts as $index => $subStruct) {
                  $prefix = "";
                  if ($partNumber) {
                     $prefix = $partNumber . ".";
                  }
                  $data = $this->get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
                  if ($data) {
                     return $data;
                  }
               }
         }
      }
      return false;
   }

   private function get_mime_type($structure){
      $primaryMimetype = ["TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"];

      if ($structure->subtype) {
         return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype;
      }
      return "TEXT/PLAIN";
   }
}

Кто-нибудь может заметить то, что мне не хватает?

(Это просто дополнительный текст, потому что он говорит, что сообщение в основном кодовое. Я просто набираю здесь, пока оно не позволяет мне писать.)

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