Zend_Mail_Storage_Pop3 :: removeMessage не работает - PullRequest
2 голосов
/ 07 февраля 2011

У меня есть драйвер электронной почты.Он получает список учетных записей электронной почты, получает и хранит сообщения, работает нормально.Но удаление сообщений, в последней строке, не работает.Вот часть кода:

$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, я отслеживал отправленные команды, и эта же команда прекрасно работает.

Есть идеи?

1 Ответ

4 голосов
/ 07 февраля 2011

Я ничего не знаю о клиенте Zend Pop3, только посмотрев онлайн-документацию.

В спецификации POP3 есть команда DELE, которая принимает номер сообщения. Вы поставляете строку! Поэтому сервер, конечно, не знает, что делать. В методе Zend POP3 даже указывается, что указанный идентификатор должен быть целочисленным в документации removeMessage .

Если вы посмотрите документацию getNumberByUniqueId , вы увидите, что перед вызовом removeMessage необходимо преобразовать уникальный идентификатор в номер сообщения.

Поэтому, чтобы решить вашу проблему, вам следует заменить последнюю строку на:

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

И тогда я думаю, что все будет хорошо.

...