邮件系统基本的网络协议

发布时间:2020-09-24编辑:脚本学堂
邮件系统基本的网络协议

(1)SMTP
发送方建立起与接收方SMTP的通信。在传输邮件之前,两个SMTP实体可以交换口令或其他鉴别信号,然后发送方发出一个特殊命令,称为MAIL,该命令给出了发送方的标识及一些有关邮件交换的其他信息。接收方必须返回一个对MAIL命令的确认。在SMTP中,该确认可写为250,在另一些文档中,该确认为250 OK。不管是哪一种格式,确认表示所要求的邮件操作完成了。 

 邮件传输过程的下一步是传输RCPT命令以标识报文的目的端,接收方仍必须给出对该命令的一个确认。
 第三步是发送DATA命令。发送方SMTP发出该命令提醒接收方一个报文就要到达了。在发送了该命分之后,发送方SMTP便一行接一行地发送数据,直到发送方发出了一个特殊的控制字符序列,表示报文结束了。这时,服务器使用QUIT命令终止该过程。
 (1.1)地址段格式
 发送方SMTP使用了一个标准的送地址和接收地址格式,它们的形式如下:
local-part@domain-name
因此SMTP名字遵从了域名系统(DNS)的概念,一些系统使用一个服务器,将该名字映射成IP地址。实际应用中,这种格式可能出现为:
Jones@beta.aus.edu
其中本地用户名为Jones,beta.aus.edu是Jones的域标识符。Iocal-part@domain-name还可能采取其他形式以表示如下含义:
2 一个直接的连接(use@host)
 2 邮件接收方位于一台非SMTP主机,通过一个邮件网关接收邮件(user%remote-host@gateway-host)
 2 多台主机间的应答(@host-b@host-c@hostd)

(2)POP3
首先,P O P 3服务器启动P O P 3服务,并监听110端口。当客户机要仅用P O P 3服务时,它先与 POP3服务器建立一条TCP连接。若连接成功建立,POP3服务器向客户端发送一条欢迎消息,然后客户机与POP3服务器之间就可以进入命令交互和响应状态,直到连接关闭或异常中断。
 每个POP3会话总是处于一系列的状态变化中。一旦客户机与POP3服务器之间的TCP连接建立起来并且POP3服务器的欢迎言息传到客户端。POP3会话过程就进入认证状态。在该状态下,客户机必须进行身份验证。一旦验证通过,并且POP3服务器获得足够的资源打开用户的邮箱。这时POP3会话过程进入“命令交互状态”。在“命令交互状态”下,客户端可以向POP3服务器提出各科服务请求,由POP3服务器完成该服务并返回成功或失败的响应信息。当客户端发出“QUIT’命令后,POP3会话过程进入“更新状态”。在“更新状态”下,POP3服务器释放在“命令交互状态”下获得的资源,更新用户邮箱,然后关闭TCP连接。
 (2.1)POP3的基本命令
2 USER
这个命令以用户的帐号名称作为参数。
2 PASS
这个命令以用户的口令作为参数,缺省情况下用户的口令将以明文在网络上传输。
2 STAT
该命令无参数,仅用于“命令交互状态”。
 获取当前用户邮件总数和邮件总大小。POP3服务器返回一个成功的响应,以“+OK”开头,后跟一个空格字符,然后是当前用户邮箱内邮件的总数,之后又是一个空格字符,最后是用户邮件的总大小(BYTES)。
C: STAT
 S: +OK 2320
 2 LIST
该命令可以没有参数也可以有一个参数,该参数代表邮件的序
 号,但该序号不能是已删除邮件。
 该命令仅用于“命令交互状态”。
C: LIST
 S: +OK 2 messages( 320 octets)
 S: 1 120
 S: 2 200
 S: .
 ......
 C: LIST 2
 S: +OK 2 200
 ......
 C: LIST 3
 S: -ERR no such mesage, only 2 message in maildrop.
 2 RETR
