为啥电子邮件在正文中显示 mime 边界/

Posted

技术标签:

【中文标题】为啥电子邮件在正文中显示 mime 边界/【英文标题】:Why is email displaying mime boundary in body/为什么电子邮件在正文中显示 mime 边界/ 【发布时间】:2011-07-14 18:24:22 【问题描述】:

我正在尝试通过 php mail() 发送带有附件的电子邮件。

附件通过正常,正文的内容在那里,但我也看到了 mime 边界和内容类型,而不是电子邮件是 html

    --==Multipart_Boundary_x9e92752e972e274a182cc4cafd83c674xContent-Type: text/html; charset="iso-8859-1"Content-Transfer-Encoding: 7bit

<p>
    Body content</p>
<p> <snip>

代码如下:

 $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";

   $headers = "From: $from\r\n" .
   "MIME-Version: 1.0\r\n" .
      "Content-Type: multipart/mixed;\r\n" .
      " boundary=\"$mime_boundary\"";

    $message = "--$mime_boundaryContent-Type: text/html; charset=\"iso-8859-1\"\r\n"
    ."Content-Transfer-Encoding: 7bit\r\n\r\n" . $bodyText . "\r\n";   

      $message .=  "--$mime_boundary\n" .
      "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
      "Content-Transfer-Encoding: 7bit\n\n" .
   $message . "\n\n";

then the attachment routine

我在代码上尝试了许多变体,但都没有成功。毫无疑问,这将是一些我看不到的微不足道的事情。

提前致谢

【问题讨论】:

【参考方案1】:

您两次忘记了正确的行尾。

   $message = "--$mime_boundaryContent-Type"

缺少第一个\r\n

 $message .=  "--$mime_boundary\n" .

这里你只写了\n而不是\r\n

另外不要忘记,您需要在最后一个终止 MIME 边界,并以结束双减号作为终止符:

  $message .=  "--$mime_boundary--\n" .

【讨论】:

【参考方案2】:

看起来您在边界分隔符之后缺少所需的 CRLF,而且分隔符可能会缩进(不能缩进),尽管这可能只是此处的代码格式。看起来您只使用换行符而不是强制性 CRLF。

您应该认真考虑使用a mature mailing library, like SwiftMailer 轻松为您组装 MIME 消息。

【讨论】:

+1 for SwiftMailer... 或 PHPMailer 会做...除了原始 mail 函数之外的任何东西。 我过去使用过 phpmailer,但有时感觉有点矫枉过正。不过会记住这一点。 是的。为此+1。我发现文章 here 很有用。 PHPMailer 和 SwiftMailer 都可能有点矫枉过正,但随时准备使用它们的功能非常非常方便。

以上是关于为啥电子邮件在正文中显示 mime 边界/的主要内容,如果未能解决你的问题,请参考以下文章

带有正文内容的 Python 电子邮件多部分

使用 PHP 的邮件正文中的 MIME 信息

PHP Mail_Mime:如何在电子邮件正文中正确使用 encodeHeader()

Perl 使用 MIME::Parser 解析没有部分的电子邮件正文

Python-解析电子邮件正文并截断 MIME 标头

仅发送纯文本电子邮件,正文中包含 Rails mime 部分