【问题标题】:send PHP mail with Content-Type: multipart/alternative使用 Content-Type: multipart/alternative 发送 PHP 邮件
【发布时间】:2013-09-02 05:23:19
【问题描述】:

我正在尝试发送包含 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,我所知道的就是我迄今为止所阅读和所做的一切。我还有很多东西要学,所以请告诉我问题出在哪里。我将非常感激。最好的问候。

【问题讨论】:

  • 1.你正在混合\n\r\n。除了可以使用 w/e 的消息正文之外,您应该始终在消息和内容标题部分使用 \r\n。 2. 只需使用PHPMailer
  • 3.我认为您需要在此之后再换行:$message = "This is multipart message using MIME\n";

标签: php html email mime multipart


【解决方案1】:

行:

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

有错误的引号,所以$boundary 不会被扩展。改为:

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

就像我在 cmets 中所说的,在邮件标题和内容部分标题中,您应该使用 \r\n 作为换行符,因为这是 RFC 中定义的。大多数 MTA 只允许 \n,但有些会阻塞邮件,有些垃圾邮件过滤器会将每次 RFC 违规都计为垃圾邮件分数。

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

【讨论】:

  • 感谢您的所有回复。我会尽快更改代码。我默认使用 \r\n 。此代码是在我尝试使用 \n 的最后一次修改之后。再次感谢你。我希望这能解决问题。
  • 我已经改变了边界线以及 \r\n 但它仍然给出了与以前相同的结果。
【解决方案2】:

这是完整的脚本,没有错误:

<?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";
}
?>

【讨论】:

    【解决方案3】:

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

    试试这个:

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

    【讨论】:

      【解决方案4】:

      试试这个例子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()));
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多