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

Posted

技术标签:

【中文标题】Zend Mail - 如何在不将电子邮件标记为已打开的情况下阅读【英文标题】:Zend Mail - how to read without emails being marked as opened 【发布时间】:2011-04-18 08:06:07 【问题描述】:

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

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

【问题讨论】:

您的“最终代码”不起作用。您不能将标志设置为最近。 Zend 会抛出一个错误......它也会取消设置所有其他标志。 【参考方案1】:

阅读消息后,您可以取消设置已看到的标志。另请参见 setFlags 方法的 imap 实现。 Api documentation

【讨论】:

这会考虑已经阅读的消息吗? 我的想法完全正确...只需在您使用 php 阅读邮件后重置邮件上的阅读标志...应该适用于 IMAP 是的。您实际上希望在不接触标志的情况下阅读消息。在 ZF 文档中似乎找不到这样做的方法。 @ChrisRamakers @WardB - 你们不会碰巧给我指出重置标志的文档方向吧? 这是框架 2.0 的 API 文档 (Imap::setFlags()):framework.zend.com/apidoc/2.0/classes/…【参考方案2】:

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

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

【讨论】:

【参考方案3】:

取消设置“seen”标志:

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

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

【讨论】:

这应该是最佳答案【参考方案4】:

你也可以只使用空数组来重置任何标志

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

【讨论】:

【参考方案5】:

在 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);

【讨论】:

以上是关于Zend Mail - 如何在不将电子邮件标记为已打开的情况下阅读的主要内容,如果未能解决你的问题,请参考以下文章

OSX邮件标记为已回复

imaplib/gmail 如何在不标记为已读的情况下下载完整消息(所有部分)[重复]

如何在不安装 Zend 框架的情况下使用 Zend 库

如何使用 Zend_Mail_Protocol_Imap 或 Zend_Mail_Storage_Imap 批量检索电子邮件

如何使用 zend_mail 和 zend_mail_storage_imap 将电子邮件移动到不同的文件夹?

使用 Zend_Mail 时如何验证邮件是不是已发送?