我正在使用PHP mail()函数从Linux服务器发送电子邮件,但使用Exchange作为主要MTA。为实现此目的,sendmail已设置为将所有内容中继到本地Exchange服务器,然后该服务器将电子邮件发送出去。
这是正常的,但PHP脚本似乎要等到超时限制才能完成。我想也许它正在等待sendmail的响应,这不会变成它只是一个接力?
我为“sendmail_path”-odb指定了php.ini命令行选项,它应该以“后台”传递模式启动sendmail,这意味着在单独的进程中触发电子邮件然后立即返回。但PHP脚本结束仍需要30秒。
有人有什么想法吗?我有点难过。 感谢。
答案 0 :(得分:2)
间接解决方案。
我们所做的是使用php的system()在后台发送电子邮件,这样用户就不必等待电子邮件出去了。
像这样......<?php //sendEmail.php
mail($argv[1], $argv[2], $argv[3]);
?>
你的剧本:
<?php
...
system("php sendEmail.php to@address.com 'subject' 'message' 1>/dev/null 2>&1 &");
...
?>
答案 1 :(得分:1)
如果不看php / mail日志,不能说太多。但是为什么不直接从PHP发送到您选择的MTA?只需使用像PHPMailer这样的库,身份验证就很容易了。
同样出于调试目的,您可以安装postfix(在Linux上使用包管理器需要3秒)并将其设置为中继,Postfix日志在详细模式下非常广泛,您可以发现sendmail是否是您的瓶颈。
答案 2 :(得分:1)
-odb
已被弃用(sendmail版本8.7起)。 1
考虑使用-ODeliveryMode=b
(对于sendmail命令行或sendmail_path设置)
或者在PHP O DeliveryMode=b
函数的其他参数中添加mail
。 2
答案 3 :(得分:0)
另一种选择可能是使用PEAR Mail。我用它来发送电子邮件到qmail和Exchange SMTP服务器。
答案 4 :(得分:0)
我有similar question。就我而言,基础设施团队实际上增加了30秒的人工延迟。我认为它实际上更像是一个设置,等待确认电子邮件实际上已经发送,默认情况下等待30秒,而不是任意明确设置30秒延迟。无论如何,听起来像你在同一条船上。检查管理Exchange服务器的人,告诉他们发生了什么,并查看他们是否可以发现设置。就我而言,在我说服团队确实存在Exchange实际问题而不是我的应用程序之前,我必须实际记录Wireshark发生的事情。
答案 5 :(得分:-1)
如果有任何帮助,我的sendmail_path看起来像这样:
sendmail_path = /usr/sbin/sendmail -t -i