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

电子邮件由三部分组成,下图是 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. vue表单属性

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 简要概括java技术体系

    以前一直在学java程序设计语言,学完了就以为自己已经把java学得差不多了,直到最近在看一本书<深入理解java虚拟机>,才发现自己以前学的只不过是冰山一角.相信很多小伙伴跟我一样,在没 ...

  3. UE4蓝图与C++交互——射击游戏中多武器系统的实现

    回顾   学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...

  4. 运用ffmpeg实现压缩视频

    /// <param name="filePath">ffmpeg.exe的文件路径</param> /// <param name="Pa ...

  5. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  6. 通俗易懂了解Vue双向绑定原理及实现

    看到一篇文章,觉得写得挺好的,拿过来给大家分享一下,刚好解答了一些困扰我的一些疑惑!!! 1. 前言 每当被问到Vue数据双向绑定原理的时候,大家可能都会脱口而出:Vue内部通过Object.defi ...

  7. StringBuffer 和 StringBuilde

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  8. C++中对C的扩展学习新增语法——函数重载

    函数重载 1.函数重载语法 1.同一个作用域(全局作用域.命名空间作用域.类作用域) 2.参数个数不同 3.参数类型不同 4.参数顺序不同 代码实现: 当函数名字一样的时候,通过参数类型.参数个数.参 ...

  9. ubuntu18+uwsgi+nginx部署django项目

    更新系统软件源 sudo apt-get update pip3安装 sudo apt install python3-pip 安装virtualenvwrapper pip3 install vir ...

  10. linux命令指令

    1.ls显示目录内容 -a 显示目录下所有文件 -l 显示详细信息 ls *.c  列出当前目录所有的.c文件 2.uname -a  查看内核版本 3.whoami  查看谁登陆虚拟机 4.cd 切 ...