该命令必须带有一个邮件序号,该邮件序号不能是已删除邮件。
 该命令仅用于“命令交互状态”。
 若POP3服务器返回一个成功响应,则随后的响应属于多行响应。在首行“+OK”响应之后,POP3服务器把对应于该邮件序号的邮件发送到客户端。
C: RETR 1
 S: +OK 120 octets
 S: < The PoP3 server sends the entire message here>
 C: RETR 5
 S: -ERR no such message.
 2 DELE
该命令必须带一个邮件序号参数。仅用于“命令交互状态”
POP3服务器把该邮件标志为“已删除”,之后,任何对该邮件的操作都将返回错误。POP3服务器并不实际删除该邮件,除非POP3会话进“更新状态”。
C: DELE 1
 S: +OK message 1 deleted
......
 C: DELE 1
 S: -ERR message 2 already deleted
 2 NOOP
该命令不待参数,实际上也不做任何事情。仅用于“命令交互状态”。
C: NOOP
 S: +OK
 2 RSET
该命今不带参数。仅用于“命令交互状态”。
POP3服务器将所有已被标志为删除的邮件的删除标志取消,并返回成功响应。
C: RSET
 S: +OK maildrop has 2 messages ( 320 octets)
 2 QUIT
该命令无参数,仅用于“命令交互状态”。
POP3服务器把所有已标志为删除的邮件删除,并释放在“命令交互状态”中获得的资源,然后关闭TCP连接,POP3会话结束。

2.SMTP
 1、概述
SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。
 协议的原理很简单。无非是一个客户端计算机向服务器发送命令,然后服务器向客户端计算机返回一些信息。客户端发送的命令以及服务器的回应都是字符串。
 首先要与邮件服务器连接,服务器将返回文本。该文本包含一个三位数的代码及描述,例如:
220-ns.cinfo.ru sendmail 8.6.12/8.6.9 ready at Wed, 22 Apr 1998 22:54:41 +0300
 220 ESMTP spoken here
这些描述可能会因服务器而异。只须要知道代码所代表的意思就行了。代码220表示成功建立连接,服务器等待你的第一个命令。
 向服务器传递的第一个命令是HELO. 该命令包含一个参数,即你的邮箱名。
HELO oleg
注意: 在RFC821中,HELO是一个可选择性命令,如果服务器不要求该命令的话,你可以把它忽略掉。
 如果命令成功,服务器会返回一个代码为250的回应。
 下一步用MAIL FROM命令告诉服务器你想发一封邮件。该命令以发信人的邮件地址为参数。
MAIL FROM: oleg@vbip.com
发完命令后,如果服务器返回一个代码为250回应,你就可以向服务器发送RCPT TO命令了。
RCPT TO命令以收信人地址为参数,是告诉服务器你想将邮件发到收信人地址处。
RCPT TO: somebody@domain.com
如果你想将邮件发给多个收件人的话。你需要多次使用RCPT TO命令,对每个命令,服务器都会返回代码为250的回应。
 现在可以向服务器发送邮件正文了。
 用DATA命令告诉服务器以下的内容为邮件正文。在你从服务器收到代码为354的回应后,你就可以发送邮件正文了。邮件按行发送,每行邮件以一个无回车的换行符结束,只须按回车键就行了。下面是一个例子:
Subject: My first e-mail message.
 First line of a message.
 Second line.
注意上面最后一行的最后一个字符是一个小数点。这是正文结束的标志。 服务器收到这个标志后,就会立即返回一个代码为250的回应以及该邮件的唯一ID号。
250 WAA10568 Message accepted for delivery
任务完成了,可以继续发送下封邮件,也可以断开同服务器的连接。如果要断开同服务器的连接就用QUIT命令。在这种情况下,服务器会返回一个代码为221的回应并断开连接。
QUIT
 221 ns.cinfo.ru closing connection

