Search code examples
phpemailgmailimap

Set an email as SEEN on IMAP server


I am trying to read mail from an Imap Server (Gmail). I would check if there are new mail (unseen) and check it as seen. I wrote this code but

imap_setflag_full

seems to not work. If I have a new mail the script is unable to put the SEEN flag and it echo me that there is always one unseen mail.

  $mbox=imap_open( "{imap.gmail.com:993/ssl/novalidate-cert}" , $this->username, $this->password);
    if ($mbox) 
            {  echo "Connected\n<br><br>"; 
            }  else { exit ("Can't connect: " . imap_last_error() ."\n");  echo "FAIL!\n";  }; 

        if ($hdr = imap_check($mbox)) {
          $msgCount = $hdr->Nmsgs;
          echo "There are ".$msgCount." mail";
        } else {
          echo "Failed to get mail";

        }

        $result = imap_search($mbox, 'UNSEEN');
        echo "<br>Result: ";
        print_r($result);
        if($result==false)
            echo "No email";
        else{
            echo "you have mail"; 
            echo("<br>now I set the Seen flag for this mail");
            rsort($result);
            $status = imap_setflag_full($mbox, "1", "\\Seen \\Flagged", ST_UID);      
        }

        echo"<br><br>";


        $result = imap_search($mbox, 'UNSEEN');
        echo "<br>Result: ";
        print_r($result);
        if($result==false)
            echo "no mail";
        else{
            echo "there are still"; 

        }

Thank you so much.


Solution

  • I think the problem is with the "1" you have hardcoded. I replaced the "1" with:

    foreach ($result as $mail) {
        $status = imap_setflag_full($mbox, $mail, "\\Seen \\Flagged", ST_UID);
    }
    

    and it seems to work. When using ST_UID, this means actually an ID, and not a sequence number.