我有一个带有表格的网站。当提交表单时,php 会向本地网关发送一封邮件。
php 代码如下所示:
$ok = @mail($emailData['to'], $emailData['subject'], $message, $emailData['headers']);
if ($ok) {
echo "<p>Message has been sent.</p>";
} else {
echo "<p>Message could not be sent!</p>";
}
因此,当邮件成功发送后,mail.log 如下所示:
May 11 06:15:01 webserver postfix/qmgr[2280345]: 7B6B0600EF: from=<www-data@webserver>, size=803, nrcpt=1 (queue active)
May 11 06:15:01 webserver postfix/smtp[2573042]: 7B6B0600EF: to=<[email protected]>, relay=192.168.1.250[192.168.1.250]:26, delay=0.06, delays=0.03/0.01/0.02/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 8478AE11B4)
May 11 06:15:01 webserver postfix/qmgr[2280345]: 7B6B0600EF: removed
但是,由于技术问题,网关无法访问,mail.log 如下所示:
May 8 06:40:12 webserver postfix/qmgr[1521]: 33890607E6: from=<www-data@webserver>, size=67769, nrcpt=2 (queue active)
May 8 06:40:42 webserver postfix/smtp[1493379]: connect to 192.168.1.250[192.168.1.250]:26: Connection timed out
May 8 06:41:12 webserver postfix/smtp[1493379]: 33890607E6: to=<[email protected]>, relay=none, delay=399463, delays=399402/0.04/60/0, dsn=4.4.1, status=deferred (connect to 192.168.1.250[192.168.1.250]:26: Connection timed out)
PHP 只能判断邮件是否已被接受投递,而不能判断邮件是否已成功发送。所以在这两种情况下我都收到“消息已发送”......
所以我尝试找到一种方法,让 postfix 至少将邮件内容(带附件)本地保存在自己的机器(网络服务器)上,以防网关无法访问。因为否则邮件、表格内容将永远消失。
另一方面,当无法从网络服务器访问网关时(在 cronjobs 的帮助下),我已经提供了一种获取信息的方法。但这只会帮助我更快地注意到问题。
有任何想法吗?
谢谢你帮助我。
您需要一些有关邮件基础设施的背景知识。与普遍看法相反,电子邮件并不是即时发送的。上面的错误消息(延迟)就是一个很好的例子:这是暂时的失败 - 在这种情况下,任何邮件系统都会重试,直到队列生命周期结束(这可能需要几天的时间!)。您会看到此类错误的一个示例是灰名单。
这意味着此时无法获得最终结果 - 如果您想要最终结果,您需要查看收件箱中是否有退回邮件。每当遇到最终错误(例如“收件人”字段中不存在的域)时,都会生成来自邮件程序守护程序的退回消息 - 这就是您的结果。
该
deferred
状态已经意味着消息已排队并将重试,默认情况下它将尝试在大约 10 秒内传送该消息。1周。然后它将放弃并向信封发件人发送未送达通知。你不需要做任何事。
您可以使用 查看队列
postqueue -p
,并使用 命令安排立即交付尝试postqueue -i deferred
。