Я использую почтовую почту zend, расширенную с помощью zend_mail_storage_imap, и я создал приложение, которое ищет ключевые слова в электронных письмах пользователя.Zend Mail - как читать без сообщений, помеченных как открытые
Проблема в том, что он открывает каждое электронное письмо и сохраняет его как прочитанное. Есть ли способ проверить тело писем и не отмечать каждую почту, проверенную как прочитанную?
Вот действующий рабочий код. Это часть запроса 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);
}
}
EDIT - вот окончательный код для тех, кто заинтересован
$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
}
Здесь я размещаю письма, которые не были прочитаны (до реализации), как непрочитанные. Я думаю, что это самый эффективный способ (который я мог найти) выполнить эту операцию. Я приветствую любые другие коды или комментарии.
Ваш «окончательный код» не работает. Вы не можете устанавливать флаги в последнее время. Zend выкинет ошибку ... также он будет отменять все остальные флаги. –