PHP 电子邮件 - 应该在标题或正文中构建? (更正确的是)

Posted

技术标签:

【中文标题】PHP 电子邮件 - 应该在标题或正文中构建? (更正确的是)【英文标题】:PHP Email - Should be built in the headers or in the body? (what's more correct) 【发布时间】:2013-12-23 02:38:32 【问题描述】:

当我使用 php 构建和发送电子邮件时,我注意到有时人们将消息和文件附件的代码放在标题中,有时放在正文中。他们都工作。那么什么更正确,或者有什么不同呢?

这是示例代码:在标题中

if (is_uploaded_file($attachment)) 
  $file = fopen($attachment, 'rb');
  $data = fread($file, filesize($attachment));
  fclose($file);

  $data = chunk_split(base64_encode($data));
  $uid = md5(uniqueid(time()));

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

  $headers .= "--$uid\r\n";
  $headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n\r\n";
  $headers .= $message. "\r\n\r\n";

  $headers .= "--$uid\r\n";
  $headers .= Content-Type: $att_type; name=\"$att_type\"\r\n";
  $headers .= Content-Transfer-Encoding: base64\r\n";
  $headers .= Content-Disposition: attachment; filename=\"$att_name\"\r\n\r\n";
  $headers .= $data . "\r\n\r\n";
  $headers .= "--$uid--\r\n";

  mail($to, $subject, $message, $headers);

消息(正文)中的相同代码:

if (is_uploaded_file($attachment)) 
  $file = fopen($attachment, 'rb');
  $data = fread($file, filesize($attachment));
  fclose($file);

  $data = chunk_split(base64_encode($data));
  $uid = md5(uniqueid(time()));

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

  $message = "This is a multi-part message in MIME format.\r\n";
  $message .= "--$uid\r\n";
  $message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n\r\n";
  $message .= $msg. "\r\n\r\n";

  $message .= "\r\n--$uid\r\n";
  $message .= Content-Type: $att_type; name=\"$att_type\"\r\n";
  $message .= Content-Transfer-Encoding: base64\r\n";
  $message .= Content-Disposition: attachment; filename=\"$att_name\"\r\n\r\n";
  $message .= $data . "\r\n";
  $message .= "--$uid--\r\n";

  mail($to, $subject, $message, $headers);

假设这两种方法都有效,一种方法比另一种更好吗?什么时候或为什么重要,或者重要吗?我似乎找不到这个问题的答案。

【问题讨论】:

好吧,如果你想绝对正确,你会使用类似 pear mail 包的东西,而不是 mail()。 mail() 是一个用于简单邮件的简单函数。 不是专家,但我认为第二个更好,因为您可以输入不理解 MIME 的邮件客户端可以理解的消息(例如“单击此处(链接)到在您的浏览器中查看此消息”)。不过,现在 MIME 如此普及,我不知道这样做是否有实际原因。 【参考方案1】:

没关系;标题和消息最终只是相互连接。也就是说,根据定义,电子邮件的标题在第一个空行结束。因此,将附件放在$message 中可能更安全,以防mail() 开始从标题中删除额外的换行符。

【讨论】:

如果您的标题中有额外的换行符,那么后续的标题将被解释为正文的一部分。根据其他地方的回答,规范说“正文部分”不应该在标题中。【参考方案2】:

它应该在正文中 - as per the spec。

【讨论】:

我在阅读那篇长文时没有找到它,但它可能在那里。

以上是关于PHP 电子邮件 - 应该在标题或正文中构建? (更正确的是)的主要内容,如果未能解决你的问题,请参考以下文章

PHP电子邮件正文解码

在邮件正文中插入图像

在电子邮件中注入 PHP 以添加标题?

文本旋转属性在 PHP 的电子邮件正文中不起作用

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

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