首页 » 网络 » MIME协议

MIME协议

MIME(Multipurpose Internet Mail Extensions,多用途Internet邮件扩展)。MIME被用在电子邮件系统中,也应用到HTTP中。

消息头

头域 说明
MIME-Version MIME版本,1.0
Content-Description 消息内容描述
Content-Id 唯一标识
Content-Transfer-Encoding 为了传输,如何包装消息体,如B/Q编码、7bit/8bit、base64等
Content-type 内容的类型和格式,分主次类型(maintype/subtype)
Content-Disposition 内容的位置,可以是内嵌的(inline)或附件(attachment)

MIME Content-type

MIME Content-type主要包含消息体的类型和子类型(maintype/subtype)。

主要的类型包括:Text, Image, Audio, Video, Application, Message, Multipart等。

常见的类型/子类型包括:

类型 说明
Text/Plain 未格式化的文本
Text/html Web页面
Text/xml XML内容
Application/Octet-stream 二进制数据
Message/RFC822 MIME RFC822消息
Multipart/Mixed 按特定顺序的独立部分
Multipart/alternative 可选的。如同时提供文本/HTML格式的消息
Multipart/related 相关的。多个相关部分组成一个消息整体

Audio/Video类型分别用于声音和视频。Video只包含可视信息而不包括声道,如果是有声视频,根据其编码格式,音频和视频可能需要分开传输。

Message类型使得一个消息可以封装在另一个消息中发送,例如转发邮件。

Multipart/alternative

在同时提供多种消息格式,这些消息格式间是相互可替换的

  • 如同时提供文本/HTML/PostScript等格式
  • 如提供同一消息的多语言版本

AST的《计算机网络》中打了一个形象的比喻,埃及的罗塞塔石碑(Rosetta Stone)可视作最早的Multipart/alternative消息。罗塞塔石碑制作于公元前195年(现存于大英博物馆),这块石碑刻有同一段内容的三种不同语言版本:

例如以下是一封 Google+ 发送的邮件头部切片:

Content-Type: multipart/alternative; boundary=90e6ba6154c22e929304c09f49e1

--90e6ba6154c22e929304c09f49e1
Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes
Content-Transfer-Encoding: base64

--90e6ba6154c22e929304c09f49e1
Content-Type: text/html; charset=GB2312
Content-Transfer-Encoding: quoted-printable

以下是一封 PayPal 发送的邮件头部切片:

Content-Type: multipart/alternative; boundary=--NextPart_048F8BC8A2197DE2036A

----NextPart_048F8BC8A2197DE2036A
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8

这些相互可替换的部分应该以从简单到复杂的顺序排列,以便那些非MIME用户代理的收件人也可以阅读简单的ASCCI文本。

发送一封邮件,携带附件和内嵌式的图片。以下是邮件头部切片:

Content-Type: multipart/related;    # --> 多个部分组合而成

    Content-Type: multipart/alternative;    # --> 多个可选消息
    Content-Type: text/plain;               # --> 文本格式
    ...
    Content-Type: text/html;                # --> HTML格式
    ...
    # --> 引用图片
    <img src="cid:4ea7b458$2$137778ab54f$Coremail$null$163.com">    
    ...

Content-Type: image/png; name="bf.png"                          # --> 图片
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="bf.png"                  # --> 内嵌
Content-ID: <4ea7b458$2$137778ab54f$Coremail$null$163.com>      # --> 图片ID

Content-Type: application/pdf; name="in.pdf"                    # --> 文件
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="in.pdf"              # --> 附件

内嵌图片,需要在HTML格式的消息中,使用:

<img src="cid:CONTENTID">

这样的形式,而 CONTENTID 则是用 Content-ID 指定的一个资源。这里还使用了 Content-Disposition: inline 指明了资源是内嵌到消息中,而不是作为消息附件发送的。

发送附件,需要使用Content-Disposition: attachment来指定。

各种Content-Type的测试

用Python内置工具输出各种文件对应的Content-Type(输出参考):

#!/usr/local/bin/python3.2

import mimetypes

maps = mimetypes.types_map
for suffix in maps.keys():
    print(suffix, maps[suffix])

分享

0