Как удалить сообщение электронной почты в Maildir из PHP?
Я схожу с ума от небольшой проблемы с Maildir и PHP. Мне нужно проверить APACHE_RUN_USER
Maildir и парсинг delivery-status
Сообщения.
Проблема удаления сообщения после прочтения; Я заметил, что Zend_Mail_Storage_Maildir->removeMessage()
все еще заглушка.
try {
$mailbox = new Zend_Mail_Storage_Maildir( array('dirname' => '/home/' . $_ENV['APACHE_RUN_USER'] . '/Maildir/') );
foreach ($mailbox as $id => $message) {
// seen flag
if ($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN)) { continue; }
//get the unique id
$uniqueid = $mailbox->getUniqueId($id);
//obtain message headers
$headers = $message->getHeaders();
//check if the original message was sent from this app and is a delivery-status
$result = strpos($message, $id_header);
if($result === false) { echo '1 mail skipped: ' . $uniqueid . '. <br />'; continue; }
$result = strpos($headers['content-type'], 'delivery-status');
//if no skip to the next mail
if($result === false) { echo '1 mail skipped: ' . $uniqueid . '. <br />'; continue; }
// if everything it's ok process it.
// clear results
$data = array();
// foreach line of message
foreach( preg_split('/(\r?\n)/', $message) as $line ){
//clear results
$matches = array();
//perform matches on textlines
if( preg_match('/^(.+)\:\s{0,1}(.+)$/', $line, $matches) ) {
//grab intrested headers
foreach( array('Action', 'Status', 'Remote-MTA', 'Diagnostic-Code', $id_header) as $header) {
if($matches[1] == $header) $data[$header] = $matches[2];
}
}
}
// *** I NEED TO DROP THE MESSAGE HERE ***
// not working code ***
$currentmessageid = $mailbox->getNumberByUniqueId($uniqueid);
$mailbox->removeMessage($currentmessageid);
// *** I NEED TO DROP THE MESSAGE HERE ***
// print out results
echo '<pre class="email">';
print_r( $data );
echo '</pre>';
}
} catch (Exception $e) {
echo $e;
}
Как я могу удалить это вручную? Некоторые обходные пути?
Благодарю.
2 ответа
В порядке ответа тафеков я решил следующее:
Открытие почтового ящика:
$mailbox = new Zend_Mail_Storage_Writable_Maildir( array('dirname' => '/home/' . $_ENV['APACHE_RUN_USER'] . '/Maildir/') );
Обработка почтового кода:
foreach ($mailbox as $id => $message) {
$uniqueid = $mailbox->getUniqueId($id);
/* ... mail processing code ... */
// mark as read
$currentmessageid = $mailbox->getNumberByUniqueId($uniqueid);
$mailbox->setFlags($currentmessageid, array(Zend_Mail_Storage::FLAG_SEEN));
// or uncomment to delete it
//$mailbox->removeMessage($currentmessageid);
}
Извините, он еще не реализован!
проверить систему отслеживания проблем http://framework.zend.com/issues/browse/ZF-9574
до сегодняшнего дня, но некоторые комментарии могут быть полезны:
Чтобы удалить электронную почту из хранилища maildir или mbox, необходимо использовать: Zend_Mail_Storage_Writable_Maildir или Zend_Mail_Storage_Writable_Mbox
Есть исторические причины для этого, и они должны быть рассмотрены и стандартизированы. На данный момент вышеупомянутые классы должны быть использованы, иначе будет выдано исключение с сообщением, которое немного вводит в заблуждение.
Пожалуйста, обратитесь к: http://framework.zend.com/issues/browse/ZF-9574 для более подробной информации.