Zend Mail - 如何在没有电子邮件标记为已打开的情况下阅读

时间:2010-09-28 14:10:27

标签: php zend-framework zend-mail

我正在使用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
}   

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

5 个答案:

答案 0 :(得分:3)

阅读完邮件后,您可以取消设置已显示的标记。另请参见setFlags方法的imap实现。 Api documentation

答案 1 :(得分:2)

取消设置“看见”标志:

$flags = $msg->getFlags();
unset($flags[Zend_Mail_Storage::FLAG_SEEN]);
$storage->setFlags($i, $flags);

设置“最近”标志不一定能达到你想要的效果!在Gmail上,它会将电子邮件标记为“重要”。

答案 2 :(得分:0)

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

我不认为它在ZF手册中有记录,但您可能需要查看API文档(请参阅上面的链接)以在消息上设置状态/标志。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

$imap = [
    'host'     => $connection['mailhost'],
    'user'     => $connection['username'],
    'password' => $password,
];
$storage = new \Zend\Mail\Storage\Imap($imap);
$lastMsgIndex = $storage->countMessages();
$msg = $storage->getMessage($lastMsgIndex);
$msgFlags = $msg->getFlags();
// Line below will mark email as seen if getContent is called
$content = $msg->isMultipart() ? 'Multipart Email' : $msg->getContent();
$storage->setFlags($lastMsgIndex, $msgFlags);