2、工作机制
SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。
 一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否能接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答
SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。

3、基本命令(所有的命令都是四个字母组成)
 发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除
 (0)HELO(HELLO)
 HELO〈SP〉〈domain〉〈CRLF>
通知服务器客户的身份。 
 此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态表和缓冲区已经被子清除。
 (1)MAIL
 MAIL FROM:
此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时,它是一个回复路径源,它说明此邮箱是由在表中的主机一一传递发送(第一个主机是最后一个接收到此邮件的主机)过来的。此表也有作向发送者返回非传递信号的源路径。因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可能就是空的。
 此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
 (2)RCPT(recipient)
 RCPT TO:
此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。转发路径中包括一个可选的主机和一个必须的目的邮箱。
 此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个250 OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure应答。此过程可能会重复若干次。
 不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一个主机就是接收命令的主机。
(3)DATA
 DATA
如果命令被接收,接收方返回一个354 Intermediate应答,并认定以下的各行都是信件内容。当信件结尾收到并存储后,接收者发送一个250 OK应答。因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束,在接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。
 注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。
 邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果此命令被接收,接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成或源无效的情况下失败。
 (4)RSET
 RSET
此命令指示当送邮件操作将被放弃。任何保存的发送者,接收者和邮件内容应该被抛弃,所有缓冲区和状态表应该被清除,接收方必须返回OK应答。
 (5)SEND
SENDFROM:〈reverse-path>
此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。参数域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可能就是空的。
 此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
 (6)SOML(send or mail)
 SOMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,或者传送到邮箱中。对于每个接收者,如果接收者终端打开,邮件内容将被传送到接收者的终端上,否则就送到接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到终端或邮箱中此命令成功。
 回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
 此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
 (7)SAML(send and mail)
 SAMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,并传送到邮箱中。如果接收者终端打开,邮件内容将被传送到接收者的终端上和接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到邮箱中此命令成功。
 回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
 此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
 (8)VRFY(verify vt.证实,查证;证明)
VRFY〈string〉
 此命令要求接收者确认参数是一个用户。如果这是(已经知道的)用户名,返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
 (9)EXPN(expand vt.扩大;使膨胀)
EXPN〈string〉
 此命令要求接收者确认参数指定了一个邮件发送列表,如果是一个邮件发送列表,就返回表中的成员。如果这是(已经知道的)用户名,返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
 (10)NOOP
 NOOP
此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是说明接收者发送了一个OK应答。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
(11)QUIT
 QUIT
此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到响应之前也不应该关闭信道。即使出错,也不应该关闭信道。如果连接被提前关闭,接收方应该象接收到RSET命令一样,取消所有等待的操作,但不恢复原先已经做过的操作。而发送方应该象接收到暂时错误(4XX)一样假定命令和操作仍在支持之中。

4、 SMTP响应
 对SMTP命令的响应是多样的,它确定了在邮件传输过程中请求和处理的同步,也保证了发送SMTP知道接收SMTP的状态。每个命令必须有且只有一个响应。
SMTP响应由三位数字组成,其后跟一些文本。数字帮助决定下一个应该进入的状态,而文本对人是有意义的。三位的响应已经包括了足够的信息,不用再阅读文本,文本可以直接抛弃或者传递给用户。特别的是,文本是与接收和环境相关的,所以每次接收到的文本可能不同。在附录E中可以看到全部的响应码。正规的情况下,响应由下面序列构成:三位的数字,,一行文本和一个,或者也可以是一个多行响应。只有EXPN和HELP命令可以导致多行应答,然而,对所有命令,多行响应都是允许的。
 三位的应答码每一位都有特定的意义。每一位应答表示是否是成功的,失败的或未完成的。通过这一位,不复杂的SMTP发送就可以决定下一步的操作,如果发送方希望大概了解究竟出了什么问题,它可以检测第二位,而第三位则保存了最后更完整的信息。也就是说,从第一位到第三位,接收方可以一步比一步精确地确定接收方的状态。
 (1)对于第一位有五种可能的表示代表不同的意义:
