使用PHP的mail()函数“不完整的标题”

时间:2015-04-25 08:27:18

标签: php email

[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错误作为响应。奇怪的是,这段代码过去几个月都能正常工作。

编辑:我忘记了 - 无论如何都会收到电子邮件。

2 个答案:

答案 0 :(得分:1)

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

但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;时是否仍会超出超时限制?下一步,当你只做前两行时它仍然会突破限制,依此类推。如果这是最可行的方法取决于您的设置和工作环境的细节。

答案 1 :(得分:0)

    $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";

这些是我的邮件功能标题,它们适用于不同的智能主机。您可以试试这些,看看是否有任何进一步的错误?