创建邮件附件的MIME边界规则是什么?

7
我正在使用PHP mail()函数发送带有附件的邮件。因此,PHP源代码包含一个边界来定义附件的开始和结束位置。
那么问题是:创建这个MIME边界是否有任何规则(除了只允许字母和数字)?我仍然知道这个SO问题-> What rules apply to MIME boundary? 是否需要从哈希创建边界?因为以下内容也可以正常工作:
$headers .= "Content-Type: multipart/related; boundary=\"abc\"";
[...]
$msg .="--abc\n";
[...]
$msg .= "--abc--\n\n"; 

为什么MIME边界应该是唯一的?

我在互联网上没有找到任何信息。

谢谢!


不要自己构建 MIME 消息。使用 PHPMailer 或 Swiftmailer 来为您完成。 - Marc B
2
好的,但为什么不呢?PHPMailer或Swiftmailer都是第三方工具,对吧?! - The Bndr
PHP的邮件功能尽可能地少做事情,同时仍能发送邮件。由于缺少标题等内容,你使用它发送的邮件很可能会被标记为垃圾邮件。 - Marc B
邮件将在封闭网络内发送。服务器在邮件服务器白名单上,因此我不会遇到“垃圾邮件”问题。但是,感谢您提供这些信息。 - The Bndr
OP没有要求使用PHP邮件命令的替代方案。因此,评论使用phpMailer对讨论没有帮助。 - Rick Hellewell
2个回答

3
MIME边界应该是用户实际消息中不可能出现的东西。哈希是一个好的选择,因为它们又长又唯一。唯一性还使得别人很难通过找到你使用的边界并将其包含在他们的消息中来破坏自己的消息。但是,我无法找到任何要求边界必须唯一的规定,只需确保整行的长度不超过70个字符即可。

1
如果边界不唯一,可能会影响邮件链或附加电子邮件作为附件。 - ThinkBonobo
哈希在这个意义上并不是唯一的。按定义,哈希是一个多对一的函数,因此按定义,在其域上不是唯一的,例如邮件消息。 (如果它们是唯一的,我们会使用它们来获得令人惊叹的压缩,对吧?) - Spike0xff

3

并不是说边界标记一定要使用哈希符号,但它们必须是唯一的。想象一下,如果您要插入的实际电子邮件文本中自然包含单词--abc--,会发生什么。

您的电子邮件将类似于这样:

--abc--    <--actual boundary
This is my email. There are many like it, but this one is mine.
Now for some reason I'm going to put in a line that shouldn't be there
--abc--    <--part of the email
There it was. Did you see it? No, you didn't, because the mail client saw a boundary
line and sliced it out. Because of this extra boundary, now the email has 2 sections,
instead of 1.
--abc--    <--actual boundary

那么...邮件客户端如何知道哪些是邮件内容,哪些只是“开销”呢?这就是为什么要使用唯一的边界。

哈希值是最简单的方法。极不可能出现电子邮件正文恰好包含其自身哈希值并被视为边界标记的情况。


2
因此,在每次运行时生成一个边界并不重要(这会消耗CPU功率)。只需创建一个长哈希即可,以便将此哈希用于所有邮件。 - The Bndr
1
不行,你必须每次生成哈希值。没有任何规定哈希值不能自然地出现在其他电子邮件的正文中。这就是“内联信号”的问题所在。无论边界标记自然出现的可能性有多小,它永远不可能是不可能的。 - Marc B
1
我不清楚计算有界数据的哈希值与生成伪随机边界并在有界数据中搜索哪个更有效,考虑到现代字符串搜索函数的高效率。而且,你得到的边界实际上是唯一的,而不是统计意义上的“唯一”(大约)。 - Spike0xff
1
我同意Spike0xff的观点。计算随机生成字符串的哈希值所带来的独特性或效率提升有何意义?此外,有什么根据表明有界数据的哈希值不会自然地出现在该有界数据中呢?这种情况发生的概率一定大于或等于随机字符串出现在该有界数据中的概率吧? - Marcel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接