邮件和他的协议们,看不懂算我输(SMTP,MIME,POP,IMAP)

662 阅读9分钟

本文对邮件中经常提到的 SMTP,MIME,POP,IMAP 四种协议进行介绍,帮助大家对邮件协议有一个基础的认识。

1. SMPT与MIME协议

一个最简单纯粹的邮件发送流程中只涉及三个对象,邮件发送方,邮件接收方以及邮件本身。

在这个最简单的邮件传输过程中,涉及到邮件最基础,最根本的两个协议:SMPT与MIME协议。

  • SMPT(Simple Mail Transfer Protocol,简单邮件传输协议)是邮件的传输协议,属于应用层协议。
  • MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)是邮件的内容协议,不涉及网络传输。

SMPT与MIME之间的关系就有点像HTTP与HTML,相互配合,互不干涉。

image.png

1.1. SMTP邮件协议

1.1.1. 一次完整的SMTP流程

SMTP协议和HTTP协议同属于应用层协议,基于TCP协议实现,SMTP专用于邮件在网络系统中的投递。在SMTP协议中,SMTP Client主动发起网络请求,经过对收件方邮箱的DNS域名解析,将网络请求路由到SMTP Server端,之后建立TCP链接,在TCP链接中进行SMTP协议报文的推送:

image.png

1.1.2. SMTP Client的常用命令

  • HELO @server.com <CRLF>:请求与service建立SMTP通道
  • RCPT TO suta@server.com <CRLF>: 邮件接收者的地址
  • DATA <CRLF>: 邮件数据,以 结尾
  • QUIT:结束SMTP

1.1.3. SMTP service的常用响应码

  • 220 suta@client.com:标识服务器准备就绪
  • 250: 操作成功
  • 221:结束SMTP
  • 354:开始邮件内容输入
  • 421:服务器未就绪,关闭通道
  • 452:系统存储不足
  • 450:邮箱不可用
  • 451 - 请求的动作未完成,错误引起暂时失败
  • 452 - 请求的动作未完成,系统存储分配尽
  • 500 - 语法错误,命令无法识别
  • 501 - 语法错误,参数不正确
  • 502 - 命令不可实现
  • 503 - 命令序列错误
  • 504 - 命令参数不支持
  • 550 - 用户不存在
  • 551 - 用户非本地,请尝试
  • 552 - 询问超出存储分配
  • 553 - 请求操作未完成,邮箱名不合法
  • 554 - 操作未执行,邮箱名不存在

SMTP错误码分类:

4xx:临时错误,表示当前请求失败,但可以稍后重试。一般会导致软退信(可重试)
5xx:永久错误,表示请求无法完成,通常是由于配置错误或无效的输入。一般会导致硬退信(不可重试)

错误码 举例:

421:服务不可用,邮件服务器正在关闭连接,稍后再试(软退信)
450:收件人邮箱暂时不可用或邮件服务器忙碌(软退信)
451:邮件服务器遇到临时错误,稍后再试(软退信)
452:收件人邮箱空间不足(软退信)

550:收件人邮箱不存在或被拒绝接收邮件(硬退信)
552:邮件过大,超出收件人邮件服务器的接收限制(硬退信)
553:发件人地址无效或被拒绝(硬退信)

1.2. 邮件内容与MIME协议

一封完整的邮件包含邮件头与邮件体两部分,邮件头有自己的标准字段,也支持自定义字段;邮件体是真实的邮件内容,而MIME协议是邮件体的一种通用格式。

image.png

1.2.1. 邮件协议头

标准的邮件协议头有以下的内容:

  • 发件人(From):指明发送邮件的邮箱地址和姓名。
  • 收件人(To):指明接收邮件的邮箱地址和姓名。
  • 抄送(Cc):指明同时抄送邮件的邮箱地址和姓名。
  • 密送(Bcc):指明同时密送邮件的邮箱地址和姓名,收件人无法看到这部分信息。
  • 主题(Subject):指明邮件的主题或标题。
  • 日期(Date):指明邮件的发送日期和时间。
  • 回复地址(Reply-To):指明回复邮件的邮箱地址,如果与发件人不同的话。
  • 消息ID(Message-ID):唯一标识邮件消息的ID。
  • 优先级(Priority):指明邮件的紧急程度和重要性。
  • 内容类型(Content-Type):指明邮件内容的格式和编码方式,如文本、HTML、附件等。
  • 报告回执(Return-Receipt-To):指明发送邮件后是否要求接收回执。
  • 附件(Attachments):指明邮件中是否包含附件。
  • 传输路径(Received):邮件传输的路线,可用于分析邮件的来源。

1.2.2. MIME协议

MIME协议可以拆分成三个主要结构:

  • 协议核心字段
  • 协议体内容
  • 协议分隔符

image.png

MIME协议中的字段:

  1. Content-Type:指定邮件消息的内容类型,如文本、图像、音频、视频等。
  2. Content-Disposition:指定邮件消息中附件的处理方式,如内联显示或作为附件保存。
  3. Content-Transfer-Encoding:指定邮件消息内容的编码方式,如base64、quoted-printable等。
  4. Content-ID:指定邮件消息中某个部分的唯一标识符,通常用于引用内联内容或附件。
  5. Content-Description:对邮件消息内容的简短描述。

