2011-07-20 108 views
4

我正在嘗試從Imap服務器(Gmail)讀取郵件。我會檢查是否有新郵件(看不見),並檢查它看到。 我寫了這段代碼,但是在IMAP服務器上設置電子郵件爲SEEN

imap_setflag_full 

好像不行。 如果我有一封新郵件,腳本無法放入SEEN標誌,並且它迴應我總是有一封看不見的郵件。

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

     } 

非常感謝。

回答

9

我認爲問題出在硬編碼的「1」上。我用「012」替換了「1」:

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

它似乎工作。當使用ST_UID時,這實際上意味着一個ID,而不是一個序列號。

+0

要返回UID而不是序列號,請使用** SE_UID **選項。 – Matthew

3

我不知道上面的答案是如何工作的,人們投票答案。 我在這個答案上浪費了我整整一天的時間。

最後我得到了真正的解決方案。這是行得通的。我只是設置未讀電子郵件來閱讀電子郵件。

<?php 
// Connect to gmail 
$imapPath = '{imap.gmail.com:993/imap/ssl}INBOX'; 
//$imapPath = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX'; 
$username = '[email protected]'; 
$password = 'Your-Password'; 
$email_read = 'UNSEEN'; 

// try to connect 
$inbox = imap_open($imapPath,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); 

$emails = imap_search($inbox,$email_read); 
$ids = array(); 
foreach($emails as $key => $mail) { 
    $ids [] = $mail; 

    // Do here whatever you want. 
} 

// Setting flag from un-seen email to seen on emails ID. 
imap_setflag_full($inbox,implode(",", $ids), "\\Seen \\Flagged"); //IMPORTANT 

// colse the connection 
imap_expunge($inbox); 
imap_close($inbox); 

?> 
相關問題