PHP mail() 错误:在additional_header中发现多个或格式错误的换行符
突然开始收到上述错误,而没有对脚本进行任何更改。
主机是1和1(我知道...)
该脚本在另一台服务器上仍然可以正常工作,因此我怀疑一定有一些服务器配置更改导致了这种情况,尽管主机辩称无知。
我可以找到的Google中根本没有关于上述错误的信息 - 有人有任何想法吗?服务器正在运行Apache,如果这有帮助的话。
突然开始收到上述错误,而没有对脚本进行任何更改。
主机是1和1(我知道...)
该脚本在另一台服务器上仍然可以正常工作,因此我怀疑一定有一些服务器配置更改导致了这种情况,尽管主机辩称无知。
我可以找到的Google中根本没有关于上述错误的信息 - 有人有任何想法吗?服务器正在运行Apache,如果这有帮助的话。
只是有类似的问题。
它突然出现。未更改任何 PHP 代码。
更改内容:PHP 从 5.5.25-1 升级到 5.5.26。
PHP函数中的安全风险已被修复,并且不允许使用额外的换行符。因为额外的换行符意味着:现在开始电子邮件(我们当然不希望有人通过标题注入一些换行符,然后是邪恶的消息)。mail()
additional_headers
以前工作正常的东西,例如,只是在标头后有额外的换行符,甚至将整个消息传递给 ,将不再起作用。additional_headers
解决方案:
additional_headers
\r\r, \r\0, \r\n\r\n, \n\n, \n\0
additional_headers
message
PHP安全错误报告:https://bugs.php.net/bug.php?id=68776
C代码差异如何修复:http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/standard/mail.c;h=448013a472a3466245e64b1cb37a9d1b0f7c007e;hp=1ebc8fecb7ef4c266a341cdc701f0686d6482242;hb=9d168b863e007c4e15ebe4d2eecabdf8b0582e30;hpb=eee8b6c33fc968ef8c496db8fb54e8c9d9d5a8f9
上面的答案都没有为我解决这个问题。因此,我将搜索范围扩大到“带有附件和 HTML 邮件问题的邮件”。从几个不同的帖子中拼凑信息,我想出了这个。它允许HTML电子邮件和附件。
我的原始标头代码:
$header = "From: ".$from_name." <".$from_mail.">\r\n";
$header .= "Reply-To: ".$replyto."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header .= "Content-Transfer-Encoding: 8bit\r\n";
$header .= $body."\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n";
$header .= $content."\r\n";
$header .= "--".$uid."--";
if (mail($mail_to, $subject, "", $header))
{
return "mail_success";
}
else
{
return "mail_error";
}
我的新代码(完整):请注意,$body是由其他函数组装的HTML。
$file = $path.$filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$eol = PHP_EOL;
// Basic headers
$header = "From: ".$from_name." <".$from_mail.">".$eol;
$header .= "Reply-To: ".$replyto.$eol;
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"";
// Put everything else in $message
$message = "--".$uid.$eol;
$message .= "Content-Type: text/html; charset=ISO-8859-1".$eol;
$message .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$message .= $body.$eol;
$message .= "--".$uid.$eol;
$message .= "Content-Type: application/pdf; name=\"".$filename."\"".$eol;
$message .= "Content-Transfer-Encoding: base64".$eol;
$message .= "Content-Disposition: attachment; filename=\"".$filename."\"".$eol;
$message .= $content.$eol;
$message .= "--".$uid."--";
if (mail($mail_to, $subject, $message, $header))
{
return "mail_success";
}
else
{
return "mail_error";
}
这里有两个关键的变化。(1)从标题中删除所有多部分内容到$message。(2) 删除了所有“\r\n”内容并添加到代码中。$eol = PHP_EOL;
总之,这些变化使我能够再次发送带有附件的HTML电子邮件。