image.png

```
Content-Type: multipart/mixed; 
  boundary="----=ALIBOUNDARY_1751_7f7f70802700_674ec9b8_613d59" 

------=ALIBOUNDARY_1751_7f7f70802700_674ec9b8_613d59
  Content-Type: multipart/related;
  boundary="----=ALIBOUNDARY_1751_7f7f70802700_674ec9b8_613d5a"
  ------=ALIBOUNDARY_1751_7f7f70802700_674ec9b8_613d5a
    innerData // 内嵌的MIME对应的data
  ------=ALIBOUNDARY_1751_7f7f70802700_674ec9b8_613d5a
------=ALIBOUNDARY_1751_7f7f70802700_674ec9b8_613d59--
```

2. POP3与IMAP协议

基础的SMTP协议就已经可以完成client与server之间的邮件通信了,那么为什么还需要POP3与IMAP协议呢?

SMTP协议要求client与server两者均在线。而在现代的邮件系统中,保持服务实时在线是不现实的,因此,邮件代理服务器就很有必要了。我们常用的gmali、qq、163等都是邮件代理服务器。而POP3与IMAP协议承载的就是用户从邮件服务器拉取邮件的职责。

image.png

以上图的163邮箱用户将邮件发送给Google邮箱用户为例,邮件发送端163用户通过HTTP或者SMTP将邮件上传到163邮件代理服务器,之后由163代理服务器通过上面介绍的标准SMTP协议将邮件发送到Google邮件代理服务器。在接收方的Google用户登录后,邮件通过POP3/IMAP协议触达至接收方。

2.1. POP3协议

协议支持离线邮件处理,当邮件发送到服务器后,电子邮件客户端会调用邮件客户端程序,下载所有未阅读的电子邮件(这种离线访问模式是一种存储转发服务)。当邮件从邮件服务器发送到个人计算机上,同时邮件服务器会删除该邮件。

image.png

POP3客户端通常采用“off-line”离线方式访问邮件服务器,会定时的访问邮件服务器,下载邮件到客户的电脑上,然后和服务器断开。

image.png

2.1.1. POP3协议的常用指令

  • 连接和身份验证: 邮件客户端通过TCP/IP连接到邮件服务器的POP3端口(通常是110)。客户端首先发送USER命令提供用户名,然后发送PASS命令提供密码以进行身份验证。
  • 查看邮件状态: 客户端可以使用STAT命令来查看邮箱中的邮件状态,包括邮件数量和总字节数。
  • 查看邮件列表: 使用LIST命令,客户端可以查看每封邮件的索引号和大小。如果提供邮件索引号,服务器将返回特定邮件的大小。
  • 检索邮件: 使用RETR命令,客户端可以检索特定邮件的内容,包括邮件头和正文。邮件被下载到客户端设备上。
  • 删除邮件: 使用DELE命令,客户端可以标记要删除的邮件。邮件在标记为删除后不会立即从服务器上删除,直到客户端执行QUIT命令。
  • 退出: 使用QUIT命令,客户端结束POP3会话并断开连接。在断开连接之前,标记为删除的邮件将从服务器上删除。

2.2. IMAP协议

2.2.1. IMAP协议概述

IMAP(Internet Message Access Protocol)是一种用于接收邮件的标准协议。除POP3的基础能力外,IMAP允许用户通过邮件客户端从邮件服务器上获取邮件,管理邮件夹,以及搜索和筛选邮件。

image.png

IMAP协议的主要特点包括:

  1. 服务器存储:IMAP允许用户将邮件存储在邮件服务器上,而不是像POP3协议那样将邮件下载到本地设备,这样用户可以从任何设备上访问并同步邮件。
  2. 多邮件夹支持:IMAP支持用户在邮件服务器上创建多个邮件夹,方便用户管理和组织邮件。
  3. 邮件状态同步:IMAP能够同步邮件的读取状态、标记状态等,这意味着用户在不同设备上查看邮件时,邮件的状态会得到同步。
  4. 搜索和筛选:IMAP支持在邮件服务器上进行搜索和筛选,用户可以通过关键词、发件人、收件人等进行邮件搜索。

2.2.2. IMAP支持多设备协同

当我们在多个设备上访问同一个邮箱时,IMAP能同步所有设备对邮箱邮件的操作

image.png

可以看到,在使用上,IMAP协议和我们用HTTP维护的一般Web服务就没啥大的区别了,数据存储在服务端,用户在客户端通过指令或者接口操作服务端的数据。

2.2.3. IMAP协议的常用命令

  • NOOP:检查新邮件,防止超时。
  • LOGIN:用户登录。
  • LIST:邮箱名称列表。
  • APPEND:将邮件添加到指定邮箱。
  • SELECT:选择一个邮箱,并进入该邮箱的工作状态。
  • FETCH:从当前选定的邮箱中获取邮件的内容。
  • STORE:修改邮件的标志或属性。
  • SEARCH:搜索符合特定条件的邮件。
  • EXPUNGE:永久删除标记为删除的邮件。