mail()头必须以换行符结束吗?(IncrediMail问题)


Do the mail() headers have to be terminated with a line break? (IncrediMail issue)

我正在使用一个发送UTF8电子邮件的函数。因为至少有一个收件人有问题的电子邮件发送我的功能(不是UTF8,所以特殊字符损坏;一些邮件标题出现在正文中),我想知道我是否必须在标题字符串的末尾放置另一个换行符:

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "")
{
   $header_ = 'MIME-Version: 1.0'."'r'n".'Content-type: text/plain; charset=UTF-8'."'r'n";
   $header_ .= "From: my@mail.com"; //Should be optional...
   if (!empty($header)) $header_ .= "'r'n".$header;
   $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);
   return $out;
}

那么mail_utf8("x@y.z", "", "blah", "")mail_utf8("x@y.z", "", "blah", "'r'n")哪个是正确的呢?

Edit:这种事情的明显资源- www.php.net/mail -仅在示例#4中使用了这样的换行符,而不像在示例#2中。

Edit2:所以这是当前版本。

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "")
{
$linebreak = PHP_EOL; //Seems to work everywhere, including IncrediMail
$linebreak = "'n"; //Debug
$header_ = 'MIME-Version: 1.0'.$linebreak.'Content-type: text/plain; charset=UTF-8'.$linebreak;
$header_ .= "From: my@mail.com".$linebreak;
if (!empty($header)) $header_ .= $header.$linebreak; //Last line break !?
$out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);
return $out;
}

尝试用'n而不是'r'n来结束每个标题行。

如果未收到消息,请尝试只使用LF ('n)。一些贫困高质量的Unix邮件传输代理自动将LF替换为CRLF(如果使用CRLF,则导致CR加倍)。这应该是最后一次了,因为它不符合»RFC 2822。

来源:PHP mail() Function

我认为你不能像在第5行那样在header顶部传递换行符,并尽量避免大量引号,它看起来很混乱。

函数的重构示例:

  function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") {
    $header_  = "MIME-Version: 1.0'r'nContent-type: text/plain; charset=UTF-8'r'n";
    $header_ .= "From: my@mail.com'r'n";
    if(!empty($header)) $header_ .= $header;
    $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);
    return $out;
  }