计算机网络协议系列 - 电子邮件起源及如何通过 SMTP 协议实现邮件发送

- 1 min

计算机网络协议系列(二十八)

电子邮件起源

在互联网中,提供电子邮件服务的协议叫 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),SMTP 为了实现高效发送邮件,在传输层上使用了 TCP 协议。

早期的电子邮件就是通过通信双方建立 TCP 连接实现的,发送端写好邮件后,会保存到硬盘,然后通过建立 TCP 连接将邮件发送到对方的硬盘,发送结束后从发送端硬盘删除该邮件,如果接收方机器没开或者断电,需要过一段时间重发。

显然,这种方式有很大的弊端,需要通信双方都开机的情况下才能发送邮件,像中美两个国家白天和夜晚是颠倒的,则永远无法通信。

为此,在技术上改变了以往直接在发送端和接收端主机之间建立 TCP 连接的机制,而引入了一种会直连电源的邮件服务器,发送端和接收端通过邮件服务器进行邮件的收发。接收端从邮件服务器接收邮件使用 POP3 或 IMAP 协议(关于这两个协议我们放到下一篇详细介绍)。

综上所述,完整的电子邮件机制由三部分组成:邮箱地址、数据格式以及发送协议。下面我们分别来介绍这几个组成部分。

邮箱地址

邮箱地址格式想必大家都很熟悉:

用户名@邮件服务器域名

邮箱地址和域名一样,也是由 DNS 管理,DNS 中注册了邮箱地址及其作为发送地址时对应的邮件服务器的域名,这些映射信息被称作 MX 记录,你可以在域名解析里看到这个选项(以下是阿里云域名解析界面截图):

img

根据 MX 记录中指定的邮件服务器,可以管理不同邮件地址与特定邮件服务器之间的映射关系。

数据格式

很长一段时间内,互联网中的电子邮件只能处理文本格式的邮件,不过现在电子邮件发送的数据类型已经扩展到 MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型),可以发送图片、动画、音频、视频、应用程序等各种形式的数据。

MIME 由首部和正文(数据)两个部分组成,首部中的 Content-Type 用于指定正文的数据类型,常见的数据类型如下表所示:

img

和 HTTP 协议类似,MIME 首部和正文之间也是通过一个空行分隔,并且如果正文数据比较大的情况下,还可以通过指定数据类型为 multipart/mixed 将多个 MIME 消息组合为一个(HTTP 请求表单里面也有类似逻辑,后面我们介绍 HTTP 协议的时候会提到):

img

发送协议

SMTP 是发送电子邮件的协议,使用的是 TCP 的 25 号端口。SMTP 建立 TCP 连接之后,就会在这个连接上进行控制和应答以及数据的发送,客户端以文本命令方式发送请求,常见的命令如下表所示(邮件客户端如 Outlook、Foxmail、邮箱大师等底层也是调用这些命令,只不过通过应用交互界面屏蔽了底层实现而已):

img

然后邮件服务器会对客户端请求进行应答,常见的应答码及对应含义如下:

img

img

我们在 TELNET 协议中已经通过命令行演示了通过文本命令发送邮件的操作,这里就不重复演示了,如果是通过邮件客户端软件发送邮件就更简单了,你不需要了解 SMTP 协议底层的工作机制,就可以进行邮件发送:

img

以上是 Mac 自带的邮件客户端邮件发送操作步骤,非常简单,但为了保证邮件发送成功,还需要配置邮箱认证信息和收发协议,这可以通过添加账户来实现:

img

不同的邮件客户端软件界面可能不同,但是实现原理上大同小异。对应一些非常见的邮箱,还需要自己配置发送协议和接收协议。

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora