【问题标题】:"Incomplete Headers" with PHP's mail() function带有 PHP 的 mail() 函数的“不完整的标题”
【发布时间】:2015-04-25 17:09:14
【问题描述】:
[Sat Apr 25 04:18:46.660552 2015] [fastcgi:error] [pid 11271:tid 140464355243776] [client 95.87.236.146:63037] FastCGI: comm with server "/usr/lib/cgi-bin/php5-fcgi-domain.cc" aborted: idle timeout (30 sec), referer: http://domain.cc/login/restore_session.php?redirect=yes
[Sat Apr 25 04:18:46.660673 2015] [fastcgi:error] [pid 11271:tid 140464355243776] [client 95.87.236.146:63037] FastCGI: incomplete headers (0 bytes) received from server "/usr/lib/cgi-bin/php5-fcgi-domain.cc", referer: http://domain.cc/login/restore_session.php?redirect=yes

我的 error.log 文件中出现了这些错误。当我尝试使用 mail() 函数发送电子邮件时会发生这种情况:

$to = $ticket->email;
$subject = "X Support";
$message = "We have just answered your support ticket! Here is our message: \n\n-------------\n\n" . $text . "\n\n-------------\n\nIf you wish to reply, please visit http://domain.cc/support.php";
$headers = "From: noreply@domain.cc\r\n" .
"Reply-To: noreply@domain.cc\r\n" .
"X-Mailer: PHP/" . phpversion() . "\r\n";
$headers .= "CC: noreply@domain.cc\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$result = mail($to, $subject, $message, $headers);

我使用 AJAX 调用此代码,结果当我单击“发送回复”时,页面只是挂起,30 秒后我收到 500 错误作为响应。奇怪的是,这段代码过去几个月都可以正常工作。

编辑:我忘了提 - 电子邮件还是会送达。

【问题讨论】:

  • 您在phpversion() 之后缺少\r\n。但我认为这不会导致错误,它只是不会执行 CC。
  • 就像我说的,我没想到会解决它。
  • 请注意,日志消息不是指邮件头,而是指应该从 PHP 发送到 Apache 的 HTTP 头。
  • 我怀疑您服务器上的邮件配置有问题。

标签: php email


【解决方案1】:

在您的设置中,Apache 和 PHP 之间的连接是通过 CGI 的变体 fastcgi 完成的。这就是您在日志中看到fastcgi:error 的原因。当 Apache 收到对 PHP 文件 URL 的请求时,例如“my-site.tld/index.php”,它会将请求传递给 PHP。然后 PHP “做它的事”并发回它的输出。然后,Apache 将 PHP 输出发送给发出请求的客户端。

但是 Apache 不会永远等待 PHP 来回答。有 30 秒的“空闲超时”。在那之后,Apache 假定 PHP 将不再发送答案。这就是您的情况,您可以在comm with server "/usr/lib/cgi-bin/php5-fcgi-domain.cc" aborted: idle timeout (30 sec) 中看到。所以 Apache 没有任何东西可以发回给发出请求的客户端,甚至没有(完整的)标头,因为它只从 PHP 接收到 0 个字节:incomplete headers (0 bytes) received from server "/usr/lib/cgi-bin/php5-fcgi-domain.cc"

结论是:由于某种原因,您的代码的执行花费了 PHP 超过 30 秒的超时时间。这触发 Apache 认为“我已经等了足够长的时间,不会有答案”。下一个问题你应该看看恕我直言,是什么让你的 PHP 代码需要这么长时间。

一种可能的方法是删除/注释掉部分代码,看看其余部分是否在 30 秒的限制内执行。当你只做$to = $ticket->email;时,它是否仍然打破超时限制?下一步,当你只做前两行等等时,它是否仍然打破限制。这是否是最可行的方法取决于您的设置和工作环境的详细信息。

【讨论】:

  • 如果我在 mail() 函数之前结束脚本,它不会挂起。
  • 所以看起来接受来自 PHP 的邮件并将它们发送出去的邮件服务器(MTA,邮件传输代理,在当前设置中可能是 Postfix)正在延迟事情。您可能需要与 MTA 的管理员/邮政主管交谈和/或查看 MTA 的日志以获取更多线索。 MTA PHP 的mail() 函数使用哪个在php.ini 中设置,查找类似SMTPsmtp_port 的指令。
【解决方案2】:
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'To: Segreteria <segreteriagenerale@aaa.it>' . "\r\n";
    $headers .= 'From: Gestore corrispondenza ZENITH <rosa@aaa.it>' . "\r\n";

这些是我的邮件功能标题,它们与不同的智能主机配合良好。你可以试试这些,看看你是否得到任何进一步的错误?

【讨论】:

  • 还是一样。我刚刚用'.$to.'替换了“Segreteria
  • 您还必须替换发件人地址。顺便说一句,smarthost 是否启动并运行?你能ping通吗?您可以尝试从命令行发送邮件吗?你用的是什么智能主机?
  • 我在 DigitalOcean 上运行 Ubuntu 服务器。 ping它是什么意思?喜欢从终端“ping ”吗?
  • 是的。您的 Ubuntu 机器是直接发送邮件还是通过 SMTP 服务器发送邮件?
  • 我相信是 Ubuntu 发送电子邮件,但不确定。如何检查?
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多