我正在使用一个发送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;
}