PHP mail() 超时问题

12

首先是一些信息:

  • Debian Squeeze
  • PHP 5.3.3
  • PHP使用mod_cgi
  • 在此情况下,我必须绝对使用mail()。对于我的其他项目,我已经使用SMTP邮件。

我已将网站超时的问题隔离到了PHP的mail()函数。这是在我的服务器上test.php文件中唯一的一行代码:

<?php mail('rudolf@geardev.de', 'test', 'test');

这似乎需要无限时间,然后在40秒后由mod_cgi终止。该命令

php -r "mail('rudolf@geardev.de', 'test', 'test');"

在命令行上发送电子邮件可以立即完成。

请告诉我您想查看哪些日志文件,Apache日志是这个:

[Thu Jan 17 12:17:00 2013] [warn] [client 178.15.148.43] mod_fcgid: read data timeout in 40 seconds
[Thu Jan 17 12:17:00 2013] [error] [client 178.15.148.43] Premature end of script headers: test.php

我认为问题出在我几天前无意中在根目录下运行了chmod -R 775命令。除了这个问题,我已经修复了所有错误。


1
运行 phpinfo() 并查看是否已激活 sendmail 扩展。 - Vlad Preda
1
请检查您的/var/log/mail.log文件以查找错误。 - s.webbandit
1
停止使用邮件功能。您使用它发送的电子邮件很可能无法进入收件箱。最好使用SMTP类(有数十种可供选择)通过本地SMTP帐户发送。这将确保此问题消失,并且您的电子邮件具有更大的传递机会。请确保设置收件人和发件人头。 - transilvlad
如前所述,这看起来像是一个权限问题。您是否正在运行 suhosin、apparmor 或任何其他工具来加固您的 Web 服务器?顺便说一句,试着执行 <?php system('php -r "mail('rudolf@geardev.de', 'test', 'test');"'); ?> - 如果能够执行成功,那么忘记我之前说的所有话。 - Ragen Dazs
这绝对是一个权限问题!问题是,哪些权限是错的?顺便说一下,“system()”脚本也超时了。我使用suhosin,但我没有重新配置它,在之前它也是可以工作的。 - Rudolf
显示剩余8条评论
5个回答

7
您很可能使用了2个不同的php.ini版本,一个用于cli,另一个用于cgi。我相信Debian有这样的设置。
以下是这两个版本的路径: /etc/php5/cgi/php.ini /etc/php5/cli/php.ini
请确保您的cli和cgi版本具有相同的电子邮件配置,那么它们将能够正常工作。邮件配置关键字是[mail function]。
另一种可能性是您的Web用户无法访问执行sendmail。请确保用户具备执行权限。
此外,请检查spool权限(已更新)。

发送邮件的路径完全相同,我已经核对了三遍。 - Rudolf
1
我需要检查哪些权限来确保允许执行sendmail?/usr/sbin/sendmail二进制文件的权限为777(也检查过755)。 - Rudolf
将以下内容放入您的sendmail.cf文件中: DontBlameSendmail=GroupWritableDirPathSafe 重新启动并重试。此外,当您从php发送电子邮件时,请检查邮件日志。如果您这样做了,显示的错误是什么?可能是因为Apache没有发送邮件的权限,因为它不在smtp组中或类似的原因。 如果不在smtp上,将删除访问spool目录的权限,因为您运行了chmod 775命令。 - Danilo Kobold
1
需要将/var/spool/postfix目录的权限设置为777!非常感谢您!我刚刚发布了一份新悬赏,并将其授予了您。 - Rudolf
我明天会给你,我必须先等待24小时。 - Rudolf

2
不要依赖mail(),因为它不可靠,会导致像这样的问题。我已经很高兴地使用phpMailer多年了。
如果您坚持使用mail(),请检查php.ini中的设置(在http://www.quackit.com/php/tutorial/php_mail_configuration.cfm中有解释)。请注意,通常CLI具有与FastCGI不同的php.ini。
一些更常见的问题:
  • FastCGI没有使用sendmail的权限

  • 附件过大导致内存限制


正如我之前所说,这个情况下我必须使用它。对于我的其他项目,我已经使用SMTP邮件发送,不发送任何附件。在我的chmod之前,邮件工作得非常完美,应该不是配置问题,但我会检查一下。 - Rudolf
sendmail的配置正确,并且在命令行中使用相同的设置可以正常工作。 - Rudolf
如果它可以从命令行工作,那么可能是FastCGI或配置问题 - 因为在Unix系统中,CLI和Web通常有不同的php.ini。此外,请检查FastCGI的权限,它是否有访问sendmail的权限? - Mirko Adari
我使用phpinfo()检查了sendmail路径,它是正确的。权限与我的另一台正常工作的服务器相同。 - Rudolf
除了路径之外,还有更多选项需要检查。通过system()从php执行sendmail,并查看它打印到stderr或返回的内容。但是仍然值得调查不同的php.ini文件和权限。 - Mirko Adari
我需要检查哪些权限以确保允许执行sendmail?/usr/sbin/sendmail 二进制文件的权限为777(也检查了755)。 - Rudolf

0

您使用时有问题吗:

exec('php -r \"mail('rudolf@geardev.de', 'test', 'test');\"');

systemexec是一样的。请参考这个评论。 - Shiplu Mokaddim

0

我一直在寻找这个特定的错误,发现它可能由各种因素引起。我不知道你已经尝试了什么来修复它,但是以下是一些可能有所帮助的建议:

  • 确保以<?php开头并以?>结束
  • 确保将文件的chmod设置为755
  • 尝试包含某种输出(例如打印“发送邮件”)

这里还有关于此主题的另一个问题:PHP Mail Function Causes Error - 所有者表示更改具有相同设置的服务器导致工作的mail()函数,这可能表明主机存在问题。


1
我不能仅仅更改服务器,因为它是一个根服务器,上面有数十个网站和约1TB的数据。 - Rudolf

0

你是否有防火墙阻止了外发的SMTP连接?服务器上是否还有其他可以成功发送电子邮件的东西?

我本来想把这个作为评论,但是现在还不允许。


以上可见,如果我使用命令行,甚至可以通过PHP发送它。 - Rudolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接