PHP error_log消息类型1,在additional_header中找到多个或格式错误的换行符

时间:2016-11-23 18:49:03

标签: php

选择message_type 1并发送电子邮件时,php error_log函数出错。我在extra_headers参数中放置的任何值都会停止接收任何电子邮件并创建错误。

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= 'From: error-404@'.substr($_SERVER['SERVER_NAME'],4)."\r\n";

$log = var_export(debug_backtrace(), true);

error_log("<HTML><body><h1>404 ERROR: $today</h1><br /><p>$log</p></body></HTML>", 1, "webmaster@domain.com", $headers);
  

mod_fcgid:stderr:PHP警告:error_log():在additional_header中找到多个或格式错误的换行符.....

当前PHP版本:5.6.24

感谢。

2 个答案:

答案 0 :(得分:1)

论坛$extra_headers的{​​{3}}文档说:

  

此消息类型使用与function error_log()相同的内部功能。

mail()函数$additional_headers的文档说明了<{1}}:

  

应使用CRLF\r\n

分隔多个额外标头

这是(我希望)您使用CRLF\r\n)分隔邮件标题中的行的原因。

但是,相同的文档页面也在一个注释中说明了以下几段:

  

如果未收到消息,请尝试仅使用LF\n)。一些Unix邮件传输代理(最值得注意的是mail())会自动将LF替换为CRLF(如果使用CR,则会导致CRLF加倍。这应该是最后的手段,因为它不符合» qmail

我无法告诉qmail但是当电子邮件服务器sendmail时我遇到了相同的行为。当我使用LF\n)作为标题中的行尾标记时,问题就消失了。

答案 1 :(得分:0)

这对我有用。不太确定这个解决方案是多么正确。

//create a boundary string. It must be unique so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));

//define the headers we want passed. Note that they are separated with \r\n
$headers = "From: $from_name <$from_mail> \r\nReply-To: $from_mail";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: text/html; charset=\"iso-8859-1\"; boundary=\"PHP-alt-".$random_hash."\"";

error_log($sMsg, 1, $emailto, $headers);

我希望它可以帮助其他人。

感谢您的回复。