如果您真的想学习如何格式化 Internet 消息,那么您应该参考它的 Request For Comments(又名 RFC)。定义“多用途 Internet 邮件扩展 - Internet 消息正文的格式”的是 1996 年 11 月发布的RFC2045。
格式在某种程度上非常严格,必须按原样遵循。
基本上,消息包含标题和正文。标头定义了消息的类型、格式以及其他一些字段,这些字段因一种类型而异。
身体由不同的实体组成。例如,一个实体可以只是一个纯文本,例如“Hello there!”。但也可以是图像、附件等。
注意 在以下示例中,括号中的所有内容(例如 {hello})都应替换为您的实际值。任何换行符实际上都是 CRLF(即 ASCII 13 + ASCII 10)。你在哪里看到两个 CRLF 坚持下去。这将是展示你的创造力的最糟糕的时刻。
基本上,对于带有附件的电子邮件,标题应如下所示:
MIME-Version: 1.0
To: {email@domain}
Subject: {email-subject}
X-Priority: {2 (High)}
Content-Type: multipart/mixed; boundary="{mixed-boudary}"
在上面的示例中,{mixed-boudary} 可以是任何唯一的哈希值,例如 000008050800060107020705。其他的都是不言自明的。
现在,无论何时我们想要在邮件中添加一个新实体(如邮件正文、图像、附件),我们都必须告诉电子邮件代理一个新部分即将到来,即.用 {mixed-boundary} 值作为该实体的前缀。我们称之为“开放边界”。请注意,通过打开边界,我们不会像最初定义的那样插入该边界,而是在前面多使用 2 个减号,例如 --{mixed-boudary}。当我们关闭一个边界时,我们同样继续,除了我们必须在最后使用其他 2 个减号,比如 --{mixed-boudary}--
--{mixed-boudary}
the entity content
--{mixed-boudary}--
因为电子邮件代理应该了解我们新插入的实体的内容是什么类型,所以我们必须在边界打开后立即声明。声明只是一个标头,仅包含与实体兼容的参数/值。
对于 HTML 正文内容,我的实体标题如下所示:
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
所以整个身体(包围在边界中)最终看起来像:
--{mixed-boudary}
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head>
<body bgcolor="#FFFFFF" text="#000000">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel
dapibus arcu. Duis quam dui, ornare non mi nec, luctus faucibus massa. Vivamus
quis purus in erat euismod ullamcorper vitae eget dolor. Aliquam tempor erat
accumsan, consectetur ex et, rhoncus risus.
</body>
</html>
如果必须插入另一个实体,我们完全按照上面的方法进行。
当没有更多数据要添加到消息中时,我们关闭混合边界,即。 CRLF + --{混合边界}--.
如果出于任何原因必须使用替代表示插入实体(例如,正文消息以纯文本格式和 HTML 格式插入),则必须使用 content-type 声明实体内容multipart/alternative(尽管全局 multipart/mixed 标题仍然存在!)。每个替代表示都将被这个新边界包围。
下面是一个完整的例子:
MIME-Version: 1.0
To: {email@domain}
Subject: {email-subject}
X-Priority: {2 (High)}
Content-Type: multipart/mixed; boundary="{mixed-boudary}"
--{mixed-boudary}
Content-Type: multipart/alternative; boundary="{alternative-boudary}"
--{alternative-boudary}
Content-Type: text/plain; charset=utf-8;
Content-Transfer-Encoding: 7bit
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel
dapibus arcu. Duis quam dui, ornare non mi nec, luctus faucibus massa. Vivamus
quis purus in erat euismod ullamcorper vitae eget dolor. Aliquam tempor erat
accumsan, consectetur ex et, rhoncus risus.
--{alternative-boudary}
Content-Type: text/html; charset=utf-8;
Content-Transfer-Encoding: 7bit
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head>
<body bgcolor="#FFFFFF" text="#000000">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel
dapibus arcu. Duis quam dui, ornare non mi nec, luctus faucibus massa. Vivamus
quis purus in erat euismod ullamcorper vitae eget dolor. Aliquam tempor erat
accumsan, consectetur ex et, rhoncus risus.
</body>
</html>
--{alternative-boudary}--
--{mixed-boudary}
Content-Type: application/pdf; name="myfile.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="myfile.pdf"
JVBERi0xLjINOCAwIG9iag08PCAvTGVuZ3RoIDkgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
ID4+DXN0cmVhbQ1oQ51bbY/cNg7+BfsfhAUO11w3riW/B7gPaZEAAdpcm06RL8EBzoyn68uM
vZ3xZLv//khKsuUxNaMNiiabpUg+pKiHsmxJEcN/UsgiilP4ab2/+XF1I81vszSqclHIOEpj
sdrf/PC2EFVUpmK1vXkZxVKs1uJlJJVYPYrvPra7XVvvxYdIrE7rL83hhVj97+bNyjUoFam7
FnOB+tubGI3FZEkwmhpKXpVRnqJi0PCyjBJ1DjyOYqWBxxXp/1h3X+ov9abZt434pV0feoG/
ars/xU/9/qEZmm7diJ+abmgOr0TGeFNFEuXx5M4B95Idns/QAaJMI1IpKeXi9+ZhaPafm4NQ
cRwzNpK0iirlRvisRBZpVJa+PP51091kkjBWBXrJxUuZRjIXh0Z8FN3MnB5X5st5Kay9355n
--{mixed-boudary}--
提示
使用您首选的电子邮件客户端(我的是 Thunderbird)并发送至
您自己 仅一条消息纯文本,一条仅 HTML,一条混合消息,以及
然后是较早的每个,但附有一个文件附件。什么时候
您收到消息只需研究其来源(查看 -> 消息
来源)。
@Edit:可以在here找到一个非常有据可查的案例研究 + PHP 示例