phpmailer - 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 中看到这个错误,以便我可以在我的应用程序中记录错误?
解决方案
这与 PHPMailer 无关。PHPMailer 调试输出显示成功传送到您的 exim 服务器。这就是它的参与结束的地方——PHPMailer 绝不会与 gmail 对话,因此永远不会看到此响应。
Exim(如预期)然后继续尝试传递消息,但收到来自 gmail 的失败通知。然后,您应该在日志中看到 exim 尝试将邮件退回到返回路径,该路径由您的邮件服务器从用于提交原始邮件的 SMTP 信封发件人设置。您可以通过在 PHPMailer 中设置属性来控制此地址Sender
,尽管它默认为您的发件人地址,这是您通常想要的。
如果您想在您的代码而不是邮箱中听到这些反弹,您需要让 exim 将它们通过管道传送到脚本而不是邮箱,这是exim 非常乐意做的事情。
弹跳处理写起来不是一件令人愉快的事情,但您可能会发现使用VERP 寻址会有所帮助。
推荐阅读
- c# - vscode 在单独的文件中找不到 c# 命名空间片段(编译良好)
- mysql - 找出一列中的时间范围
- python - 使用 tkinter 和 pymysql 使用 Python 创建日志系统时出现问题
- javascript - 如何将使用 JS 创建的元素相乘
- javascript - 我需要在不实际更改数字(正负号、括号等)的情况下简化字符串
- javascript - 通过函数进行条件渲染始终为 False
- windows - 批处理列表文件夹,统计pdf文件并获取文件名
- mysql - 根据每个唯一列值计算百分比
- wordpress - 在获得 200 OK 后,未使用 WooCommerce API 更新常规价格和库存数量
- php - 如何在具有 csrf 保护的 CodeIgniter 中发出 AJAX 请求?