2013-03-17 34页 doc 102KB 26阅读
is_098610
暂无简介
|<字符> ::= | "\" ::= "." "." "." ::= | ::= ::= 回车符(ASCII码13) ::= (ASCII码10) ::= 空格(ASCII码32) ::=由一个,两个或三个数字组成的介 于0-255之间的数字 ::= 所有A-Z的52个大小写英文字母 ::= 128个ASCII字符,但不包括空格和特殊字符 ::= 0-9数字 ::=不包括, ,"或\的128个ASCII字符 ::=所有128个ASCII字符 ::= "<" | ">" | "(" | ")" | "[" | "]" | "\" | "." | "," | ";" | ":" | "@" """ 或控制字符 注意: "\"是一个转意字符,它表示在其后的字符代表另外的意义。 例如"Joe\,Smith"用于表示单独一个由逗号分隔的用户名。主机通常由转化为 地址的名称代表。注意:域的名称元素是正式的名称,不能够使用昵称或假名。 有时候名称的转变机制可能不知道主机,这就造成了通信的阻塞。为了解决这 个问题,可以采取两种:一种方法是:在"#"后加入一个十进制数表示主机地址; 另一种方法是在其后加入32位的IP地址,IP地址的形式是由句号分隔的四个介于 0-255之间的十进制数。时间戳行和返回路径行的格式通常由下面定义: ::= "Return-Path:" ::= "Received:" ::= ";" ::= "FROM" <域> ::= "BY" <域> ::= [ ] [ ] [ ] [ ] ::= "VIA" <连接> ::= "WITH" <协议> ::= "ID" <字符串> ::= "FOR" <路径> <连接> ::= 在网络信息中心注册的连接的名称 <协议> ::= 在网络中心注册的协议的名称 ::= <日> <时间> <日期> ::= <日> <月> <年> <时间> ::= <小时> ":" <分> ":" <秒> <时区> ::= 由一个或两个数字组成的每月1-31日 <月> ::= "JAN" | "FEB" | "MAR" | "APR" | "MAY" | "JUN" | "JUL" | "AUG" | "SEP" | "OCT" | "NOV" | "DEC" <年> ::= 由两位数字表示本世界的年代00-99 <小时> ::= 每天的24小时,由0到24 <分> ::= 每小时的分钟数0-59 <秒> ::= 每分钟的秒数0-59 <时区> ::= 全球标准时区 返回路径例子 Return-Path: <@CHARLIE.ARPA,@BAKER.ARPA:JOE@ABLE.ARPA> 时间戳行例子 Received: FROM ABC.ARPA BY XYZ.ARPA ; 22 OCT 81 09:23:59 PDT Received: from ABC.ARPA by XYZ.ARPA via TELENET with X25 id M12345 for Smith@PDQ.ARPA ; 22 OCT 81 09:23:59 PDT 4.2. SMTP响应 对SMTP命令的响应是多样的,它确定了在邮件传输过程中请求和处理的 同步,也保证了发送SMTP知道接收SMTP的状态。每个命令必须有且只有一个 响应。 SMTP响应由三位数字组成,其后跟一些文本。数字帮助决定下一个应该 进入的状态,而文本对人是有意义的。三位的响应已经包括了足够的信息, 不用再阅读文本,文本可以直接抛弃或者传递给用户。特别的是,文本是与 接收和环境相关的,所以每次接收到的文本可能不同。在附录E中可以看到 全部的响应码。正规的情况下,响应由下面序列构成:三位的数字, , 一行文本和一个 ,或者也可以是一个多行响应。只有EXPN和HELP命令 可以导致多行应答,然而,对所有命令,多行响应都是允许的。 4.2.1. REPLY CODES BY FUNCTION GROUPS 500 格式错误,命令不可识别 (此错误也包括命令行过长) 501 参数格式错误 502 命令不可实现 503 错误的命令序列 504 命令参数不可实现 211 系统状态或系统帮助响应 214 帮助信息 220 服务就绪 221 服务关闭传输信道 421 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作 为对任何命令的响应) 250 要求的邮件操作完成 251 用户非本地,将转发向 450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙) 550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问) 451 放弃要求的操作;处理过程中出错 551 用户非本地,请尝试 452 系统存储不足,要求的操作未执行 552 过量的存储分配,要求的操作未执行 553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误) 354 开始邮件输入,以 . 结束 554 操作失败 4.3. 命令和应答序列 发送者和接收者之间的通信是一问一答的交替对话形式,由发送者控制。 这样,发送发出一条命令,接收者发出一个响应。接收者在发送下一条指令 前必须等应答。一个重要的应答是连接应答。在连接完成时,接收者通常会 发送220"服务就绪"。发送者在继续发送指令前会等待此应答。注意:每个连 接应答必须拥有服务主机的正式名称作为第一部分,其后跟响应码。例如: 220 USC-ISIF.ARPA Service ready 下面列出了成功和失败应答,这些应答必须遵守严格的次序,接收者可以 不理会应答中的文本,但是由数字指定的意义和操作和命令应答序列不能更改。 命令响应序列: 每个命令列出了它可能的应答。使用在可能应答前的前缀"P"表示预备的 (未用在SMTP中),"I"表示中间的,"S"表示成功,"F"表示失败,"E"表示错 误。如果STMP接收者必须关闭信道,可以对任何命令作出421(服务不可用, 关闭传输信道)响应。此表基于下面要讲述的状态图: CONNECTION ESTABLISHMENT(建立连接) S: 220 F: 421 HELO S: 250 E: 500, 501, 504, 421 MAIL 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 MAIL RCPT DATA RSET NOOP QUIT 4.5.2. 透明性 没有对数据透明性的保证,在发送类似" . "结束邮件内容时会 发生错误。通常,用户不关心这个"非法"序列。若要所有用户能够透明地使用 必须使用以下: 1. 在发送邮件之间,发送SMTP必须检查邮件的每一行,如果是一个句号,就 在行首再加一个句号。 2. 当邮件被接收时,接收SMTP必须检查邮件的每一行,如果发现一行仅有一 个句号,邮件就此结束,如果一行中有两个句号,那么这一行中就只应该有一 个句号,而将第一个句号删除。 发送的邮件内容可以包括所有128个ASCII字符。所有字符发送到收信者的 邮箱,包括格式符号和其它控制字符。如果传输信道提供一个8位数据流,7位 的ASCII码就可以在其中传送,而将最高位置为0。一些系统在接收和存储时需 要对数据进行格式转换。对于使用不同于ASCII字符集的主机或不能以串的形 式而只能以记录形式存储的主机更是如此,如果必须进行转换,必须能够再次 转换回来,对于用于存储转发的主机更是如此。 4.5.3. 大小 一些对象需要最大和最小大小。也就是说,每个实现必须能够接收大于最 小大小的对象,不能发送大于最大大小的对象。对于可能的最大大小,实现技 术上并没有限制。 用户 用户名的最大长度是64个字节。 域 域的最大长度是64个字符 路径 回复路径和转发路径的最大长度是256个字符 命令行 命令行的最大长度,包括回车符为512个字符 应答行 应答行的最大长度,包括回车符为512个字符 文本行 文本行的最大长度,包括回车符和为透明性增加的字符不得超过1000 个字符 接收缓冲区 接收缓冲区最多可以容纳100个接收者 如果