本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
电子邮件信息格式
RFC 5322(最基本的格式,the Internet Message Format)
形式:
- to
- Cc(抄送)
- Bcc(盲抄送,对方无法得知该消息还抄送给了谁)
- from
- Sender
- Received
- Return-Path
- Date
- Reply-to(对象是地址)
- Message-Id
- In-Reply-To(对象是 Message-Id)
- References
- keywords
- Subject
这些字段组成虽然很简单,但是也正是它最大的特性之一:安全!
操作系统中也提到过,最简单的才是最安全的,但用户往往想要更多的特性,这在一定程度上增加了未知风险,降低了系统的安全性。
MIME(the multiple Internet mail extensions) 拓展
新特性
- MIME-Version
若没有该字段则被认为只是最简单的ASCII码文本
- Content-Description:人能看懂的内容简介。对应于我们发邮件时看到的内容简介描述
- Content-Id
- Content-Transfer-Encoding
未经编码的二进制数据依然可能发不出去
(注:我参考的是计算机网络(小蓝书)第五版,它首次出版于2011年,至今已经过去了11年,也许现在对这个问题已经有了更好的解决方案)
- Content- Type
如text、image、audio、video、model等
二进制压缩算法 base64
2^6=64,所以一单元可表示的最大数字是63,按ASCII码表的对应关系。
quoted-printable(引用可打印编码)
与上述不同的是,1unit有7bits
127及以上的字符都被编码成一个等号后面跟着2个用十六进制数字来表示的字符值。
用户自定义编码
通过Content-Transfer-Encoding
字段指定
SMTP(Simple Mail Transfer Protocol)
这是一个简单的ASCII协议,简单也是它的特性。
有几个局限:
- 不包含认证(authentication)。
使得容易收发垃圾邮件。
- 无法传输二进制数据
所以需要base64,但是传输大文件时依然有问题(这种编码方式无效使用带宽)
- SMTP以明文方式传输数据
信息不加密
改进——基于RFC 5321标准的ESMTP(E指extension)
- ESMTP有一个AUTH的字段,也常用这种方式进行邮件提交。
- SMTP与ESMTP的区别之一在于,SMTP下最初发送的是HELO,而ESMTP发送的是EHLO。
- 在信息传输的过程中,常通过查询DNS中的发送邮件方代理信息,判断来的是不是垃圾邮件。
IMAP(Internet Message Access Protocol)
它是对POP3协议的改进
POP3协议(post office protocol 3)
协议包含三个阶段:
- 认证(AUTH)
用户代理 以明文形式 发送用户名及密码
- 事务处理
用户代理有两种模式,可以使用list,retr(下载),dele,quit命令
- 下载删除
- 下载保留
- 更新
通过quit命令进入更新阶段。
在上一阶段中,用户代理远程对一些文件进行标记删除等操作,实际上它并没有被立即删除,而是等进入了更新阶段时,POP3服务器才删除它们。
POP3的缺陷就是不能创建远程文件夹。也就是说,用户代理远程访问服务器,可以下载邮件到本地,然后再把邮件放到本地建好的文件夹。 但这不符合用户的习惯,用户希望能有一个远程文件夹,其可通过任意设备访问。(就像qq邮箱,可以通过电脑浏览器、手机移动端等访问它,只要账号信息正确,不同设备上看到的信息都是一样的) ## IMAP的改进 ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/af36863e2a35419ea168e8b2815fe5c2~tplv-k3u1fbpfcp-watermark.image?) 以上命令及其提供的功能充分显示了它的改进点。我就不一一赘述生硬翻译了。 # 写在最后 电子邮件曾一度十分流行,而现在在日常生活中人们已经很少发邮件了(公司业务往来我不清楚,就不瞎说了)。那为什么我还要专门去整理这个知识点呢?它是不是真的过时了呢? 其实在我看来并没有,电子邮件的内核一直都在,只是它不断在以新形式出现而已。 我为什么会这么觉得呢?因为当我看到这些协议规定的信息格式的时候,会觉得它们很熟悉,不仅在我发邮件时看到的是这样,在我发微信、用qq的时候它们本质上也是这些东西。 现在很多文章教我们如何开发(或模仿)xx软件,点进去看,其实仿照的不过是界面而已,真正又还是去调用别人的接口,或者自己写的接口往往达不到原版的要求,仅仅是小规模、几条数据的测试,弄好了连自己都不见得敢放心用(个人实际经验有限,这话可能不太贴切,大佬们别和我计较)。正所谓画皮难画骨,但是骨架才是存在的根本。 作为后来者,我们没能第一个基于这个协议核心提出电子邮件的形式;也没有第一个做出微信(甚至在今天,无论是从技术层面还是市场层面,应用层的布局都已经尘埃落定了,并没有给后来者太多机会)。但是我相信:坚持探索、不满足于表面、静待机遇,是技术人的不懈追求。 # 参考书籍 - 《Computer Network (the fifth edition)》Anrdew S.Tanenbaum等著