【问题标题】:PHP mail() timeoutPHP 邮件()超时
【发布时间】:2012-12-31 22:31:40
【问题描述】:

先介绍几个信息:

  • Debian 挤压
  • PHP 5.3.3
  • 带有 mod_cgi 的 PHP
  • 在这种情况下,我绝对必须使用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。除了这个,我已经修复了所有错误。

【问题讨论】:

  • 运行 phpinfo() 并查看您是否激活了 sendmail 扩展。
  • 检查您的/var/log/mail.log 是否有错误
  • 只有在使用邮件功能时才会出现这种情况吗?
  • 停止使用邮件功能。它发送的电子邮件进入收件箱的可能性很小。最好使用 SMTP 类(有几十个)通过本地 SMTP 帐户发送。这将确保这个问题消失,并且您的电子邮件有更大的交付机会。确保设置了 To 和 From 标头。
  • mod_cgi 也是一个不太好的选择。试试 suphp 或 mod_php。

标签: php email


【解决方案1】:

不要依赖mail(),因为它不可靠并会导致类似的问题。我已经使用phpMailer 很多年了。

如果您坚持使用mail(),请检查您在 php.ini 中的设置(在 http://www.quackit.com/php/tutorial/php_mail_configuration.cfm 中解释)。请注意,通常 CLI 的 php.ini 与 FastCGI 不同。

一些更常见的问题:

  • FastCGI 没有使用 sendmail 的权限

  • 大型附件的内存限制

【讨论】:

  • 正如我已经说过的,在这种情况下我绝对必须使用它。对于我所有的其他项目,我已经使用 SMTP 邮件。我不发送任何附件。邮件在我的 chmod 之前运行良好,它不应该是配置,但我检查了它。
  • sendmail 的配置是正确的,而且它在命令行上也可以使用相同的设置。
  • 如果它从命令行运行,它可能是 FastCGI 或配置 - 在 unix 机器上,您通常有不同的 php.ini 用于 CLI 和 web。还要检查 FastCGI 的权限,它是否可以访问 sendmail?
  • 我用phpinfo()检查了sendmail路径,它是正确的。权限与我的另一台运行良好的服务器上的权限相同。
  • 除了路径之外,还有更多选项需要检查。通过 system() 从 php 执行 sendmail 并查看打印到 stderr 或返回的内容。但是,不同的 php.ini 文件和权限仍然值得研究。
【解决方案2】:

我一直在寻找这个特定的错误,发现它可能是由多种原因引起的。我不知道您已经尝试过什么来解决它,但这里有一些可能会有所帮助的建议:

  • 确保以&lt;?php 开头并以?&gt; 结尾
  • 确保将文件 chmod 为 755
  • 尝试包含某种输出(例如,打印“已发送邮件”。)

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

【讨论】:

  • 我不能只更改服务器,因为它是一个拥有数十个站点和大约 1TB 数据的根服务器。
【解决方案3】:

您很可能使用 2 个不同的 php.ini 版本。一个用于cli,一个用于cgi。我相信Debian有这个设置。

  • /etc/php5/cgi/php.ini
  • /etc/php5/cli/php.ini

确保您的 cli 和 cgi 版本具有相同的电子邮件配置,并且可以正常工作。

邮件配置键为: [邮件功能]

另一种可能是您的网络用户无权执行 sendmail。

同时检查假脱机权限(更新)

【讨论】:

  • 发送邮件的路径完全一样,我检查了三次。
  • 我必须检查哪些权限才能确保允许执行 sendmail? /usr/sbin/sendmail 二进制文件的权限为 777(也检查了 755)。
  • 把这个放在你的 sendmail.cf DontBlameSendmail=GroupWritableDirPathSafe 重新启动并重试。此外,当您发送电子邮件表单 php.. didi 时,您检查了邮件日志吗?如果你这样做了,显示的错误是什么?可能 apache 无权发送邮件,因为它不在 smtp 组或类似的组中。由于您运行了 chmod 775...
  • 需要权限 777 的是 /var/spool/postfix 目录!非常非常感谢你!我刚刚开始了一项新的赏金并给了你。
  • 明天给你,我得先等24小时。
【解决方案4】:

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

我会将此作为评论,但目前还不允许。

【讨论】:

  • 见上文,如果我使用命令行,我什至可以通过 PHP 发送。
【解决方案5】:

您是否有使用问题:

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

【讨论】:

  • system, exec 都是一样的。见this评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2018-08-09
  • 2014-08-17
相关资源
最近更新 更多