Как удалить сообщение электронной почты в Maildir из PHP? - PullRequest
0 голосов
/ 10 декабря 2010

Я схожу с ума из-за небольшой проблемы с Maildir и PHP. Мне нужно проверить APACHE_RUN_USER s Maildir и проанализировать delivery-status сообщения.

Проблема удаления сообщения после прочтения; я заметил, что Zend_Mail_Storage_Maildir->removeMessage() все еще заглушка.

<code>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 '
'; } } catch (исключение $ e) { echo $ e; }

Как я могу удалить это вручную? Некоторые обходные пути?

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

В порядке tawfekov ответ я решил следующим образом:

Открытие почтового ящика:

$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);
    }
1 голос
/ 10 декабря 2010

Извините, он еще не реализован!

проверить трекер проблем 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 для более подробной информации.

...