发送具有Content-Type的PHP邮件:multipart / alternative

Kam*_*lak 5 html php email mime multipart

我正在尝试发送包含html和纯文本的多部分邮件。这也是通过垃圾邮件过滤器并允许更多人在不支持HTML的情况下阅读邮件的方法之一。在花费大量时间进行谷歌搜索之后,我发现了一些示例。我编写了代码,发送了邮件,但它显示带有html标签,代码,字符串等的文本。

<?php
$boundary=md5(uniqid(rand()));
$header .= "From:My Name<something@something.com>\n";
$header .= "Reply-To: something@something.com \n";
$header .= 'MIME-Version: 1.0'."\r\n";
$header .= 'Content-type: multipart/alternative;boundary=$boundary '."\n";

$adres = "something@gmail.com";

$subject = "subject";

$message = "This is multipart message using MIME\n";
$message .= "--" . $boundary . "\n";
$message .= "Content-type: text/plain;charset=iso-8859-1\n";
$message .= "Content-Transfer-Encoding: 7bit". "\n\n";
$message .= "Plain text version\n\n";
$message .="--" . $boundary . "\n";
$message .="Content-type: text/html;charset=iso-8859-1\n";
$message .= "Content-Transfer-Encoding: 7bit". "\n\n";
$message .="<html>
<body>
<center>
<b>HTML text version</b>
</center>
</body>
</html>\n\n";
$message .= "--" . $boundary . "--";

if(mail($adres, $subject, $message, $header))
{
print'message sent';
}
else
{
print'message was not sent';
}
?>
Run Code Online (Sandbox Code Playgroud)

结果如下:

    This is multipart message using MIME
    --c071adfa945491cac7759a760ff8baeb
    Content-type: text/plain;charset=iso-8859-1
    Content-Transfer-Encoding: 7bit

    Plain text version

    --c071adfa945491cac7759a760ff8baeb
    Content-type: text/html;charset=iso-8859-1
    Content-Transfer-Encoding: 7bit

    <html>
    <body>
    <center>
    <b>HTML text version</b>
    </center>
    </body>
    </html>

    --c071adfa945491cac7759a760ff8baeb--
Run Code Online (Sandbox Code Playgroud)

如您所见,它显示编码而不是仅显示消息。我已经尝试过许多解决方案,例如:

  • 添加/删除\ r \ n;
  • 将\ r \ n更改为\ n;
  • 将内容类型从替代更改为混合;

我正在学习PHP,到目前为止,我所知道的只是我已经阅读和完成的所有内容。我还有很多东西要学习,所以请您告诉我问题出在哪里。我将非常感谢。

Sam*_*tch 5

该行:

$header .= 'Content-type: multipart/alternative;boundary=$boundary '."\n";
Run Code Online (Sandbox Code Playgroud)

引用有误,所以$boundary不再展开。

除此之外,就像我在评论中所说的那样,在消息标题和内容部分标题中,您应该使用\r\n换行符,因为这是 RFC 中定义的。大多数 MTA 都会简单地允许\n,但有些会因邮件而阻塞,并且某些垃圾邮件过滤器会将每个 RFC 违规视为垃圾邮件分数的一个点。

所以,改为:

$header .= "Content-type: multipart/alternative;boundary=$boundary\r\n";
Run Code Online (Sandbox Code Playgroud)

使用像PHPMailer这样的东西是一个更好的选择,因为它默认完美地格式化所有内容,并且遵守几乎每一个晦涩、无聊的 RFC。