【发布时间】:2011-10-03 14:43:16
【问题描述】:
我正在使用一个函数来发送 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")?
编辑:这种事情的明显资源 - www.php.net/mail - 仅在示例#4中使用这样的换行符,与#2不同。
Edit2:这是当前版本。有关详细信息,请参阅 cmets。
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;
}
【问题讨论】:
-
好吧,你的代码中都没有使用。
-
“一些邮件标题出现在正文中”部分让我认为您的标题中可能有空行,例如
"Content-type: text/plain; charset=UTF-8\r\n\r\nAnother-header: value"。我会将\r\n附加到From:行并确保$headers参数不以\r\n开头。 -
@binaryLV:正如我在下面写的,似乎 IncrediMail(电子邮件客户端 - 不是邮件服务器)在“MIME-Version: 1.0”之后产生了第一个双换行符,这可以解释为什么“Content- Type: ..." 是正文的第一行(同样,仅在 IncrediMail 中)。但是通过使用“\n”而不是“\r\n”,我不再符合标准了,对吧?
-
(1) 我仍然建议将
"\r\n"从$header_ .= "\r\n".$header;语句移动到$header_ .= "From: my@mail.com";,这样在删除设置From:时可能会省去一些麻烦。 (2) 至于不符合标准,以某种方式获取接收消息的原始来源是值得的。您的 MTA 可能确实将\r\n替换为\r\r\n(如其他人所述),但某些客户端可能能够处理此类情况。如果你能得到接收消息的原始来源,你可以在PHP中使用\r\n时检查是否有\r\n或\r\r\n。 -
@binaryLV:我查看了使用 16 进制编辑器使用 Thunderbird 下载的最终电子邮件。无论我是否将 $linebreak(参见第一篇文章中的 Edit2)设置为 "\r\n" 或 "\n" - 标题中都有单个 CRLF (13, 10) 作为中断 - 应该如此。在 IncrediMail 中,这仅适用于“\n”(或 PHP_EOL)。正如您所提到的,使用 "\r\n" 没有 CRCRLF (13, 13, 10)!但最后一个标题行是“Content-Type:”,后跟一个空行 (CRLFCRLF = 13, 10, 13, 10),然后是“Content-type: text/plain...”(这是我的标题,注意小写 T)。那么 TB 会修复它还是 IM 会破坏它?
标签: php email line-breaks