什么是邮件信体(BODY)
邮件正文示例
邮件原文MIME标准
▪ 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_=------
为了便于理解,我们通过图示的方式将上述源码的结构做一下说明。
信件源码嵌套式结构