MailABC是科普电子邮件知识的个人Blog,接受交换友链。您可以关注公众号mailabc留言,或邮件联系feedback@mailabc.cn 。

邮件运维进阶:邮件原文详细解析-信体(MIME)

邮箱运维 小胡子大魔王 7个月前 (04-13) 389次浏览 0个评论

什么是邮件信体(BODY)

简单的说,一封邮件原文除了信头部分之外,剩下的就是信体,包括邮件正文及附件。

邮件正文示例

邮件原文MIME标准

想了解邮件正文,就必须先了解一下MIME标准。MIME协议扩展了电子邮件标准,允许邮件中包含非ASCII字符及多种类型的附件。它引入了Content-Type和Content-Transfer-Encoding头部字段,用于描述正文内容的类型和编码方式。MIME标准由一系列相关的RFC文档定义,主要包括RFC 2045至RFC 2049👉 Content-Type

▪ text/plain:纯文本格式,是最基本的邮件正文类型,只支持ASCII字符集。

▪ text/html:HTML格式,邮件正文可以包含HTML标签,支持更丰富的样式和布局。

▪ multipart/*:复合类型,当邮件包含多个不同类型的部分时(如文本和附件),会使用这种类型,每个部分有自己的Content-Type和编码。常见有multipart/mixed、multipart/alternative、multipart/related 这几种类型。

👉 Content-Transfer-Encoding

▪ 7bit:仅适用于全部是7位ASCII字符的文本,不需要额外编码。

▪ 8bit:允许使用整个8位字符集,但不是所有邮件传输代理都支持,一般在网络内部或知道接收方支持时使用。

▪ quoted-printable(QP):对非ASCII字符或某些控制字符进行编码,使得它们可以通过只支持7位ASCII字符的通道传输。编码规则是将高位字节转为等号(=)后面跟着两个十六进制数字的形式。

▪ base64:对数据进行Base64编码,确保所有数据都能安全地以ASCII字符传输,即使邮件中含有二进制数据或者非ASCII文本。编码后的文本长度约增加33%。

👉 Multiparts

MIME定义了multipart类型,允许在一个邮件实体中包含多个不同部分,每个部分都有自己的Content-Type和编码。这些部分之间用特殊的边界分隔符(boundary)标识。

在邮件正文包含非ASCII字符时,常见的做法是将正文内容转换为UTF-8编码,然后根据需要选择合适的Content-Transfer-Encoding方式进行编码。例如,如果正文中有大量非ASCII字符且无需严格控制传输大小,通常会选择base64编码;如果大部分是ASCII字符且仅有少量特殊字符,可能会选择quoted-printable编码。

在接收端,邮件客户端或服务端会解码邮件正文并将其还原为原始的字符编码以便正确显示。

信体源码分析示例

以上述示例邮件为例,我们看一下信体源码的结构。由于源码很长,这里做了部分删减,说明如下:
# 这是信头里定义的Content-Type和boundary信息
Content-Type: multipart/mixed;
boundary="----=_001_NextPart103267043785_=----"


# 从这里开始进入信体部分,根据boundary将信体分为多个部分
------=_001_NextPart103267043785_=----
Content-Type: multipart/related;
boundary="----=_002_NextPart101782625068_=----"

------=_002_NextPart101782625068_=----
Content-Type: multipart/alternative;
boundary="----=_003_NextPart845007760777_=----"

# 这一段显示的是邮件正文内容,纯文本类型
------=_003_NextPart845007760777_=----
Content-Type: text/plain;
charset="GB2312"
Content-Transfer-Encoding: base64

1eLKx9X9zsTP+8+iDQrV4sDvsuXI68HL0rvVxc28xqyjug0KDQo=

# 这一段显示的是邮件正文内容,html类型
------=_003_NextPart845007760777_=----
Content-Type: text/html;
charset="GB2312"
Content-Transfer-Encoding: quoted-printable

这里显示的是经过quoted-printable编码的正文内容,略...
------=_003_NextPart845007760777_=------

------=_002_NextPart101782625068_=----
Content-Type: image/jpeg;
name="Catch.jpg"
Content-Transfer-Encoding: base64
Content-ID: <_Foxmail.1@c6c60536-1a17-1c0e-6163-c5bc6506488f>

iVBORw0KGgoAAAANSUhEUgAAAeQAAABICAYAAAAnB4bYAAAA...这里是正文图片base64编码后的内容,略...
------=_002_NextPart101782625068_=------

# 这一段内容是“测试.docx”附件
------=_001_NextPart103267043785_=----
Content-Type: application/octet-stream;
name="=?GB2312?B?suLK1C5kb2N4?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="=?GB2312?B?suLK1C5kb2N4?="

UEsDBAoAAAAAAIdO4kAAAAAAAAAAAAAAAAAJAAAA...这里是附件经过base64编码后的内容,省略...
------=_001_NextPart103267043785_=------

为了便于理解,我们通过图示的方式将上述源码的结构做一下说明。

信件源码嵌套式结构

如果还想进一步学习,那不妨打开一封邮件的源码对照研究一番。

未标注来源的文章均为原创作品,版权所有,转载请注明出处。非原创文章均已标注来源,如有侵权请告知。 如您喜欢本站,可以收藏加关注(扫码关注右上角微信公众号mailabc)。
喜欢 (6)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址