发送者和接收者之间的通信是一问一答的交替对话形式,由发送者控制。这样,发送发出一条命令,接收者发出一个响应。接收者在发送下一条指令前必须等应答。一个重要的应答是连接应答。在连接完成时,接收者通常会发送220“服务就绪”。发送者在继续发送指令前会等待此应答。注意:每个连接应答必须拥有服务主机的正式名称作为第一部分,其后跟响应码。例如:
220 <sp> usc-isif.arpa <sp> service ready <crlf>
下面列出了成功和失败应答,这些应答必须遵守严格的次序,接收者可以不理会应答中的文本,但是由数字指定的意义和操作和命令应答序列不能更改。命令响应序列:
每个命令列出了它可能的应答。使用在可能应答前的前缀“p”表示预备的(未用在smtp中),“i”表示中间的,“s”表示成功,“f”表示失败,“e”表示错误。如果stmp接收者必须关闭信道,可以对任何命令作出421(服务不可用,关闭传输信道)响应。此表基于下面要讲述的状态图:
connection establishment(建立连接)
s: 220
f: 421
helo
s: 250
e: 500, 501, 504, 421
s: 250
f: 552, 451, 452
e: 500, 501, 421
rcpt s: 250, 251 f: 550, 551, 552, 553, 450, 451, 452 e: 500, 501, 503, 421
data
i: 354 -> data -> s: 250
f: 552, 554, 451, 452
f: 451, 554
e: 500, 501, 503, 421
rset
s: 250
e: 500, 501, 504, 421
send
s: 250
f: 552, 451, 452
e: 500, 501, 502, 421
soml
s: 250
f: 552, 451, 452
e: 500, 501, 502, 421
saml
s: 250
f: 552, 451, 452
e: 500, 501, 502, 421
vrfy
s: 250, 251
f: 550, 551, 553
e: 500, 501, 502, 504, 421
expn
s: 250
f: 550
e: 500, 501, 502, 504, 421
help
s: 211, 214
e: 500, 501, 502, 504, 421
noop
s: 250
e: 500, 421
quit
s: 221
e: 500
turn
s: 250
f: 502
e: 500, 503
4.4. 状态图
下面状态图是一个简单的smtp实现,每一组命令都有一个状态图。在图中,只使用了响应码的第一位数字作为响应的代表。命令组是对每个命令建立模式然后以结构模式将命令集中起来的。对于每个命令有三种可能的应答:成功(s),失败(f)和错误(e)。在状态中,我们使用b代表开始,使用w代表等待应答。

此状态图使用了如下命令:helo, mail, rcpt, rset, send, soml, saml, vrfy, expn, help, noop, quit, turn.
下面是对于data命令的更复杂的状态图:

注意:这里的邮件内容是多行的,接收者只能收到最后一行时才发出应答。
4.5. 详细内容
4.5.1. 最小实现
为使smtp能够工作,对于接收者来说,这是最少应该实现的命令:
commands -- helo
rcpt
data
rset
noop
quit
4.5.2. 透明性
没有对数据透明性的保证,在发送类似"<crlf>.<crlf>"结束邮件内容时会发生错误。通常,用户不关心这个“非法”序列。若要所有用户能够透明地使用必须使用以下措施:
1. 在发送邮件之间,发送smtp必须检查邮件的每一行,如果是一个句号,就在行首再加一个句号。
2. 当邮件被接收时,接收smtp必须检查邮件的每一行,如果发现一行仅有一个句号,邮件就此结束,如果一行中有两个句号,那么这一行中就只应该有一个句号,而将第一个句号删除。
发送的邮件内容可以包括所有128个ascii字符。所有字符发送到收信者的邮箱,包括格式符号和其它控制字符。如果传输信道提供一个8位数据流,7位的ascii码就可以在其中传送,而将最高位置为0。一些系统在接收和存储时需要对数据进行格式转换。对于使用不同于ascii字符集的主机或不能以串的形式而只能以记录形式存储的主机更是如此,如果必须进行转换,必须能够再次转换回来,对于用于存储转发的主机更是如此。
4.5.3. 大小
一些对象需要最大和最小大小。也就是说,每个实现必须能够接收大于最小大小的对象,不能发送大于最大大小的对象。对于可能的最大大小,实现技术上并没有限制。
|
用户 |
用户名的最大长度是64个字节。 |
|
域 |
域的最大长度是64个字符 |
|
路径 |
回复路径和转发路径的最大长度是256个字符 |
|
命令行 |
命令行的最大长度,包括回车符为512个字符 |
|
应答行 |
应答行的最大长度,包括回车符为512个字符 |
|
文本行 |
文本行的最大长度,包括回车符和为透明性增加的字符不得超过1000个字符 |
|
接收缓冲区 |
接收缓冲区最多可以容纳100个接收者 |