电子邮件的组成:信封、首部和正文

电子邮件由三部分组成,下图是 Client 发送的整个数据:
 

  1. 信封(envelope)
     
    信封是 MTA 用来交付的,在上例中由两个 SMTP 命令指明;
     
    MAIL From: rstevens@sun.tuc.noao.edu
    RCPT To: estevens@noao.edu

  2. 首部(header)
     
    首部由用户代理使用,上例中可以看到 9 个首部字段:Recived、Message-Id、From、Date、Reply-To、X-Phone、X-Mailer、To 和 Subject
    (以 X- 开头的是用户定义的字段,其他是由 RFC 822 定义的,详见 4.1 节)

  3. 正文(body)
     
    正文是发送用户发给接收用户报文的内容,RFC 822 指定正文为 NVT ASCII 文字行,用 DATA 命令发送的各行都必须小于 1000 字节

 
用户接收我们指定为正文的部分,加上一些首部字段,并把结果传到 MTA;MTA 加上一些首部字段,加上信封,并把结果发送到另一个 MTA

 
(更多实现细节,详见 RFC 2821

 
 

用 TCP 进行的邮件交换是由报文传送代理 MTA(Message Transfer Agent)完成的。

 
TCP/IP 交换电子邮件示意图:

 

邮件基础协议

邮件基础的网络协议有以下三个,一般我们使用 SMTP 协议来发送邮件,POP3 和 IMAP 协议来接收邮件(从服务端接收邮件至客户端)

  • 下表中 IMAP 协议支持发送邮件并不是邮件投递,而是通过 append 指令将邮件从客户端上传到服务端
协议 工作端口(括号内为 SSL) 支持发送邮件 支持接收邮件
SMTP 25(465) True False
POP3 110(995) False True
IMAP 143(993) True True

 


SMTP

两个 MTA 之间通过 NVT ASCII 进行通信,客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应
 
下图是 SMTP 的一个交互会话过程:
 

  1. 键入 mail -v 启动用户代理; 键入 subject(主题)和正文
  2. 主动打开 port:25 ;等待从 Server 返回的问候报文(应答码220)
  3. HELO:标识自己(参数必须是合格的主机名)
  4. MAIL:标识报文发起人
  5. RCPT:标识接收方(可发多次,标识多个接收方)
  6. DATA:邮件报文内容
  7. QUIT:结束邮件交换

下图是发送方 SMTP(Client)和接收方 SMTP(Server)之间的一个 SMTP 连接:
 

SMTP 指令

最小SMTP支持 8 个命令,除了上述 5 个命令还有:

  • RSET:异常中止当前的邮件事务并使两端复位。丢掉所有有关发送方、接收方或邮件的存储信息
  • VRFY:使客户询问发送方以验证接收方地址,而无需向发送方发送邮件(通常用与管理员查找邮件交付差错中使用)
  • NOOP:强迫服务器响应一个OK应答码(200)

(另外还有一些附加可选命令)

 
SMTP 用半双工的形式使用 TCP,客户发送一个命令后停止等待应答;实际上 Client 可以一次发多个命令,称为流水线技术(pipelining)

如果使用了这种技术,Client 则不能丢弃报文直到所有的应答都已检查过,确认报文被服务器接收了

使用 Telnet 模拟 SMTP 发送邮件


POP3

POP3 协议相对 SMTP/IMAP 要简单一些,协议的指令也不多

POP3 的生命周期

POP3 命令以 CRLF 对结束,特定命令多行响应,以 CRLF.CRLF 结束

在服务器打开邮件后,它为每个消息指定一个消息号,并以八进制表示每个消息的长度。第一个消息被指定为 1,第二个消息被指定为 2,以此类推,第 N 个消息被指定为 N
在POP3命令和响应中,所以的消息号和长度以十进制表示

AUTHORIZATION

  • USER :客户确认身份(参数:username)
  • PASS :身份确认完成
  • QUIT :终止 POP3 会话
  • APOP :用于替代 USER 和 PASS 命令,它以 MD5 数字摘要的形式向POP3邮件服务器提交帐户密码(参数:用户名/密钥)(该命令实现可选)

安全性:每个 POP3 会话都以 USER/PASS 互换开始,导致了用户名和口令在网络上的显式传送,当服务连接频率变大、时间间隔小,就会加大了泄密的可能
(使用APOP:随着密钥长度的增加,解读的难度也会上升)

TRANSACTION

操作状态下的命令:

  • STAT :查询邮箱中的统计信息(邮件数量和所有邮件大小)
  • LIST :列出邮箱中的所有邮件信息(消息号/大小)(参数:MSG 列出对应消息号的邮件信息)
  • RETR :获取某封邮件的内容(参数:MSG)
  • DELE :将某封邮件标记为删除(参数:MSG)(被标记的邮件直到当前会话进入 UPDATE 状态才被删除)
  • NOOP :检测连接状况
  • RSET :取消删除标记

UPDATE

当客户在 AUTHORIZATION 状态下发送 QUIT 命令后,会话进入 UPDATE 状态
如果会话因为 QUIT 命令以外的原因中断,会话并不进入 UPDATE 状态,也不从服务器中删除任何信件

 
(更多实现细节,详见 RFC 1939


IMAP

IMAP 协议通过 port:143 来提供电子邮件的收发服务,和 POP3 被用来提供电子邮件客户端服务(从服务器检索电子邮件)
相对于 POP3,IMAP 支持多个电子邮件客户端同时管理邮箱,并可以通过邮件的标签/状态,监测到其他用户对于邮件的操作
 
IMAP 还支持在线/离线两种操作模式,客户端可以获得邮件副本存储在本地

标志消息属性

与邮件关联的有一个或多个 token list,将 flag 添加至列表可以设置邮件的属性,每个 flag 可以设置为永久的或临时的(当前会话)

\Seen 邮件已阅读
\Answered 邮件已回复
\Flagged 邮件被标记为紧急/特别关注
\Delete 邮件被标记删除(to EXPUNGE)
\Draft 邮件被标记为草稿
\Recent 邮件最近到达该邮箱(本次会话是首次收到当前邮件通知)

具体的实现与服务器相关

状态和流程图

Client 和 Server 建立好连接后,IMAP 连接处于四种状态之一
最初的状态在服务器的 greeting 报文中标识,客户端在不当状态中尝试的命令服务器都将以 BAD/NO 响应(取决于实现)

  • Not Authenticated State :未经认证的状态,连接启动时进入该状态,除非已进行预验证
  • Authenticated State:认证状态,可选择邮箱进行访问
  • Selected State:选定状态,已选择一个邮箱访问
  • Logout State:退出状态,连接正在终止(LOGOUT 命令)

服务器必须发送 BYE 响应来关闭连接,同样的,客户端应该发送 LOGOUT 命令来关闭连接

如果服务器检测到客户端单方面关闭了连接,则可以省略 BYE 响应

IMAP 命令

下面罗列一些常见的 IMAP 命令

客户端命令 —— 任何状态

  • CAPABILITY:查询服务器实现的功能
  • NOOP:检测连接
  • LOGOUT:终止当前连接

客户端命令 —— 未经认证的状态

  • STARTTLS:与服务器使用 TLS 进行交互
  • AUTHENTICATE:与服务器的认证机制
  • LOGIN:鉴权登陆,输入用户名与密码

客户端命令 —— 认证状态

  • SELECT:选择邮箱
  • EXAMINE:以只读方式选择邮箱
  • CREATE:创建一个邮箱
  • DELETE:删除一个邮箱
  • RENAME:重命名邮箱
  • SUBSCRIBE:订阅指定邮箱
  • UNSUBSCRIBE:取消订阅邮箱
  • LSUB:返回订阅邮箱列表
  • APPEND:追加一个State,例如可以保存一封新的邮件

客户端命令 —— 选定状态

  • CHECK:检查当前服务器状态(例如:磁盘,内存等)
  • CLOSE:永久删除所有消息
  • EXPUNGE:永久删除所有消息,与 CLOSE 不同的是,将返回每个消息标识
  • SEARCH:类似 find 命令,功能很强大可以按照不同条件搜索邮件
  • FETCH:检索与消息相关数据,例如:获取正文
  • STORE:改变与消息相关数据,例如:设置邮箱已读、删除状态等
  • COPY:拷贝指定的消息
  • UID:返回 UID 列表用于 FETCH

邮箱基础协议:SMTP/POP3/IMAP的更多相关文章

  1. 常用电子邮件协议服务POP3/IMAP/SMTP/Exchange

    标题: 常用电子邮件协议服务POP3/IMAP/SMTP/Exchange 作者: 梦幻之心星 347369787@QQ.com 标签: [电子邮件, 服务, 协议] 目录: [客户端] 日期: 20 ...

  2. 电子邮件的三个协议: SMTP、IMAP、POP3

    个人总结: 读完这篇文章需要10分钟 讲解了跟电子邮件有关的三个协议: SMTP(simple message transfer protocol 简单信息传输协议 IMAP (internet me ...

  3. 常用邮箱的服务器(SMTP/POP3)地址和端口总结

    163.com: POP3服务器地址:pop.163.com(端口:110) SMTP服务器地址:smtp.163.com(端口:25) 126邮箱: POP3服务器地址:pop.126.com(端口 ...

  4. POP3、SMTP、IMAP和Exchange的区别在哪里?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:永遇乐链接:http://www.zhihu.com/question/24605584/answer/29039357来源: ...

  5. POP3是收邮件的协议,SMTP是发邮件的协议,IMAP是一种邮箱通信协议。

    我也是第一次接触这种服务,是因为我自己在做一个小小的自动推送天气情况到自己邮箱.所以才碰到这个的/ 看一下标题,我们可以先这样理解. POP3(Post Office Protocol - Versi ...

  6. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

  7. 邮件协议POP3/IMAP/SMTP服务的区别

    2016年09月09日 09時51分 wanglinqiang整理 通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 PO ...

  8. Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址

    我们在客户端设置邮箱或者使用 PHPMailer 发送邮件的时候,我们都会去查找这些邮箱的 IMAP/SMTP/POP3 地址,这里就列出 Gmail, QMail, 163邮箱这三个常用邮箱的这些地 ...

  9. POP3、SMTP和IMAP基础概念

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...

随机推荐

  1. QlikSense主题开发

    // 主题是qliksense 2018年2月版提出,4月版正式实施,其实就是去修改sense默认的.json文件和.css文件 { // 定义自定义主题是否从默认主题(Sense Classic)继 ...

  2. Scrapy 框架入门简介

    一.Scrapy框架简介 Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. ...

  3. 面经-科大讯飞AI研究院

    面试时间:2019.06.27 电话面试 面试岗位:计算机视觉算法工程师/一面 面试时长:45分钟 面试内容: 自我介绍 简历中选择一个项目介绍-视频召回 问及项目中的语音.人脸.标题.模态缺失相关细 ...

  4. C语言博客作业006

    问题 答案 这个作业属于那个课程 C语言程序设计1 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/ 我在这个课程的目的是 学习并掌握 ...

  5. MIT线性代数:20.克拉默法则,逆矩阵和体积

  6. STL&&用法集合

    .....STL是c++里很强势很好用的一系列容器(函数)之类的,之前一直不太会用,所以总是暴毙....想着快比赛了,是时候理一下这些东西了. -1.pair 存放两个基本元素的东西 定义方法: pa ...

  7. 算法编程题积累(3)——腾讯笔试"构造回文“问题

    首先理解题意,回文串的特点:倒序后跟原串相同.故而可以将原串看成向一个回文串在任意位置添加任意字符后形成的字符串,也就是说原串中存在一段未必连续的回文序列. 通过分析可以知道AC本题的核心思路:求出回 ...

  8. python面试看这一篇就够了

    python-面试通关宝典 有面Python开发方向的,看这一个repo就够啦? 语言特性 1.谈谈对 Python 和其他语言的区别 Python属于解释型语言,当程序运行时,是一行一行的解释,并运 ...

  9. map集合中哪些是线程安全的

    为什么HashMap是线程不安全的 总说 HashMap 是线程不安全的,不安全的,不安全的,那么到底为什么它是线程不安全的呢?要回答这个问题就要先来简单了解一下 HashMap 源码中的使用的存储结 ...

  10. docker初解

    1 什么是容器 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出. 隔离的环境拥有自己的系统文件,ip地址,主机名等 容器是一种软件打包技术 程序:代码,命令进程:正在运行的程序容器的 ...