2

我试图让退回的邮件检查邮件的正文,但由于某种原因,脚本什么也没做。

我检查了有关该主题的所有文档并搜索了解决方案,但找不到任何东西。

我相信你们中的一些人将能够发现我做错了什么。

这是代码的相关部分。

error_reporting( E_ALL ) ;

$POP3Box = imap_open( "{" . $Domain . ":110/pop3/novalidate-cert", $EmailBox, $EmailPass ) ;

if ( !$POP3Box ) :
  echo '<br /><div class="ErrorMessage"> Connection failed!<br /> Wrong Email address or Password! Please check and try again...</div><br /><br />' ;
  die ;
endif ;

$MessageQty = imap_num_msg( $POP3Box ) ;
echo 'Total messages in "' . $EmailBox . '" = ' . $MessageQty . '<br /><br />' ;
$MailNum = 1 ;
$MailOrder = 1 ;

while ( $MailNum <= $MessageQty ) {// GET MESSAGES
  $EmailBody = imap_fetchbody( $POP3Box, $MailNum, 1 ) ;

  if ( strrpos( $EmailBody, 'Undelivered Mail Returned to Sender' )) {
    imap_delete( $POP3Box, $MailNum ) ;
    $MailOrder++;
  }
  else {
    die ;
  }
  $MailNum++;
}

if ( $MailOrder > 1 )
  imap_expunge( $POP3Box ) ;

if ( $MailNum > 1 ) {
  echo 'No bounced messages found!<br />' ;
}
else {
  echo 'Empty mailbox!<br />' ;
}
4

1 回答 1

0

我在脚本中发现了至少 3 个问题:

这是一个错误: }后丢失...novalidate-cert"

$POP3Box = imap_open( "{" . $Domain . ":110/pop3/novalidate-cert", $EmailBox, $EmailPass );

必须改为:

$POP3Box = imap_open( "{" . $Domain . ":110/pop3/novalidate-cert"}, $EmailBox, $EmailPass );1

这是一个错误:缺少关闭命令。在后面加上这个expunge

imap_close( $POP3Box );

这是一个建议:在正文中搜索的字符串不能只是Undelivered Mail Returned to Sender.

有几条消息表示退回或退回的电子邮件。我建议更换这个:

if ( strrpos($EmailBody, 'Undelivered Mail Returned to Sender')) { 使用像这样的正则表达式:

if ( preg_match( "([a-z0-9!#$%&'*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)", $EmailBody, $BounceMatch )) {

检测所有退回的邮件几乎是不可能的,但使用正则表达式,您将能够捕获接近 95% 的邮件,这非常好。

在我看来,你这样做的方式 - 检查消息的正文 - 是迄今为止更有效的方法。

希望这可以帮助。

于 2012-12-10T07:37:59.160 回答