dtdr57046 2010-12-10 09:48 采纳率: 100%
浏览 50
已采纳

如何从PHP中删除Maildir中的电子邮件?

I'm going crazy with a little problem with Maildir and PHP. I need to check the APACHE_RUN_USER's Maildir and parse delivery-status messages.

The problem removing message after reading; i noticed that Zend_Mail_Storage_Maildir->removeMessage() is still a stub.

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('/(?
)/', $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;
}

How can I remove it by hand? Some workarounds?

Thanks.

  • 写回答

2条回答 默认 最新

  • doubutao6216 2010-12-10 13:29
    关注

    In order of tawfekov answer I solved as follow:

    Opening mailbox:

    $mailbox = new Zend_Mail_Storage_Writable_Maildir( array('dirname' =>   '/home/' . $_ENV['APACHE_RUN_USER']  . '/Maildir/') );
    

    Processing mail code:

        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条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog