SMTP协议.docx
《SMTP协议.docx》由会员分享,可在线阅读,更多相关《SMTP协议.docx(41页珍藏版)》请在冰豆网上搜索。
SMTP协议
SMTP协议RFC文档中文版
RFC821简单邮件传输协议(SMTP)
(RFC821 SIMPLEMAILTRANSFERPROTOCOL)
目录
1.介绍2
2.SMTP模型3
3.SMTP过程4
3.1.MAIL4
3.2.转发5
3.3.确认和扩展6
3.4.发送信件(mailing)和获得信件(sending)7
3.5.打开和关闭7
3.6.转发8
3.7.域9
3.8.改变角色9
4.SMTP说明9
4.1.SMTP命令9
语法9
语法格式13
4.2.SMTP响应15
4.3.命令和应答序列16
4.4.状态图17
4.5.详细内容18
实现18
附录ATCP传输服务19
附录BNCP传输服务20
附录CNITS20
附录DX.25传输服务20
?
附录E应答码构成方法20
附录F一些例子22
参考资料36
1.介绍
简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
附录A,B,C和D描述了不同传送服务下SMTP的使用。
在名词表中还定义了本文档中使用的术语。
?
SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。
理解到传送系统(或IPCE)不是一对一的是很重要的。
进程可能直接和其它进程通过已知的IPCE通信。
邮件是一个应用程序或进程间通信。
邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。
更特别的是,邮件可以通过不同网络上的主机接力式传送。
2.SMTP模型
SMTP设计基于以下通信模型:
针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。
接收SMTP可以是最终接收者也可以是中间传送者。
SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。
一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。
如果SMTP接收者可以接收邮件则返回OK应答。
SMTP发送者再发出RCPT命令确认邮件是否接收到。
如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。
当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。
?
SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。
为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。
向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。
当同一个消息要发往不同的接收者时,SMTP遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。
在下面,例子中可以看到哪些使用实际的命令和应答。
完整的命令和应答在第四节。
?
命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。
这样SMTP实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感。
?
命令与应答由ASCII字母表组成,当传送服务提供8位字节传送通道,每7位字符正确传送,而最高位被填充为0。
当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如""或"",这里尖括号表示这是一种类似于语言的变量。
3.SMTP过程
本节提供了SMTP中的一些过程。
头一个说明的是基本发送过程(定义为发送操作)。
下来描述向前传送邮件,确认邮箱名称和扩展邮件列表,发送到终端和打开关闭交换。
在本节的最后是对中断,邮件域的说明。
本节的例子只是一部分命令和应答的序列,完整的例子见附录F。
3.1.MAIL
在SMTP发送操作中有三步,操作由MAIL命令开始给出发送者标识。
一系列或更多的RCPT命令紧跟其后,给出了接收者信息,然后是DATA命令列出发送的邮件内容,最后邮件内容指示符确认操作。
过程中的第一步是MAIL命令,包括源邮箱。
MAILFROM:
此命令告诉接收者新的发送操作已经开始,请复位所有状态表和缓冲区。
它给出反向路径以进行错误信息返回。
如果请求被接收,接收方返回一个250OK应答。
中不止包括了邮箱,它包括了主机和源邮箱的反向路由,其中的第一个主机就是发送此命令的主机。
过程中的第二步是发送RCPT命令。
RCPTTO:
此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个250OK应答,并存储向前路径。
如果接收者未知,接收方会返回一个550Failure应答。
此过程可能会重复若干次。
不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一个主机就是接收命令的主机。
过程中的第三步是发送DATA命令。
DATA
如果命令被接收,接收方返回一个354Intermediate应答,并认定以下的各行都是信件内容。
当信件结尾收到并存储后,接收者发送一个250OK应答。
因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可以重新开始。
SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束,在接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。
注意:
邮件内容包括如下提示:
Date,Subject,To,Cc,From。
邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。
如果此命令被接收,接收方返回一个250OK应答。
DATA命令仅在邮件操作未完成或源无效的情况下失败。
上面所述的过程是一个发送操作。
这些命令只能以上面的顺序使用。
下例表示了在一个发送操作中这些命令的使用。
SMTP过程例子此例是在Alpha.ARPA主机的Smith发送邮件给Beta.ARPA主机的Jones,Green和Brown的,这里假定主机Alpha与主机Beta直接相连。
R:
250OK
R:
250OK
R:
550Nosuchuserhere
S:
RCP
R:
250OK
S:
DATA
R:
354Startmailinput;endwith.
S:
Blahblahblah...
S:
...等等
S:
.
R:
250OK
此信被前两个人接收,而第三个人在此主机上没有邮箱。
3.2.转发
下面是一些中目的地址不正确的,但接收者知道正确的目的地址的例子。
在这些例子中,下列应答之一应该允许发送方与获得正确地址。
251:
用户不在本地;将向前发送到。
这个应答意味着,接收方SMTP知道用户的邮箱在另外的主机上,而且意味着将在未来使用正确的转向路径。
请注意,主机或者用户,或者它们两者是不同的。
接收方负责传送消息。
551:
用户非本地,请尝试
这个应答意味着接收SMTP知道用户的邮箱在另外的主机上,并意味着使用了正确的转发路径。
注意请注意,主机或者用户,或者它们两者是不同的。
接收方拒绝接收此用户的信件,发送者必须根据提供的信息重新发送或者向原发送者返回错误信息。
下例显示了这些响应的应用。
转发的例子
或者
3.3.确认和扩展
SMTP提供了另外的确认用户名和扩展邮件列表的功能。
这些功能由VREF和EXPN命令完成,它们都以字符串为参数。
对于VREF命令,字符串参数指的是用户名,对此命令的响应要包括用户的命名和用户的邮箱。
对于EXPN命令,字符串参数指的是邮件列表,对此命令的响应多于一个,它们要包括所有列表中用户的命名和他们的邮箱。
?
“用户名”是一个多余的项目,它是故意被加上的。
如果主机采用VREF命令和EXPN命令,最后本地邮箱必须提供用户名使它被主机确认。
如果主机选择由另外的字符串作为用户名,也是允许的。
在一些主机中,邮箱列表和一个邮箱的代名有一点不清楚,因为一般的数据结构可能包括两种类型的入口。
如果要发出对邮件列表的确认,应该给出确定响应。
在接收到这个消息后,主机将把邮件传送到列表上所有的地址上去,如果没有接收到确定响应,就会报告错误。
例如,"550Thatisamaillist,notausername"。
如果请求用于扩展一个用户名,可能通过返回包括一个名字的列表来形成确定响应,如果没有接收到确定响应,就会报告错误。
(例如,"550Thatisausername,notamailinglist")。
在多个响应的情况下(通常是对于EXPN而言的),每个应答指定一个邮箱。
在模糊请求的情况下,例如"VRFYSmith",这里两个Smith的响应必须是"553Userambiguous"。
确认用户名的情况如下例所示:
例3:
确认用户名
S:
VRFYSmithR:
250FredSmith
或者
S:
VRFYSmith
或者
S:
VRFYJones
R:
550Stringdoesnotmatchanything.
或者
S:
VRFYJones
或者
S:
VRFYGourzenkyinplatz
R:
553Userambiguous.
邮箱列表要求多个响应的情况如下例所示:
S:
EXPNExample-People
R:
250-QuincySmith<@
或者
S:
EXPNExecutive-Washroom-List
R:
550AccessDeniedtoYou.
VERF和EXPN命令的字符串命令参数因为具体实现的不同而不能再加以限制了。
在一些系统上,EXPN命令的参数可能是一个包含邮件列表的文件名,但是在Internet上有许多不同的文件结构。
VRFY和EXPN命令在最小实现中并不包括,当它们实现时,它们也不要求被在传送间实现。
3.4.发送信件(mailing)和获得信件(sending)
?
SMTP的主要目的是将邮件发送到用户的邮箱中。
由一些主机提供的类似的功能是把邮件送至用户的终端(如果用户正打开终端)。
将邮件送到用户的邮箱中称为发送信件(mailing);而送至用户终端则称之为获得信件(sending)。
因为在一些主机上,这两者的实现十分类似,所以它们同时被放入了SMTP中。
然而,获得信件命令在SMTP的最小实现中是没有的。
用户应该具有控制向终端上写信息的能力。
大部分主机允许用户接受或者拒绝类似的信息。
下面三个命令被定义来支持获得信件。
它们被用于邮件命令而不是MAIL命令,指示接收SMTP这种操作的特殊意义:
SENDFROM:
SEND命令要求邮件内容直接传送到用户终端。
如果用户未打开终端(或者未接收终端信息),450响应将返回一个RCPT命令。
如果信息被成功发送,此操作成功。
SOMLFROM:
Send或者MaiL命令要求将邮件内容直接发送到用户的终端上(如果用户在终端上)。
如果用户不在终端上,邮件内容直接进入邮箱。
如果邮件被发送到用户终端或者用户信箱,发送操作成功。
SAMLFROM:
Send和MaiL命令要求邮件内容直接发送到用户终端上(如果用户在终端上)。
不管怎么样,信件都会进入信箱。
如果信件进入信箱,发送操作成功。
用于MAIL命令的响应和这些命令的响应相同。
3.5.打开和关闭
当打开传送通道时,要交换一些信息以确定双方的身份。
以下的命令是用于打开和关闭的:
HELO
QUIT
在HELLO命令中,主机自己发送命令,此命令可以被解释为:
“你好,我是XX"。
打开联结的例子
R:
220BBN-UNIX.ARPASimpleMailTransferServiceReady
S:
HELOUSC-ISIF.ARPA
R:
250BBN-UNIX.ARPA
关闭联结的例子
S:
QUIT
R:
221BBN-UNIX.ARPAServiceclosingtransmissionchannel
3.6.转发
转发路径可能是如下格式:
"@ONE,@TWO:
JOE@THREE",在这里,ONE,TWO和THREE是主机。
这种格式用于强调地址和路径的区别。
邮箱是绝对地址,路径是关于如何到达的信息。
这两个概念不应该被混淆。
概念上,转发路径的元素被移动到回复路径作为从一个SMTP服务器到另一个SMTP服务器的信息。
回复路径是一个反向数据源路径,例如从当前信息的位置到发起者的位置。
当一个SMTP服务器从转发路径中删除自己的标记并将它插入到回复路径中时,它必须使用它发送环境能够理解的名称来进行,以防它的名称在不同的环境中被理解为不同的名字。
如果当SMTP接收到信息的转发路径的第一个元素不是此SMTP的标记时,此元素不从转发路径中删除,而被用来决定下一个应该发送到的SMTP服务器。
在任何情况下,SMTP都将自己的标记加入反向路径中。
使用源路径时,接收SMTP接收转发的邮件并发送到另一接收SMTP服务器上。
接收服务器可以接受或拒绝转发本地用户的邮件。
接收SMTP通过将它自己的标记从转发路径移至回复路径的开始处来改变命令参数。
这时,接收SMTP变成了发送SMTP,也就建立了到下一个转发路径中SMTP的通道,然后,它向这个SMTP发送邮件。
在回复路径上的头一个主机应是发送SMTP命令的主机,在转发路径上第一个主机应是接收SMTP命令的主机。
注意:
转发路径和回复路径出现在SMTP命令和应答中,但不一定要出现在信息中。
也就是说,没有必须要这样的路径特别这种格式出现在信息头的"To:
","From:
"和"CC:
"等域中。
如果SMTP服务器接受了转发任务,但后来它发现因为转发路径不正确或者其它原理无法发送邮件,它必须建立一"undeliverablemail"信号,将它此信号送到此信的发主者那里。
?
此信号必须是从此主机的SMTP服务上发出的,当然了,此服务器不应该再报告出错信息的错误。
一种阻止这种出错报告循环的情况是在信号的邮件命令的回复路径上置空。
在传送此信息时,允许将回复路径也置为空。
一个MAIL命令后的回复路径为空表现为如下形式:
MAILFROM:
<>
下例中显示了不可传送的邮件信息。
此信息是对从HOSTW上的JOE发出的邮件经过在HOSTX需要经过HOSTZ到达HOSTY时出错的回应。
我们看到的例子是在HOSTX和HOSTY之间发生的。
不可传送邮件信息的例子
S:
MAILFROM:
<>
R:
250ok
R:
250ok
S:
DATA
R:
354sendthemaildata,endwith.
S:
Date:
23Oct8111:
22:
33
S:
Subject:
MailSystemProblem
S:
S:
HOSTZ.ARPAsaidthis:
S:
"550NoSuchUser"
S:
.
R:
250ok
3.7.域
域是最近被引入ARPAInternet邮件系统的。
使用域可以使地址空间从一个平面的普通字符串主机名变成全局地址的一个层次结构。
主机由一个域名取代,起始主机是由一系列元串组成,它们由逗号按最特殊到一般的顺序排列。
标识符。
无论域名在SMTP中如何使用,只有正式的名称才可以被使用,不可以使用假名或昵称。
3.8.改变角色
TURN命令可以用来改变在传输信道上通信的程序的角色。
如果程序A现在是发送SMTP,它发送TURN命令并接到OK应答(250)后,它就变为接收SMTP了。
同理,程序B也可以从接收SMTP变为发送SMTP。
若要拒绝改变角色,接收方可以发送502作为应答。
注意:
此命令是可选的。
在使用TCP的传输信道时,一般不使用此命令。
然而,当建立传输信道的代价比较大时,此命令很有用。
例如,此命令可以支持一般公共交换电话系统作为传输信道。
4.SMTP说明
4.1.SMTP命令
语法
SMTP命令定义了邮件传输或由用户定义的系统功能。
它的命令是由结束的字符串。
而在带有参数的情况下,命令本身由和参数分开,如果未带参数可以直接和连接。
邮箱的语法格式必须和接收站点的格式一致。
下面讨论SMTP命令和应答。
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。
回复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是DATA命令的参数。
这些参数或者数据对象必须跟在命令后。
这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲区,一个邮件内容缓冲区。
特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除。
HELLO(HELO)
此命令用于向接收SMTP确认发送SMTP。
参数域包括发送SMTP的主机名。
接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。
引命令和OK响应确认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态表和缓冲区已经被子清除。
MAIL(MAIL)
此命令用于开始将邮件发送到一个多个邮箱中。
参数域包括回复路径。
返回路径中包括了可选的主机和发送者邮箱列表。
当有主机列表时,它是一个回复路径源,它说明此邮箱是由在表中的主机一一传递发送(第一个主机是最后一个接收到此邮件的主机)过来的。
此表也有作向发送者返回非传递信号的源路径。
因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。
一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
RECIPIENT(RCPT)
此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。
转发路径中包括一个可选的主机和一个必须的目的邮箱。
当出现主机列表时,这就是一个源路径,它指明邮件必须向列表中的上一个主机发送。
如果接收SMTP未实现邮件的传递发送,就会返回如未知本地用户(550)的信息给用户。
当邮件被传递发送时,传递主机必须将自己的名称由转发路径的开始处移至回复路径的结束处。
当邮件最终到达目的地时,接收SMTP将以它的主机邮件格式自己的名称插入目标邮件中。
例如,由传递主机A接收的带有如下参数的邮件时,
将会变成如下形式:
此命令导致它的转发路径参数加入转发路径缓冲区中。
DATA(DATA)
接收者将跟在命令后的行作为邮件内容。
此命令导致此命令后的邮件内容加入邮件内容缓冲区。
邮件内容可以包括所有128个ASCII码字符。
邮件内容由只包括一个句号的行结束,也就是如下的字符序列:
".",它指示了邮件的结束。
邮件内容的结束指示要求接收者现在就处理保存的邮件内容。
此过程将回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区的内容全部清空。
如果操作成功,接收者必须返回OK应答;如果失败也必须返回失败应答。
当接收SMTP收到一条信息时,无论是用作转发还是此邮件已经到达目的地,它都必须在邮件内容的开始处加上时间戳这一行,这一行指示了接收到邮件主机和发出此邮件主机的标识,以及接收到邮件内容的时间和日期。
转发的信件将有多行这样的时间戳。
当接收SMTP作最后一站的传送时,它将返回路径信息行插入邮件中。
此行包括了发送命令中的的信息。
在这里,最后一站的传送的意思是邮件将被送到目的用户手中,但在一些情况下,邮件可能需要更进一步的加工并由另外的邮件系统传送。
可能在返回路径中的邮箱与实际发送的邮件不一致,这个情况可能发生在需要传送一个特定的错误处理信箱而不是信件发送者那里。
上面所述说明了,最后的邮件内容由一个返回路径行,和在其后的一个或多个时间戳行构成。
这些行后面是邮件内容的头和体信息。
当处理后面的邮件数据指示部分成功时就需要特定的说明。
这种情况可能发生在发送SMTP发现当邮件需要传送给多个用户时,只能够成功地向其中的一部分发送信息这种情况下。
在这种情况下,必须对DATA命令发送OK应答,而接收SMTP组织并发送一个"不可传递邮件"信息到信息的发送者。
在此信息中或者发送一个不成功接收者的列表,或者每次发送一个不成接收者,而发送多次。
所有不可传递邮件信息由MAIL命令发送。
返回路径和接收时间戳例子
Received:
fromGHI.ARPAbyJKL.ARPA;27Oct8115:
27:
39PST
Received:
fromDEF.ARPAbyGHI.ARPA;27Oct8115:
15:
13PST
Received:
fromABC.ARPAbyDEF.ARPA;27Oct8115:
01:
59PST
Date:
27Oct8115:
01:
01PST
Subject:
ImprovedMailingSystemInstalled
To:
S
Thisistoinformyouthat...
SEND(SEND)
此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。
参数域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。
回复路径包括一个可选的主机列表和发送者邮箱。
当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
此表用于返回非传递信号到发送者。
因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。
一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并