Php Zend Mail-如何阅读而不将电子邮件标记为已打开

Php Zend Mail-如何阅读而不将电子邮件标记为已打开,php,zend-framework,zend-mail,Php,Zend Framework,Zend Mail,我使用zend mail extended和zend_mail_storage_imap,并构建了一个应用程序,用于在用户电子邮件中查找关键字 问题是,它会打开每封电子邮件,并将其标记为已读。有没有一种方法可以检查邮件正文,而不是将每封已检查的邮件标记为已读 这是当前的工作代码。它是ajax查询的一部分,可以自动查看某人的收件箱。在当前表单中,它会将每个以用户最新邮件开头的邮件标记为已读(在gmail中)。是否可以检查正文,但不将电子邮件标记为已读。或者,在查找邮件之前,我是否需要检查每个邮件是

我使用zend mail extended和zend_mail_storage_imap,并构建了一个应用程序,用于在用户电子邮件中查找关键字

问题是,它会打开每封电子邮件,并将其标记为已读。有没有一种方法可以检查邮件正文,而不是将每封已检查的邮件标记为已读

这是当前的工作代码。它是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);

    }

}
编辑-以下是感兴趣的人的最终代码

整个代码是循环的,所以在这里,我对每封邮件执行整个搜索/排序算法

if ($read==0)
{
    $storage->setFlags($i, array(Zend_Mail_Storage::FLAG_RECENT)); //marks as new
}   

在这里,我将那些未读的电子邮件(在实现之前)标记为未读。我认为这是(我能找到的)执行此操作最有效的方法。我欢迎任何其他代码或评论

阅读消息后,可以取消设置SEED标志。另请参见setFlags方法的imap实现

在Zend Framework中使用IMAP存储读取邮件时,您可以访问中名为setFlags的方法

我不认为ZF手册中有记录,但您可能希望查看API文档(参见上面的链接)来设置消息的状态/标志。

要取消设置“已看到”标志:


设置“最近”标志不一定能达到您的目的!在gmail上,它会将电子邮件标记为“重要”。

您也可以使用空数组重置任何标志

$mailstorage->setFlags($messageID, array());

标志更改似乎是在zend mail 2中获取消息后通过getContent()方法完成的。下面是读取内容并保留初始标志的示例:

$imap=[
'host'=>$connection['mailhost'],
'user'=>$connection['username'],
“密码”=>$password,
];
$storage=new\Zend\Mail\storage\Imap($Imap);
$lastMsgIndex=$storage->countMessages();
$msg=$storage->getMessage($lastMsgIndex);
$msgFlags=$msg->getFlags();
//如果调用getContent,下面的行将标记电子邮件
$content=$msg->isMultipart()?'多部分电子邮件“:$msg->getContent();
$storage->setFlags($lastMsgIndex,$msgFlags);

这会考虑到已经阅读的邮件吗?我的想法正是。。。用php读取消息后,只需重置消息上的读取标志。。。应该和imapye一起工作。实际上,您可能希望在不接触标志的情况下阅读消息。在ZF文档中似乎找不到这样做的方法。@ChrisRamakers@WardB-你们不会碰巧能够为我指出标记重置文档的方向,是吗?这是框架2.0的API文档(
Imap::setFlags()
):您的“最终代码”不起作用。不能将标志设置为“最近”。Zend将抛出一个错误。。。它还将取消所有其他标志的设置。这应该是最重要的答案
$flags = $msg->getFlags();
unset($flags[Zend_Mail_Storage::FLAG_SEEN]);
$storage->setFlags($i, $flags);
$mailstorage->setFlags($messageID, array());