• 网络协议-应用层协议-电子邮件协议


    电子邮件起源

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

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

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

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

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

    邮箱地址

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

    用户名@邮件服务器域名
    

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

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

    数据格式

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

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

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

    SMTP 协议

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

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


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

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

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

    POP 协议

    SMTP 的一个不利之处在于它支持的是发送端主机的行为,而不是根据接收端的请求进行发送的行为,因此无法解决用户一开机就能接收到邮件,为了解决这个问题,引入了 POP(Post Office Protocol,即邮局协议)协议,该协议是一种用于接收电子邮件的协议,现在用的是第三版,所以我们经常会看到它的简称 POP3。

    发送端的邮件根据 SMTP 协议将被转发给一直处于插电状态的 POP 服务器,客户端再根据 POP 协议从 POP 服务器接收对方放过来的邮件。在这个过程中,为了防止他人盗窃邮件内容,还要做用户验证。

    POP 与 SMTP 一样,也是在客户端与服务器之间通过建立一个 TCP 连接完成相应操作,POP 服务端监听端口是 110,常见的 POP 操作命令及服务端响应码如下:


    同样,我们可以在 TELNET 中通过上述命令模拟邮件收取操作:

    在邮件客户端软件中收取邮件就更简单了,只要你配置了正确的 POP 服务器与对应的用户名和密码,每次打开邮件客户端都会自动收取邮件。

    IMAP 协议

    此外,我们在配置邮件客户端的时候,经常还会看到 IMAP 选项:

    IMAP (Internet Message Access Protocol,互联网邮件访问协议)也是接收电子邮件的协议。

    它与 POP 协议的区别在于:在 POP 中邮件由客户端管理,而在 IMAP 中邮件由服务器管理。因此,在使用 IMAP 时,可以不必从服务器下载所有邮件就可以阅读。因为 IMAP 是在服务器上处理 MIME 信息,所以它可以实现一封邮件中有 10 个附件时只下载其中 7 个这样的功能,这在带宽较窄的线路上非常有用。而且 IMAP 在服务器上对「已读/未读」信息和邮件进行分类管理,因此,即使在不同的计算机上打开邮箱,也能保持同步,这样一来,人们就可以通过个人电脑、手机、公司电脑连接到 IMAP 服务器后接收邮件,并且同步状态。

    显然,在多种异构终端中,使用 IMAP 协议收取电子邮件更方便。

    IMAP 服务端监听端口一般是 143,我们可以在 TELNET 终端中通过命令模拟通过 IMAP 收取邮件:

    常见的 IMAP 相关指令如下:

  • 相关阅读:
    Golang Web入门(3):如何优雅的设计中间件
    Golang Web入门(2):如何实现一个高性能的路由
    基于MySQL 的 SQL 优化总结
    Redis系列(七)Redis面试题
    Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩
    Redis系列(五)发布订阅模式、主从复制和哨兵模式
    Redis系列(四)Redis配置文件和持久化
    Redis系列(三)Redis的事务和Spring Boot整合
    Redis系列(二)Redis的8种数据类型
    Redis系列(一)Redis入门
  • 原文地址:https://www.cnblogs.com/stringarray/p/12968521.html
Copyright © 2020-2023  润新知