我正在使用使用 zend_mail_storage_imap 扩展的 zend 邮件,并且我构建了一个在用户电子邮件中查找关键字的应用程序。
问题是它会打开每封电子邮件并将其标记为已读。有没有办法检查电子邮件的正文,而不是将每封检查的邮件标记为已读?
这是当前的工作代码。它是自动查看某人收件箱的 ajax 查询的一部分。在这种当前形式中,它将以用户的最新邮件开头的每封邮件标记为已读(在 gmail 中)。是否可以检查正文,但不能将电子邮件标记为已读。或者,我是否需要在查找每封邮件之前检查它是已读还是未读,然后将其恢复到该状态作为解决方法?
if (strpos(htmlentities($storage->getMessage($i)),$searchterm))
{
$fromaddress = str_replace("'","",$storage->getMessage($i)->from);
$fromaddress = str_replace('"','',$fromaddress);
$sql = "SELECT `senderemail`,`subscribed` FROM email_spam WHERE `useremail` = '$_SESSION[email_address]' AND `senderemail` = '$fromaddress'";
$result = mysql_query($sql) or die (mysql_error());
$num = mysql_num_rows($result);
if($num == 0)
{
$emailmessage = mysql_escape_string($storage->getMessage($i)->getContent());
$sql_insert = "INSERT into `email_spam` (`message`,`useremail`,`senderemail`,`datetime`,`subscribed`) VALUES ('$emailmessage','$_SESSION[email_address]','$fromaddress',now(),1)";
mysql_query($sql_insert,$link) or die("Insertion Failed:" . mysql_error());
$sql = "SELECT `emailid`,`datetime` FROM email_spam WHERE `useremail` = '$_SESSION[email_address]' ORDER BY `datetime` desc";
$getid = mysql_query($sql) or die (mysql_error());
$num = mysql_num_rows($getid);
}
}
编辑 - 这是感兴趣的人的最终代码
$storage = new Zend_Mail_Storage_Imap($imap);
$flags = $storage->getMessage($i)->getFlags();
$newflag = $flags[Zend_Mail_Storage::FLAG_RECENT];
$oldflag = $flags['\Seen'];
if(!empty($flags['\Seen']))
{
$read=1;
}
else
{
$read=0;
}
整个代码是循环的,所以在这里,我对每封电子邮件执行我的整个搜索/排序算法。
if ($read==0)
{
$storage->setFlags($i, array(Zend_Mail_Storage::FLAG_RECENT)); //marks as new
}
在这里,我将未读的电子邮件(在实施之前)标记为未读。我认为这是执行此操作的最有效方法(我能找到)。我欢迎任何其他代码或评论。