分类: 工具开发

邮件协议之复合 MIME 内容传输

复合 MIME 允许同一封邮件中同时发送 Text 格式和 Html 格式。在客户端收到这封邮件的时候,可以自主选择将要渲染的版本。这也是为什么有些客户端上会提示用户选择渲染 Html 还是纯文本。

至于为什么两种格式共存,更多的还是历史遗留问题了,为了兼容老式邮箱客户端,又想提升用户体验,只有共存才能不影响老用户使用的同时给那些高级用户一个选择更好体验的机会。

关于 MIME,做 Web 开发的对这个肯定不陌生,但对来源可能就没那么清楚了,实际它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理,后来才扩展到 Web。

MIME: Multipurpose Internet Mail Extensions 即 多用途互联网邮件扩展类型

一个常见的 Email 报文看起来可能是这样的:

Return-Path: <xxx@xx.com>
X-Original-To: yyy@yy.com
Delivered-To: yyy@yy.com
From: "=?utf-8?B?6YCE5q2j5q2j?=" <xxx@xx.com>
To: "=?utf-8?B?aQ==?=" <yyy@yy.com>
Subject: xyz
Mime-Version: 1.0
Content-Type: multipart/alternative;
    boundary="----=_NextPart_5AA729EB_0B139BB8_1DAA07A4"
Content-Transfer-Encoding: 8Bit
Date: Tue, 13 Mar 2018 09:31:23 +0800

This is a multi-part message in MIME format.

------=_NextPart_5AA729EB_0B139BB8_1DAA07A4
Content-Type: text/plain;
    charset="utf-8"
Content-Transfer-Encoding: base64

Y3Y=

------=_NextPart_5AA729EB_0B139BB8_1DAA07A4
Content-Type: text/html;
    charset="utf-8"
Content-Transfer-Encoding: base64

PGRpdj5jdjwvZGl2PjxkaXY+PGluY2x1ZGV0YWlsPjwhLS08IVtlbmRpZl0tLT48L2luY2x1
ZGV0YWlsPjwvZGl2Pg==

------=_NextPart_5AA729EB_0B139BB8_1DAA07A4--

可以发现邮件体一共包含了两块,首先 base64 不是必须的,有些服务器可能直接就原文传了,在这里的两块解析出来就会发现内容都是一样的,开发时选择性渲染一种格式就可以了。

Recent Posts

Docker 容器非 root 用户监听 80 端口

起因是基于 CentOS 的 …

2 年 之前

基于 Docker 定时打印文件

先说背景,喷墨打印机有个很大的…

3 年 之前

Java 运行时反射获取来自继承的泛型

背景 正常情况下 Java 的…

3 年 之前

Java 基于 ByteBuddy 重写系统当前时间

背景 一般单元测试时总会有些代…

3 年 之前

华硕 B450F-Gaming 主板 I211-AT 网卡驱动安装

事情起因是买了块华硕的 ROG…

3 年 之前

PHP 安装 Memcached 扩展

登录服务器挨步执行: # su…

4 年 之前