发送内容类型为multipart/alternative的PHP邮件


send PHP mail with Content-Type: multipart/alternative

我正在尝试发送一封包含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';
}
?>

这就是结果:

    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--

正如您所看到的,它显示的是编码,而不是单独的消息。我已经尝试了许多发布的解决方案,如:

  • 添加/删除''r''n
  • 将''r''n更改为''n
  • 将内容类型从备选更改为混合

我正在学习PHP,我所知道的就是迄今为止我所读过的和做过的。我还有很多东西要学,所以请你告诉我问题出在哪里。我会非常感激的。顺致敬意,

行:

$header .= 'Content-type: multipart/alternative;boundary=$boundary '."'n";

包含错误的引号,因此$boundary不会展开。更改为:

$header .= "Content-type: multipart/alternative;boundary=$boundary'n";

正如我在评论中所说,在消息标题和内容部分标题中,您应该使用'r'n作为换行符,因为这是RFC中定义的。大多数MTA只允许'n,但有些会被消息阻塞,有些垃圾邮件过滤器会将每一次违反RFC的行为视为垃圾邮件得分的一分。

使用PHPMailer这样的东西是一个更好的选择,因为它默认情况下可以完美地格式化所有内容,并且几乎遵守每一个晦涩乏味的RFC。

我认为您需要在边界字符串周围加引号。

试试这个:

$header    .= 'Content-type: multipart/alternative; boundary="' . $boundary . '"'r'n';

试试这个例子https://github.com/breakermind/PhpMimeParser/blob/master/PhpMimeClient_class.php

$m = new PhpMimeClient();
// Add to
$m->addTo("email@star.ccc", "Albercik");
$m->addTo("adela@music.com", "Adela");
// Add Cc
$m->addCc("zonk@email.au");
// Add Bcc
$m->addBcc("boos@domain.com", "BOSS");    
// Add files inline
$m->addFile('photo.jpg',"zenek123");
// Add file
$m->addFile('sun.png');
// create mime
$m->createMime("Witaj!",'<h1>Witaj jak się masz? <img src="cid:zenek123"> </h1>',"Wesołych świąt życzę!","Heniek Wielki", "hohoho@domain.com");
// get mime
// $m->getMime();
// Show mime
echo nl2br(htmlentities($m->getMime()));

以下是没有错误的完整脚本:

<?php
error_reporting(-1);
ini_set("display_errors", "1");
$mailto = "email@enter-domainname-here.com";
$subject = "subject";
$boundary=md5(uniqid(rand()));
$header = "From:Info<".$mailto.">'n";
$header .= "Reply-To: ".$mailto."'n";
$header .= "MIME-Version: 1.0"."'n";
$header .= "Content-type: multipart/alternative; boundary='"----=_NextPart_" . $boundary . "'"";
$message = "This is multipart message using MIME'n";
$message .= "------=_NextPart_" . $boundary . "'n";
$message .= "Content-Type: text/plain; charset=UTF-8'n";
$message .= "Content-Transfer-Encoding: 7bit". "'n'n";
$message .= "Plain text version'n'n";
$message .="------=_NextPart_" . $boundary . "'n";
$message .="Content-Type: text/html; charset=UTF-8'n";
$message .= "Content-Transfer-Encoding: 7bit". "'n'n";
$message .="<html>
<body>
<center>
<b>HTML text version</b>
</center>
</body>
</html>'n'n";
$message .= "------=_NextPart_" . $boundary . "--";
if(@mail($mailto, $subject, $message, $header))
{
print'message sent';
}
else
{
print"message was not sent";
}
?>