Zend_Mail_Storage_Pop3::removeMessage 不起作用

问题描述 投票:0回答:2

我有一个电子邮件驱动程序。它获取电子邮件帐户列表并接收和存储消息,工作正常。但最后一行的消息删除不起作用。这是代码的一部分:

$arrPop3Config['host'] = $arrEmailconfiguracao['strPOPHost'];
$arrPop3Config['port'] = $arrEmailconfiguracao['intPOPPorta'];
$arrPop3Config['user'] = $arrEmailconfiguracao['strPOPUsuario'];
$arrPop3Config['password'] = $arrEmailconfiguracao['strPOPSenha'];
if($arrEmailconfiguracao['intAuth'] == '1') {
    $arrPop3Config['ssl'] = 'SSL';
} else if($arrEmailconfiguracao['intAuth'] == '2') {
    $arrPop3Config['ssl'] = 'TLS';
}

$objMail = new Zend_Mail_Storage_Pop3($arrPop3Config);

foreach($objMail as $intMensagemNum => $objMensagem) {

    $strMensagemUniqueId = $objMail->getUniqueId($intMensagemNum);
    $arrHeader = $objMensagem->getHeaders();
    $strRemetente = $objMensagem->getHeader('from', 'string');
    preg_match_all("/(.*)?<(.*)?>/", $strRemetente, $arrRemetente);
    $strRemetenteNome = $arrRemetente[1][0];
    $strRemetenteEmail = $arrRemetente[2][0];
    $strTitulo = $objMensagem->getHeader('subject', 'string');
    $objMensagemPart = $objMensagem;
    while ($objMensagemPart->isMultipart()) {
        $objMensagemPart = $objMensagem->getPart(1);
    }
    $strCorpo = $objMensagemPart->getContent();

    $objDb->call(
        'emailClienteRecebe'
        ,array(
            'intEmailconfiguracao' => $arrEmailconfiguracao['intId']
            ,'strMensagemUniqueId' => $strMensagemUniqueId
            ,'strRemetenteNome' => $strRemetenteNome
            ,'strRemetenteEmail' => $strRemetenteEmail
            ,'strHeaders' => serialize($arrHeader)
            ,'strTitulo' => $strTitulo
            ,'strCorpo' => $strCorpo
        )
    );


    $objMail->removeMessage($strMensagemUniqueId);

Php 客户端返回此消息:

PHP Fatal error:  Uncaught exception 'Zend_Mail_Protocol_Exception' with message 'last request failed' in /var/www/maru/Maru/Zend/Mail/Protocol/Pop3.php:189
Stack trace:
#0 /var/www/maru/Maru/Zend/Mail/Protocol/Pop3.php(221): Zend_Mail_Protocol_Pop3->readResponse(false)
#1 /var/www/maru/Maru/Zend/Mail/Protocol/Pop3.php(457): Zend_Mail_Protocol_Pop3->request('DELE GmailId12d...')
#2 /var/www/maru/Maru/Zend/Mail/Storage/Pop3.php(227): Zend_Mail_Protocol_Pop3->delete('GmailId12de8345...')
#3 /var/www/maru/drivers/recebe-emails/driver.php(82): Zend_Mail_Storage_Pop3->removeMessage('GmailId12de8345...')
#4 {main}
  thrown in /var/www/maru/Maru/Zend/Mail/Protocol/Pop3.php on line 189

显然弹出命令“DELE GmailId1283038051edcc6e”是问题所在。但是,使用常见的电子邮件客户端(例如 mozilla Thunderbird),我可以监控发送的命令,并且相同的命令可以正常工作。

有什么想法吗?

php zend-framework pop3
2个回答
4
投票

我对Zend Pop3客户端一无所知,只是看在线文档。

POP3 规范 有一个 DELE 命令,带有消息编号。您正在提供一个字符串! 因此服务器当然不知道该怎么办。 Zend POP3 方法甚至在 removeMessage 文档中规定提供的 id 必须是整数类型。

如果您查看 getNumberByUniqueId 文档,您会发现您应该在调用removeMessage 之前将唯一 ID 转换为消息编号。

因此,要解决您的问题,您应该将最后一行替换为:

$objMail->removeMessage($objMail->getNumberByUniqueId($strMensagemUniqueId));

然后我想一切都会好起来的。


0
投票

它的工作方式是,一旦删除一条消息,intMensagemNum 就会移动一位,因此在尝试删除它时,它总是会留下一条消息并出错。

您必须创建一个邮件 UNIQUEID 数组,使用以下行将您的唯一 ID 放入数组中:

   $removeArray[] = $mail->getUniqueId($intMensagemNum)

然后循环遍历要删除的消息数组并以这种方式删除它们:

foreach ($removeArray as $deleteMail):
                    try {
                        $mail->removeMessage($mail->getNumberByUniqueId($deleteMail));
                    } catch (Exception $ex) {
                        error_log(print_r($ex->getMessage()));
                    }
                endforeach;
© www.soinside.com 2019 - 2024. All rights reserved.