我正在尝试从Imap Server(Gmail)中读取邮件。我会检查是否有新邮件(看不见)并查看它。 我写了这段代码但是
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";
}
非常感谢你。
答案 0 :(得分:12)
我认为问题在于您已经硬编码的“1”。我用“
”替换了“1”foreach ($result as $mail) {
$status = imap_setflag_full($mbox, $mail, "\\Seen \\Flagged", ST_UID);
}
它似乎有效。使用ST_UID时,这实际上意味着ID,而不是序列号。
答案 1 :(得分:3)
我不知道上述答案是如何起作用的,人们正在投票给出答案。 我整天都在那个答案上浪费了。
最后我得到了真正的解决方案。这很有效。我只是设置未读电子邮件来阅读电子邮件。
<?php
// Connect to gmail
$imapPath = '{imap.gmail.com:993/imap/ssl}INBOX';
//$imapPath = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$username = 'Your-email@gmail.com';
$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);
?>