首页 > 解决方案 > PHPMailer 未捕获 SMTP 错误

问题描述

我正在使用 PHPMailer 连接到运行 Exim 的远程 smtp 服务器。在我的 exim 日志中,我可以看到发送失败,但 PHPMailer 没有捕获异常,并且似乎 SMTP 服务器正在返回“Ok”状态。

以下是我的 exim 日志的摘录:

2019-06-27 17:03:00 1hgbXj-0000O5-Vl == *******@gmail.com R=dnslookup T=remote_smtp defer (-44) H=alt4.gmail-smtp-in.l.google.com [108.177.119.27]: SMTP error from remote mail server after RCPT TO:<********@gmail.com>: 452-4.2.2 The email account that you tried to reach is over quota. Please direct\n452-4.2.2 the recipient to\n452 4.2.2  https://support.google.com/mail/?p=OverQuotaTemp **** - gsmtp

这是 PHPMailer 调试输出的(结束):

SERVER -> CLIENT: 250 OK id=1hgbf8-0008CL-15
CLIENT -> SERVER: RSET
SERVER -> CLIENT: 250 Reset OK
Done @0.0734977722168s
CLIENT -> SERVER: QUIT

任何方式我都可以在 PHP 中看到这个错误,以便我可以在我的应用程序中记录错误?

标签: phpmailerexim

解决方案


这与 PHPMailer 无关。PHPMailer 调试输出显示成功传送到您的 exim 服务器。这就是它的参与结束的地方——PHPMailer 绝不会与 gmail 对话,因此永远不会看到此响应。

Exim(如预期)然后继续尝试传递消息,但收到来自 gmail 的失败通知。然后,您应该在日志中看到 exim 尝试将邮件退回到返回路径,该路径由您的邮件服务器从用于提交原始邮件的 SMTP 信封发件人设置。您可以通过在 PHPMailer 中设置属性来控制此地址Sender,尽管它默认为您的发件人地址,这是您通常想要的。

如果您想在您的代码而不是邮箱中听到这些反弹,您需要让 exim 将它们通过管道传送到脚本而不是邮箱,这是exim 非常乐意做的事情

弹跳处理写起来不是一件令人愉快的事情,但您可能会发现使用VERP 寻址会有所帮助。


推荐阅读