我有一个电子邮件驱动程序。它获取电子邮件帐户列表并接收和存储消息,工作正常。但最后一行的消息删除不起作用。这是代码的一部分:
$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),我可以监控发送的命令,并且相同的命令可以正常工作。
有什么想法吗?
我对Zend Pop3客户端一无所知,只是看在线文档。
POP3 规范 有一个 DELE 命令,带有消息编号。您正在提供一个字符串! 因此服务器当然不知道该怎么办。 Zend POP3 方法甚至在 removeMessage 文档中规定提供的 id 必须是整数类型。
如果您查看 getNumberByUniqueId 文档,您会发现您应该在调用removeMessage 之前将唯一 ID 转换为消息编号。
因此,要解决您的问题,您应该将最后一行替换为:
$objMail->removeMessage($objMail->getNumberByUniqueId($strMensagemUniqueId));
然后我想一切都会好起来的。
它的工作方式是,一旦删除一条消息,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;