一、SMTP组成部分
SMTP协议是互联网上最古老的应用之一,是电子邮件所采用的协议,是电子邮件发送电子邮件时的协议。
它包括3个组要组成部分。
(1)用户代理
(2)邮件服务器
(3)邮件协议
二、用户代理
用户代理:运行在客户端的软件。
作用:
(1)它允许用户阅读,回复,转发,保存,编辑邮件消息。
(2)发送/接收邮件消息到/从服务器。
(3)运行邮件协议。
三、邮件服务器
邮件服务器:也就是我们常说的邮箱存放的位置。
作用:
(1)用邮箱存放用户接收的邮件消息。事实上现在绝大部分邮件服务器也同时存放发送的邮件。
(2)在邮件服务器上有一个外出报文队列,在里面放的是用户将要发送的邮件。邮件服务器可能需要很多邮件要发送,这时需要排队。
(3)运行邮件信息。邮件服务器要通过运行邮件协议来进行邮件的发送。
四、邮件协议
用户代理和邮件服务器都运行邮件协议,下面我们来看一下邮件协议。
1、分类
邮件协议主要分为邮件发送协议和邮件收取协议,本篇将讲发送。在邮件应用中发送与收取是分开的,这种设计模式有助于将某个应用模块化或者分离化。
2、特点
(1)使用TCP协议
(2)服务器端口号为25
(3)直接传送:SMTP协议是一种直接传送的协议。即发送服务器与接收服务器直连,没有经过中转。
(4)采用命令/应答的交互方式。
命令:ASCII文本格式
应答:状态码及其短语
(5)邮件消息必须是7-bit ASCII:邮件消息必须是标准ASCII码,因为邮件协议比较古老,设计者在设计邮件协议时并没有考虑到其他国家即非英语的国家使用邮件时怎么办。
3、三个阶段
(1)握手
(2)传输邮件消息
(3)结束
下面我们来举一个例子更直观的了解:

Alice发送电子邮件给Bob过程:
(1)Alice使用用户代理编写发给bob@someschool.edu的邮消息。
(2)Alice的用户代理发送邮件消息到她的邮件服务器;邮件消息被存放在邮件消息队列。
(3)Alice邮件服务器的SMTP客户端发起建立一个到Bob的邮件服务器的SMTP服务器端的TCP连接,然后经过应用层握手。
(4)SMTP客户端在这个TCP连接上发送Alice的邮件消息。
(5)Bob服务器收到邮件,存放邮件消息到Bob的邮箱。
(6)Bob调用他的用户代理读取邮件消息。
下面我们来看一下SMTP客户端和服务器的命令交互:

蓝色:我们需要输入的命令
黑色:给出的应答
(1)当我们连接服务器时,服务器会给出一个220响应,表示连上了。
(2)之后客户端要握手,握手的命令是HELO,后面给出一个域。
(3)S给出250回应,表示握手成功,后面的短语也可以自己定义。
(4)接下来C给出MAIL FROM命令告诉服务器我要以这个电子邮件作为发送方来发送邮件。
(5)S继续给出250表示可以发送。
(6)然后C使用RCPT TO命令来给出我要将邮件发送到哪个地址。
(7)服务器端收到命令以后再次给出250回应表示可以.
(8)给出354的提示告诉客户端你现在可以写邮件了,邮件要以单独的句号作为结束,而且句号必须独占一行。
(9)接下来就是客户端写邮件,当写完以后送到服务器端。(10)服务器端再次给出250回应表示这个消息被接收了放到队列里准备被发送。
(11)C给出QUIT命令退出。
(12)S给出221回应表示连接结束。
注意:SMTP通过回车换行、句号、回车换行来判断消息的结束。
五、与HTTP的比较
(1)HTTP是拉协议,即用户把消息拉下来;SMTP是推协议,即用户把消息推出去。
(2)都有ASCII命令/应答交互,状态码。
(3)HTTP:每个对象封装在它各自的HTTP响应消息中发送;SMTP:一个邮件内各个对象置于同一个邮件消息的多目的发送。

















