首页
登录 | 注册

3 分钟带你了解一封邮件的发送过程

背景

我们常使用邮件客户端,如 Foxmail 、Outlook 等收发邮件。大家应该了解邮件协议基础知识吧,发送邮件是通过 SMTP 协议完成,收取邮件则走的是 POP3 协议。由于工作原因,笔者曾对邮件协议的通信过程进行过完整的分析,这里整理下邮件协议的通信过程,以巩固对通信协议的理解。

协议是什么

我曾经做过一个基于 UDP 字节序列的应用:两个进程【一个用 Java 开发,另一个 是C++ 进程】之间,通过逐个解析 UDP 数据包中的字节数据完成通信业务,最小业务数据单位是比特。

大概的流程是这样子的:

  1. 循环读取 UDP 数据包
  2. 先取出第一个字节
  3. 再读取这个字节的前 2 个 bit 数据,它代表某一种业务类型
  4. 紧接着的 6 比特代表业务数据总长度
  5. 再循环读取第二个字节以后的数据,直到达到总长度

很多年过去了,已经忘记了那个应用的具体功能,但是对 UDP 字节数据的解析流程依然清晰。它让我理解了什么是协议,这其实就是一种基于简单处理规则的通信协议,也算是一种自定义的应用层协议了吧。

由此推及到 OSI 七层模型中的其他协议,它们跟这种简单约定类似,只不过通信规则更复杂一些!

SMTP 协议基础

SMTP 全称为「 Simple Mail Transfer Protocol 」,这是来自百度百科的解释:

SMTP 是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet 程序来测试一个SMTP服务器。SMTP 使用 TCP 端口 25,要为一个给定的域名决定一个 SMTP 服务器,需要使用 MX (Mail eXchange) DNS。

先来了解一下 SMTP 的状态码和命令集:
3 分钟带你了解一封邮件的发送过程

接着,我们来看看对 Foxmail 发送邮件的抓包分析。报文中,包含状态码的是邮件服务器响应的内容,命令则是客户端发起的。

认证

一个 SMTP 通信是由客户端发起连接邮件服务器开始的,这是我截取到的解析后的通信内容:
3 分钟带你了解一封邮件的发送过程

这里用到的关键命令是 EHLOAUTH LOGIN,用来发起会话和身份认证, 客户端连接上服务器后的通信过程为:

  1. 服务器回复 220 状态码,告知客户端它已经准就绪;
  2. 客户端发送 EHLO 命令;
  3. 服务器回复 250 ,表示欢迎;
  4. 服务器又回复一堆 250(对应中间那几步);
  5. 客户端发起 AUTH LOGIN 身份认证;
  6. 服务器回应 334 等待客户发送认证信息;
  7. 客户端发送认证信息的密文数据,如此两次密文通信;
  8. 服务器回复 235 认证成功,身份认证流程完成。

准备

身份认证成功后,客户端向服务器端发送发件箱、所有收件箱地址,服务器验证无误后回复 250 OK。
3 分钟带你了解一封邮件的发送过程

数据发送

3 分钟带你了解一封邮件的发送过程

邮件正文发送的过程:

  1. 客户端发送 DATA 命令;
  2. 服务端回复 354 状态码,告知客户端可以发送邮件内容;
  3. 客户端开始发送邮件正文;
  4. 服务器端回复 250 ;
  5. 客户端发送 QUIT 命令结束会话;
  6. 服务器回复 221,告诉客户端它正在关闭传输通道。

总结

以上就是一封邮件所经历的完整过程,像是客户端和服务器隔空喊话一样,每一步都有问有答、井然有序。这么看一遍,发现还是通信协议还是蛮有意思的,这大概是应用层协议的一般思路吧,定义业务规则和状态码,按照双方约定好的流程进行通话。

理解这个过程后,如果工作中碰到需要进行通信的时候,可以参考网络协议的设计思路,实现基于 Socket 的通信业务应该是不复杂的!


相关文章

  • 什么邮箱最安全?安全邮箱推荐
    作为一个职场人,一周连续加班连轴转.熬夜奋战到凌晨已是常事.时光飞逝,00后都即将迈入社会,身为80后.90后的你早已经被叫做张哥.王姐甚至阿姨了,尤其是身处一.二线城市的人们,再不拼命工作升值加薪走上人生巅峰,很快就会被后浪推出好几条街了 ...
  • 4折购书福利,再送你畅销新书
    4折购书福利,再送你畅销新书   福利一: 扫描下方小程序选购你心仪的图书吧! 423世界读书日图书每满 100 减 50 结算时输入优惠码:UJ7UW7(实付200再减30) 可与每满 100 减 50 活动叠加使用! 也就是说只要花17 ...
  • 一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!
    本文来自我的知识星球的球友投稿,他在最近的校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由作者--泽林提供,部分答案由Hollis整理自知识星球<Hollis和他的朋友们>中「直面Java」板块. 经历了漫长一个月的 ...
  • 阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?
    轻松筹首创了"大病救助"模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题.而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后,是日益增长的各种数据.面对这样数据量所造成的巨大挑战,阿里 ...
  • 阿里新一代分布式任务调度平台Schedulerx2.0破土而出
    1. 产品简介 Schedulerx2.0是阿里中间件自研的基于Akka架构的新一代分布式任务调度平台,提供定时.任务编排.分布式跑批等功能.使用Schedulerx2.0,您可以在控制台配置管理您的定时任务,查询历史执行记录,查看运行日志 ...
  • 源码|详解分布式事务之 Seata-Client 原理及流程
    前言 在分布式系统中,分布式事务是一个必须要解决的问题,目前使用较多的是最终一致性方案.自年初阿里开源了Fescar(四月初更名为Seata)后,该项目受到了极大的关注,目前已接近 8000 Star.Seata 以高性能和零侵入的特性为目 ...

2019 jeepshoe.net webmaster#jeepshoe.net
13 q. 0.351 s.
京ICP备10005923号