2010-09-28 3 views
3

Я использую почтовую почту 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 
} 

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

+0

Ваш «окончательный код» не работает. Вы не можете устанавливать флаги в последнее время. Zend выкинет ошибку ... также он будет отменять все остальные флаги. –

ответ

3

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

+0

Учитывает ли это сообщения, которые уже были прочитаны? –

+0

моя мысль точно ... просто сбросьте флаг чтения в сообщении после того, как вы прочитали его с помощью php ... должен работать с IMAP – ChrisR

+0

Да. Вы действительно хотели бы читать сообщения, не касаясь флагов. Кажется, не может найти способ сделать это в документации ZF. –

0

При чтении почты с IMAP для хранения в Zend Framework у вас есть доступ к методу под названием setFlags в Zend_Mail_Storage_Imap

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

2

Чтобы сбросить состояние «видели» флаг:

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

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

+0

Это должен быть главный ответ –

0

Вы также можете просто использовать пустой массив, чтобы сбросить флаги

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