我一直在努力解决这个问题。。。任何线索都将不胜感激。
我通过PHPMailers SMTP类在运行exim的Ubuntu 12.04服务器上本地发送邮件。如果我只发送10条消息,一切都很好。然而,如果我排队说260+条消息,并尝试一条接一条地发送它们,我可以保证大约30条消息将与以下行一起返回:
MAIL not accepted from server
它们都指向同一个地址(其他230个成功到达),我有时可以看到exim中的队列正在运行,那么是什么原因导致了这种情况,如果我只是使用"邮件"命令,为什么不会发生这种错误呢?
提前谢谢。
Ben
p.S:我没有使用mail命令,因为我实际上是从SMTP输出中提取消息ID
更新
我在PHPMailers class.smtp.php文件中做了更多的挖掘,在Mail函数中添加了一两个var_dump,我还将调试级别提高到了4(这样我就可以看到每个smtp响应)。似乎$this->getLines()
函数正在从套接字中读取一个空行。。。哪个类.smtp.php正在解释(可能是错误的),然后退出。这是一个有效的回应吗?为什么telnet什么都不回。。?
-
你试着入睡了吗(1);邮件之间的延迟?在一定的时间内,你可以发送的邮件数量可能是有限制的。
-
检查错误发生的时间,脚本运行了多长时间?邮件服务器登录时间似乎已过期。将电子邮件分成较小的数量,在发送了20封左右的电子邮件后重新登录。
您收到的错误应该比这更具信息性,例如
ERROR: MAIL not accepted from server: 550 Tarpit active for...
或者类似的东西。消息的第二部分应该告诉你错误是什么。否则,你应该能够在邮件日志消息中看到原因-/var/log/messages、/var/log/mail*等。
更新:这就是我这么说的原因:
if($code != 250) {
$this->error =
array("error" => "MAIL not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
因此,错误应该还包括SMTP代码和/或消息,而不仅仅是"服务器不接受MAIL"。
无论如何,服务器应该已经记录了错误的原因,并且可以在/var/log/exim4/rejectlog或/var/log/eexim4/mainlog等中找到。
一天前,我在PHPMailer类中遇到了同样的问题,我得到了错误消息:MAIL not accepted from server:
,没有进一步的错误详细信息。我有一个简单的解决方案,在做Send()
之前先做SetFrom("my@email.com", "My Name")
,它是有效的。我想这是关于SMTP服务器的,它需要一个"FROM"标头才能通过SMTP服务器发送。我希望它对那些可能来这个线程并对我有同样问题的人有用。