邮件传输过程

通常,一封电子邮件的发送需要经过用户代理、客户端邮件服务器和服务端邮件服务器等三个程序的参与,并使用邮件传输协议(SMTP,POP3或IMAP)来发送和获取邮件。
网络基础之邮件传输协议-编程之家网络基础之邮件传输协议-编程之家

  • 使用邮件客户端收发邮件
    电子邮件从 A 发送到客户服务器是使用 SMTP 协议。两个邮件服务器之间的传送使用 SMTP。B从服务端邮件服务器获取邮件使用POP3或IMAP协议。常见的邮件客户端有Foxmail,Outlook Express等
    网络基础之邮件传输协议-编程之家
  • Webmail
    电子邮件从 A 发送到客户服务器是使用 HTTP 协议。两个邮件服务器之间的传送使用 SMTP。邮件从服务端邮件服务器传送到 B 是使用 HTTP 协议。
    网络基础之邮件传输协议-编程之家
  • 邮件服务器各组件关系图

• MUA(Mail User Agent):用户代理,提供邮件编辑,查看功能;
• MTA(Mail Transfer Agent): 邮件传输代理,负责传送和接收邮件;
• MDA(Mail Dilivery Agent): 邮件投递代理,负责将MTA接收到的
• 邮件传递到用户邮箱或转递其他MTA,兼具有过滤功能。

网络基础之邮件传输协议-编程之家

SMTP协议

SMTP 使用客户/服务器方式,负责发送邮件的 SMTP 进程是 SMTP 客户,而负责接收邮件的 SMTP进程是 SMTP 服务器,当两个进程建立了TCP连接后,电子邮件就能通过该标准准确无误地传输;
SMTP协议是基于文本的协议,通过SMTP发送的电子邮件都是普通文本格式的,不支持声音、图像等非文本信息,但可以通过MIME标准将此类信息进行编码后再通过SMTP传输;
SMTP 规定了 14 条命令和 21 种应答信息。每条命令用 4 个字母组成,而每一种应答信息一般只有一行信息,由一个 3 位数字的代码开始;

SMTP 命令

SMTP简捷,命令很少,常用的只有以下的8条命令,这些 命令由客户端发送请求给服务端
网络基础之邮件传输协议-编程之家

SMTP 应答码

每一条SMTP命令都会返回一条SMTP响应,由服务端返回给客户端
网络基础之邮件传输协议-编程之家

SMTP 传输流程图

  1. 客户端主动连接到服务器的25端口,建立TCP连接。服务器会发送一个应答码为220的问候报文,表示已经准备就绪。
  2. 客户端向服务器发送HELO命令以标识发送方身份,若服务器接受请求,则返回一个代码为250的应答,表示可以开始报文传输。
  3. 客户端发送MAIL命令以标识邮件发送方身份,通过FROM参数指定发送方的邮件地址。若服务器准备接收,则返回250的OK应答。
  4. 客户端发送RCPT命令标识邮件的接收方,通过TO参数指定接收方的电子邮件地址,若有多个接收人,可发送多个RCPT命令。如果服务器能够识别接收人,则会返回代码为250的OK应答,否则返回代码为550的失败应答。
  5. 客户端与服务器之间的协商结束,客户端发送DATA命令指示将要发送邮件数据,服务器端返回应答码为354的响应进行确认,表示可以开始邮件输入。
  6. 客户端将邮件内容按行发送,邮件的末尾由客户端指定,是只有一个小数点(邮件数据结束指示器)的一行,服务器检测到邮件数据结束指示器后,返回代码为250的OK应答。
  7. 客户端发送QUIT命令终止连接。
    注: 由于SMTP不需要身份验证,人们连接到邮件服务器就能随便给一个知道的邮箱地址发送邮件,造成垃圾邮件泛滥。后来就有了ESMTP (Extended SMTP)。他和 SMTP 服务的区别仅仅是,使用 ESMTP 发信时,需要经过身份验证才能发送邮件。即在HELO命令后多加一条auth login登陆命令,登陆成功后才能使用后续的发送邮件命令。
    网络基础之邮件传输协议-编程之家

电子邮件的信息格式

每一封电子邮件的结构格式为:
• 报文头(Header)
• 分隔邮件头与邮件体的空行
• 报文体(Body)
报文头是一些控制信息,它是由一系列的头字段组成,每个头字段的结构格式是:
字段名(field-name):字段体(field-body)
包括收方和发方的地址,发送时间等,常用的头字段有:
-Date域:记录邮件发送日期(本地主机的日期和时间);
-Subject域:邮件主题;
-From域:发信人邮件地址;
-To域:收信人邮件地址;
……
报文体是用户邮件内容,由用户自由撰写。但SMTP只支持传输7位ASCII码的英文字符,有很大局限性,后来邮件系统就扩展了MIME。
网络基础之邮件传输协议-编程之家

关于MIME

MIME扩展了基本的面向文本的Internet邮件系统,在不改动现有邮件协议的情况下,实现了用标准的文本格式邮件传输非文本(二进制)数据的功能。MIME的原理是将二进制数据转化为文本格式,然后再进行传输。
MIME扩包括三部分内容:新增了5个首部字段名,这些字段提供了邮件的主题信息;新增了许多邮件内容,对多媒体的表示方法进行标准化;定义了编码方法,可对任何内容进行准换。
网络基础之邮件传输协议-编程之家

POP3协议

POP是一种邮件接收协议,其作用是:当用户计算机与支持POP协议的电子邮件服务器连接时,把存储在该服务器的电子邮箱中的邮件准确无误地下载到用户的计算机中。POP3属于离线式协议,即不能对邮件进行在线操作,必须下载到本地才能进行处理。POP协议已发展到第三版,称作POP3。 
POP3与SMTP一样都是请求响应协议,命令与响应也都是用NVT ASCII格式的文本表示。POP3响应由一个状态码和其后的附加信息组成,只有两种状态码:“+OK”(正确)和“-ERR”(失败)。

POP3 命令

网络基础之邮件传输协议-编程之家

POP3 连接

在POP3中,客户端与服务器,连接时有三种处理状态:

  • 身份验证状态
  • 事务处理状态
  • 更新状态

当客户端连接到服务器的110端口,并建立起TCP连接后,即进入身份验证状态,需要使用USER和PASS命令将用户名和密码提供给服务器。
通过身份验证之后,即转入事务处理状态,这时客户端可以发送POP3命令进行相应操作,服务器会接收命令并做出响应。
操作完成之后,客户端发出QUIT命令,则进入更新状态,服务器确认用户的操作,更新邮件存储区,同时关闭客户端与服务器之间的连接。

网络基础之邮件传输协议-编程之家