1yz 部分完成应答
 命令被接受,但是要求的操作被中止,原因在应答码中。发送方应该再次发送另一命令指明是否继续操作,或者放弃操作。
2yz 全部完成应答
 要求的操作已经完成,可以开始另一个新的请求。
3yz 需要近一步信息的部分完成应答
 命令被接受,但是要求的操作被中止,需要接收进一步的信息。发送方应该发送另一条命令指明进一步的信息。
4yz 暂时未完成应答
 命令未被接受,要求的操作也未执行,但是发生错误的状态是暂时的,可以再一次请求操作。发送者应该返回命令序列的开始命令(如果有的话)。很难解释这个暂时的意义,特别对于两个不同的站点来说。区别应答是属于些类还是下一类的方法是:如果能够不加任何改变地重复的再一次发送命令,就是本类的,如果不是,就是下一类(5yz)的。
5yz 永久未完成应答
 命令未被接受,要求的操作未完成。发送对命令的重复不起作用。即使一些出错条件已经改变,但是用户已经不希望重试,而希望在未来的某个时间再进行操作
 (2)应答的第二位的意义有以下几类:
x0z 语法:此类型的应答是针对以下情况的:语法错误;符合语法但命令不存在功能;未完成或冗余的命令。
x1z 信息:此类型的应答是用于请求信息的,如状态或帮助信息。
x2z 连接:此类型的应答是关于传输信道的。
x3z 未使用。
x4z 未使用。
x5z 邮件系统:此类型的应答指明接收方邮件系统关于请求传送或其它操作的状态的。
 (3)第三位给出了更详细的说明。

3.POP3
 POP的全称是 Post Office Protocol ,即邮局协议,用于电子邮件的接收,现在常用的是第三版 ,简称为 POP3。通过POP协议,客户机登录到服务器上后,可以对自己的邮件进行删除,或是下载到本地,下载后,电子邮件客户软件就可以在本地对邮件进行修改、删除等。
POP服务器一般使用的是TCP的110号端口,
 以下对几个常用的POP3命令作一个简单的介绍 :
 命令    参数    状态    描述
------------------------------------------
USER    username  认可    此命令与下面的pass命令若成功,将导致状态转换
PASS    password  认可
APOP    Name,Digest 认可    Digest是MD5消息摘要
------------------------------------------
STAT    None    处理    请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL    [Msg#]   处理    返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST    [Msg#]   处理    返回邮件数量和每个邮件的大小
RETR    [Msg#]   处理    返回由参数标识的邮件的全部文本
DELE    [Msg#]   处理    服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET    None    处理    服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP    [Msg#]    处理    服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP    None    处理    服务器返回一个肯定的响应,不做任何操作。
------------------------------------------
QUIT    None    更新 退出
POP3协议的基本操作:
1. 服务器通过侦听tcp端口110开始POP3服务。
2. 当客户需要服务时,它与服务器建立连接,连接建立后,POP3服务器发送确认消息
3. 客户与服务器相互交互命令和响应,持续到连接终止。
POP3命令由一个命令和一些参数组成
POP3响应由一个状态码和一个可能跟有附加信息的命令组成。
 两种状态码:确定(+OK)和错误(-ERR)
POP3在生命周期中经历的状态:“确认”—“操作”—“更新”
基础的POP3命令有:USER name 在确认状态下有效 可选的命令:APOP name digest
 PASS string
 QUIT
STAT 在操作状态下有效 TOP msg n
 LIST [msg] UIDL [msg]
 RETR msg
DELE msg
 NOOP
 REST
 QUIT 在更新状态下有效
POP3响应有:+OK -ERR
注意:除了STAT,LIST,UIDLD的响应外,其他命令的响应都为+OK和-ERR。响应后的所有文件将被客户略去。