为啥电子邮件在正文中显示 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 边界/的主要内容,如果未能解决你的问题,请参考以下文章
PHP Mail_Mime:如何在电子邮件正文中正确使用 encodeHeader()