📄 简单邮件传输协议.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0044)http://www.longen.org/s-z/details~z/smtp.htm -->
<HTML><HEAD><TITLE>简单邮件传输协议</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD width="100%"><FONT face=宋体 size=3>
<P align=justify></FONT><FONT face=宋体
size=4><B>简单邮件传输协议(SMTP)</B></FONT><FONT face=宋体 size=3></P>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#介绍">介绍</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#SMTP模型">SMTP模型</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#SMTP过程">SMTP过程</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#SMTP说明">SMTP说明</A></TD></TR>
<TR>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#TCP传输服务">TCP传输服务</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#NCP传输服务">NCP传输服务</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#NITS">NITS</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#X.25传输服务">X.25传输服务</A></TD></TR>
<TR>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#应答码构成方法">应答码构成方法</A></TD>
<TD width="25%"><A
href="http://www.longen.org/s-z/details~z/smtp.htm#一些例子">一些例子</A></TD>
<TD width="25%"></TD>
<TD width="25%"></TD></TR></TBODY></TABLE></CENTER></DIV>
<P align=justify>1. <A name=介绍><STRONG>介绍</STRONG></A></P>
<P
align=justify>简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。附录A,B,C和D描述了不同传送服务下SMTP的使用。在名词表中还定义了本文档中使用的术语。</P>
<P
align=justify>SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。理解到传送系统(或IPCE)不是一对一的是很重要的。进程可能直接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是,邮件可以通过不同网络上的主机接力式传送。</P>
<P align=justify>2. <A name=SMTP模型><STRONG>SMTP模型</STRONG></A> </P>
<P
align=justify>SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。</P>
<P
align=justify>一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。</P>
<P align=justify> </P>
<P align=justify><IMG height=312 alt="SMTP使用模型.bmp (475542 bytes)"
src="简单邮件传输协议.files/SMTP.bmp_aS.jpg" width=508></P>
<P
align=justify>SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。</P>
<P
align=justify>MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。</P>
<P
align=justify>当同一个消息要发往不同的接收者时,SMTP遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。在下面,例子中可以看到哪些使用实际的命令和应答。完整的命令和应答在第四节。</P>
<P
align=justify>命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感。</P>
<P
align=justify>命令与应答由ASCII字母表组成,当传送服务提供8位字节传送通道,每7位字符正确传送,而最高位被填充为0。当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如"<string>"或"<reverse-path>",这里尖括号表示这是一种类似于语言的变量。</P>
<P align=justify> </P>
<P align=justify>3. <A name=SMTP过程><STRONG>SMTP过程</STRONG></A> </P>
<P
align=justify>本节提供了SMTP中的一些过程。头一个说明的是基本发送过程(定义为发送操作)。下来描述向前传送邮件,确认邮箱名称和扩展邮件列表,发送到终端和打开关闭交换。在本节的最后是对中断,邮件域的说明。本节的例子只是一部分命令和应答的序列,完整的例子见附录F。</P>
<P align=justify> </P>
<P align=justify>3.1. MAIL</P>
<P align=justify> </P>
<P
align=justify>在SMTP发送操作中有三步,操作由MAIL命令开始给出发送者标识。一系列或更多的RCPT命令紧跟其后,给出了接收者信息,然后是DATA命令列出发送的邮件内容,最后邮件内容指示符确认操作。</P>
<P align=justify>过程中的第一步是MAIL命令,< reverse-path >包括源邮箱。</P>
<P align=justify>MAIL <SP> FROM:<reverse-path>
<CRLF></P>
<P
align=justify>此命令告诉接收者新的发送操作已经开始,请复位所有状态表和缓冲区。它给出反向路径以进行错误信息返回。如果请求被接收,接收方返回一个250
OK应答。<reverse-path>中不止包括了邮箱,它包括了主机和源邮箱的反向路由,其中的第一个主机就是发送此命令的主机。</P>
<P align=justify>过程中的第二步是发送RCPT命令。</P>
<P align=justify>RCPT <SP> TO:<forward-path> <CRLF></P>
<P align=justify>此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个250
OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure应答。此过程可能会重复若干次。</P>
<P
align=justify><forward-path>不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一个主机就是接收命令的主机。</P>
<P align=justify>过程中的第三步是发送DATA命令。</P>
<P align=justify>DATA <CRLF></P>
<P align=justify>如果命令被接收,接收方返回一个354
Intermediate应答,并认定以下的各行都是信件内容。当信件结尾收到并存储后,接收者发送一个250
OK应答。因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束,在接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。</P>
<P align=justify>注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。</P>
<P align=justify>邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果此命令被接收,接收方返回一个250
OK应答。DATA命令仅在邮件操作未完成或源无效的情况下失败。</P>
<P align=justify>上面所述的过程是一个发送操作。这些命令只能以上面的顺序使用。下例表示了在一个发送操作中这些命令的使用。</P>
<P
align=justify>-------------------------------------------------------------
</P>
<P align=justify>SMTP过程例子
此例是在Alpha.ARPA主机的Smith发送邮件给Beta.ARPA主机的Jones,Green和Brown的,这里假定主机Alpha与主机Beta直接相连。</P>
<P align=justify>S: MAIL FROM:<Smith@Alpha.ARPA></P>
<P align=justify>R: 250 OK</P>
<P align=justify> </P>
<P align=justify>S: RCPT TO:<Jones@Beta.ARPA></P>
<P align=justify>R: 250 OK</P>
<P align=justify> </P>
<P align=justify>S: RCPT TO:<Green@Beta.ARPA></P>
<P align=justify>R: 550 No such user here</P>
<P align=justify> </P>
<P align=justify>S: RCPT TO:<Brown@Beta.ARPA></P>
<P align=justify>R: 250 OK</P>
<P align=justify> </P>
<P align=justify>S: DATA</P>
<P align=justify>R: 354 Start mail input; end with
<CRLF>.<CRLF></P>
<P align=justify>S: Blah blah blah...</P>
<P align=justify>S: ...等等</P>
<P align=justify>S: <CRLF>.<CRLF></P>
<P align=justify>R: 250 OK</P>
<P align=justify> </P>
<P align=justify>此信被前两个人接收,而第三个人在此主机上没有邮箱。</P>
<P
align=justify>-------------------------------------------------------------</P>
<P align=justify> </P>
<P align=justify>3.2. 转发
下面是一些<forward-path>中目的地址不正确的,但接收者知道正确的目的地址的例子。在这些例子中,下列应答之一应该允许发送方与获得正确地址。</P>
<P align=justify>251:用户不在本地;将向前发送到<forward-path>。</P>
<BLOCKQUOTE>
<P
align=justify>这个应答意味着,接收方SMTP知道用户的邮箱在另外的主机上,而且意味着将在未来使用正确的转向路径。请注意,主机或者用户,或者它们两者是不同的。接收方负责传送消息。</P></BLOCKQUOTE>
<P align=justify>551 :用户非本地,请尝试<forward-path></P>
<P
align=justify>这个应答意味着接收SMTP知道用户的邮箱在另外的主机上,并意味着使用了正确的转发路径。注意请注意,主机或者用户,或者它们两者是不同的。接收方拒绝接收此用户的信件,发送者必须根据提供的信息重新发送或者向原发送者返回错误信息。</P>
<P align=justify>下例显示了这些响应的应用。</P>
<P align=justify> </P>
<P align=justify>转发的例子</P>
<P align=justify> </P>
<P align=justify>S: RCPT TO:<Postel@USC-ISI.ARPA></P>
<P align=justify>R: 251 User not local; will forward to
<Postel@USC-ISIF.ARPA></P>
<P align=justify> </P>
<P align=justify>或者</P>
<P align=justify> </P>
<P align=justify>S: RCPT TO:<Paul@USC-ISIB.ARPA></P>
<P align=justify>R: 551 User not local; please try
<Mockapetris@USC-ISIF.ARPA></P>
<P
align=justify>-------------------------------------------------------------</P>
<P align=justify> </P>
<P align=justify>3.3. 确认和扩展</P>
<P
align=justify>SMTP提供了另外的确认用户名和扩展邮件列表的功能。这些功能由VREF和EXPN命令完成,它们都以字符串为参数。对于VREF命令,字符串参数指的是用户名,对此命令的响应要包括用户的命名和用户的邮箱。对于EXPN命令,字符串参数指的是邮件列表,对此命令的响应多于一个,它们要包括所有列表中用户的命名和他们的邮箱。</P>
<P
align=justify>“用户名”是一个多余的项目,它是故意被加上的。如果主机采用VREF命令和EXPN命令,最后本地邮箱必须提供用户名使它被主机确认。如果主机选择由另外的字符串作为用户名,也是允许的。</P>
<P
align=justify>在一些主机中,邮箱列表和一个邮箱的代名有一点不清楚,因为一般的数据结构可能包括两种类型的入口。如果要发出对邮件列表的确认,应该给出确定响应。在接收到这个消息后,主机将把邮件传送到列表上所有的地址上去,如果没有接收到确定响应,就会报告错误。例如,"550
That is a mail list, not a user
name"。如果请求用于扩展一个用户名,可能通过返回包括一个名字的列表来形成确定响应,如果没有接收到确定响应,就会报告错误。(例如, "550
That is a user name, not a mailing list")。</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -