Zend Mail - как читать без писем, помеченных как открытые - PullRequest
3 голосов
/ 28 сентября 2010

Я использую Zend Mail, расширенную с помощью 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);

    }

}

РЕДАКТИРОВАТЬ - вот окончательный код для заинтересованных

$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 ]

3 голосов
/ 28 сентября 2010

После прочтения сообщения вы можете сбросить видимый флаг.Смотрите также реализацию imap метода setFlags. Api документация

2 голосов
/ 16 декабря 2011

Чтобы сбросить флаг «seen»:

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

Установка флага «Recent» не обязательно делает то, что вы хотите!В gmail письма помечаются как «важные».

0 голосов
/ 22 марта 2018

Смена флага, кажется, осуществляется с помощью метода getContent () после извлечения сообщения из zend-mail 2. Ниже приведен пример для чтения содержимого и сохранения начальных флагов:

$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);
0 голосов
/ 23 сентября 2013

Вы также можете просто использовать пустой массив для сброса любых флагов

$mailstorage->setFlags($messageID, array());
0 голосов
/ 28 сентября 2010

При чтении писем с помощью IMAP Storage в Zend Framework у вас есть доступ к методу setFlags в Zend_Mail_Storage_Imap

Я не думаю, что это описано в руководстве по ZF, но вы можете захотетьзаглянуть в документацию по API (см. ссылку выше), чтобы установить статус / флаг в сообщении.

...