我懂了:
Content-typetext/html; charset=iso-8859-1
我应该在哪里看到:
Content-type: text/html; charset=iso-8859-1
这是剪切/粘贴错误吗?在您的代码中,还是在您的结果中?
请注意,您可能希望在多部分邮件中同时包含text /plain 和 text/html 类型,因为仅 HTML 的邮件通常会获得较高的垃圾邮件分数(使用 SpamAssassin、SpamBouncer 等)。
更新#1:
似乎\r\n
被解释为两个换行符而不是一个。不同的平台在实现 SMTP 时可能存在不同的错误。将行尾更改为 just 是可能的\n
。如果这适用于您的系统,请不要依赖它,因为它可能无法在其他系统上运行。
此外,请考虑切换到其他发送邮件的方法。 phpMailer和SwiftMailer都比 PHP 的内部mail()
函数更推荐。
更新#2:
基于 Incognito 的建议,您可以使用以下代码更好地组织标题,以及创建纯文本部分:
filter_var($to, FILTER_VALIDATE_EMAIL) or die("Invalid To address");
filter_var($email, FILTER_VALIDATE_EMAIL) or die("Invalid From address");
$subject = 'HTML e-mail test';
$messagetext = 'TEST in TEXT';
$messagehtml = '<html>
<body>
<h1>TEST</h1>
<p>in HTML</p>
</body>
</html>';
// We don't need real randomness here, it's just a MIME boundary.
$boundary="_boundary_" . str_shuffle(md5(time()));
// An array of headers. Note that it's up to YOU to insure they are correct.
// Personally, I don't care whether they're a string or an imploded array,
// as long as you do input validation.
$headers=array(
'From: <' . $email . '>',
'MIME-Version: 1.0',
'Content-type: multipart/alternative; boundary="' . $boundary . '"',
);
// Each MIME section fits in $sectionfmt.
$sectionfmt = "--" . $boundary . "\r\n"
. "Content-type: text/%s; charset=iso-8859-1\r\n"
. "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
. "%s\n";
$body = "This is a multipart message.\r\n\r\n"
. sprintf($sectionfmt, "html", $messagehtml)
. sprintf($sectionfmt, "plain", $messagetext)
. "--" . $boundary . "--\r\n";
$mailb = mail($to, $subject, $body, implode("\r\n", $headers));
我并不是说这是做这件事的正确方法,但是如果该策略对您有吸引力,并且您认为您可以在 6 或 12 个月没有查看它之后维护这样的代码(即它是有道理的乍一看),然后随意使用或调整它。
免责声明:这是未经测试的,有时我会打错字……只是为了让人们保持警惕。:)