日期:2011-01-31  浏览次数:20556 次

本文出自: 作者: (2001-11-23 07:08:00)
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。当指定一般的命令或应答格式后,参
数会由一些类似于语言的字符串表示出来,如"<string>"或"<reverse-path>",
这里尖括号表示这是一种类似于语言的变量。

3. SMTP过程  

  本节提供了SMTP中的一些过程。头一个说明的是基本发送过程(定义为
发送操作)。下来描述向前传送邮件,确认邮箱名称和扩展邮件列表,发送到终
端和打开关闭交换。在本节的最后是对中断,邮件域的说明。本节的例子只是一
部分命令和应答的序列,完整的例子见附录F。

3.1. MAIL
  在SMTP发送操作中有三步,操作由MAIL命令开始给出发送者标识。一系列或
更多的RCPT命令紧跟其后,给出了接收者信息,然后是DATA命令列出发送的邮件
内容,最后邮件内容指示符确认操作。

  过程中的第一步是MAIL命令,< reverse-path >包括源邮箱。

  MAIL <SP> FROM:<reverse-path> <CRLF>

  此命令告诉接收者新的发送操作已经开始,请复位所有状态表和缓冲区。
它给出反向路径以进行错误信息返回。如果请求被接收,接收方返回一个
250 OK应答。<reverse-path>中不止包括了邮箱,它包括了主机和源邮箱的反
向路由,其中的第一个主机就是发送此命令的主机。

  过程中的第二步是发送RCPT命令。

  RCPT <SP> TO:<forward-path> <CRLF>

  此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个
250 OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure
应答。此过程可能会重复若干次。
  <forward-path>不仅包括邮件,它是主机和目的邮箱的路由表,在其中的
第一个主机就是接收命令的主机。 过程中的第三步是发送DATA命令。

DATA <CRLF>

  如果命令被接收,接收方返回一个354 Intermediate应答,并认定以下的
各行都是信件内容。当信件结尾收到并存储后,接收者发送一个250 OK应答。
因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可
以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束,在
接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。
  注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。

  邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如
果此命令被接收,接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成
或源无效的情况下失败。

  上面所述的过程是一个发送操作。这些命令只能以上面的顺序使用。下例
表示了在一个发送操作中这些命令的使用。
  SMTP过程例子 此例是在Alpha.ARPA主机的Smith发送邮件给Beta.ARPA主机
的Jones,Green和Brown的,这里假定主机Alpha与主机Beta直接相连。

  S: MAIL FROM:<Smith@Alpha.ARPA>
  R: 250 OK
  S: RCPT TO:<Jones@Beta.ARPA>
  R: 250 OK
  S: RCPT TO:<Green@Beta.ARPA>
  R: 550 No such user here
  S: RCPT TO:<Brown@Beta.ARPA>
  R: 250 OK
  S: DATA
  R: 354 Start mail input; end with <CRLF>.<CRLF>
  S: Blah blah blah...
  S: ...等等
  S: <CRLF>.<CRLF>
  R: 250 OK
  此信被前两个人接收,而第三个人在此主机上没有邮箱。

3.2. 转发  
  下面是一些<forward-path>中目的地址不正确的,但接收者知道正确的目
的地址的例子。在这些例子中,下列应答之一应该允许发送方与获得正确地址。

  251:用户不在本地;将向前发送到<forward-path>。

  这个应答意味着,接收方SMTP知道用户的邮箱在另外的主机上,而且意味
着将在未来使用正确的转向路径。请注意,主机或者用户,或者它们两者是不
同的。接收方负责传送消息。

  551 :用户非本地,请尝试<forward-path>

  这个应答意味着接收SMTP知道用户的邮箱在另外的主机上,并意味着使用
了正确的转发路径。注意请注意,主机或者用户,或者它们两者是不同的。接
收方拒绝接收此用户的信件,发送者必须根据提供的信息重新发送或者向原发
送者返回错误信息。 下例显示了这些响应的应用。