答案:本文出自: 作者: (2001-11-23 08:08:00)
4.1.2. COMMAND语法格式
命令是由命令码和其后的参数域组成的。命令码是四个字母组成的,不区别
大小写。因为下面的命令的作用是相同的:
MAIL Mail mail MaIl mAIl
这对于引导任何参数值的标记也是适用的,如TO和to就是一样的。命令码和
参数由一个或多个空格分开。然而在回复路径和转发路径中的参数是区别大小写
的。特别是在一些主机上,"smith"和"Smith"就根本不是一个用户。
参数域由不定长的字符串组成,它由<CRLF>结束,接收方在完全接收到此序列前
不会采取任何行动。方括号代表可选的参数域。如果不选择的话,系统选择默认
的设置。
下面是SMTP命令:
HELO <SP> <domain> <CRLF> MAIL <SP> FROM:<reverse-path> <CRLF>
RCPT <SP> TO:<forward-path> <CRLF>
DATA <CRLF>
RSET <CRLF>
SEND <SP> FROM:<reverse-path> <CRLF>
SOML <SP> FROM:<reverse-path> <CRLF>
SAML <SP> FROM:<reverse-path> <CRLF>
VRFY <SP> <string> <CRLF>
EXPN <SP> <string> <CRLF>
HELP [<SP> <string>] <CRLF>
NOOP <CRLF>
QUIT <CRLF>
TURN <CRLF>
上面参数域的格式在下面给BNF的格式给出,其中的"..."代表对于一个
域的一次或多次的重复。
<reverse-path> ::= <path>
<forward-path> ::= <path>
<path> ::= "<" [ <a-d-l> ":" ] <mailbox> ">"
<a-d-l> ::= <at-domain> | <at-domain> "," <a-d-l>
<at-domain> ::= "@" <domain>
<domain> ::= <element> | <element> "." <domain>
<element> ::= <name> | "#" <number> | "[" <dotnum> "]"
<mailbox> ::= <local-part> "@" <domain>
<local-part> ::= <dot-string> | <quoted-string>
<name> ::= <a> <ldh-str> <let-dig>
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig> ::= <a> | <d>
<let-dig-hyp> ::= <a> | <d> | "-"
<dot-string> ::= <字符串> | <字符串> "." <dot-string>
<字符串> ::= <字符> | <字符> <字符串>
<quoted-string> ::= """ <qtext> """
<qtext> ::= "\" <x> | "\" <x> <qtext> | <q> | <q> <qtext>
<字符> ::= <c> | "\" <x>
<dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>
<number> ::= <d> | <d> <number>
<CRLF> ::= <CR> <LF>
<CR> ::= 回车符(ASCII码13) <LF> ::= (ASCII码10)
<SP> ::= 空格(ASCII码32) <snum> ::=由一个,两个或三个数字组成的介
于0-255之间的数字
<a> ::= 所有A-Z的52个大小写英文字母
<c> ::= 128个ASCII字符,但不包括空格和特殊字符
<d> ::= 0-9数字
<q> ::=不包括<CR>,<LF>,"或\的128个ASCII字符
<x> ::=所有128个ASCII字符
<special> ::= "<" | ">" | "(" | ")" | "[" | "]" | "\" | "." | "," | ";" | ":" | "@" """
或控制字符
注意: "\"是一个转意字符,它表示在其后的字符代表另外的意义。
例如"Joe\,Smith"用于表示单独一个由逗号分隔的用户名。主机通常由转化为
地址的名称代表。注意:域的名称元素是正式的名称,不能够使用昵称或假名。
有时候名称的转变机制可能不知道主机,这就造成了通信的阻塞。为了解决这
个问题,可以采取两种方法:一种方法是:在"#"后加入一个十进制数表示主机地址;
另一种方法是在其后加入32位的IP地址,IP地址的形式是由句号分隔的四个介于
0-255之间的十进制数。时间戳行和返回路径行的格式通常由下面定义:
<return-path-line> ::= "Return-Path:" <SP><reverse-path><CRLF>
<time-stamp-line> ::= "Received:" <SP> <stamp> <CRLF>
<stamp> ::= <from-domain> <by-domain> <opt-info> ";" <daytime>
<from-domain> ::= "FROM" <SP> <域> <SP>
<by-domain> ::= "BY" <SP> <域> <SP>
<opt-info> ::= [<via>] [<with>] [<id>] [<for>]
<via> ::= "VIA" <SP> <连接> <SP>
<with> ::= "WITH" <SP> <协议> <SP>
<id> ::= "ID" <SP> <字符串> <SP>
<for> ::= "FOR" <SP> <路径> <SP>
<连接> ::= 在网络信息中心注册的连接的标准名称
<协议> ::= 在网络中心注册的协议的名称
<daytime> ::= <SP> <日> <SP> <时间>
<日期> ::= <日> <SP> <月> <SP> <年>
<时间> ::= <小时> ":" <分> ":" <秒> <SP> <时区>
<dd> ::= 由一个或两个数字组成的每月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中可以看到
全部的响应码。正规的情况下,响应由下面序列构成:三位的数字,<SP>,
一行文本和一个<CRLF>,或者也可以是一个多行响应。只有EXPN和HELP命令
可以导致多行应答,然而,对所有命令,多行响应都是允许的。
4.2.1. REPLY CODES BY FUNCTION GROUPS 500 格式错误,命令不可识别
(此错误也包括命令行过长)
501 参数格式错误
502 命令不可实现
503 错误的命令序列
504 命令参数不可实现
211 系统状态或系统帮助响应
214 帮助信息
220 <domain> 服务就绪
221 <domain> 服务关闭传输信道
421 <domain> 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作
为对任何命令的响应)
250 要求的邮件操作完成
251 用户非本地,将转发向<forward-path>
450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
451 放弃要求的操作;处理过程中出错
551 用户非本地,请尝试<forward-path>
452 系统存储不足,要求的操作未执行
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
354 开始邮件输入,以<CRLF>.<CRLF>结束
554 操作失败
4.3. 命令和应答序列
发送者和接收者之间的通信是一问一答的交替对话形式,由发送者控制。
这样,发送发出一条命令,接收者发出一个响应。接收者在发送下一条指令
前必须等应答。一个重要的应答是连接应答。在连接完成时,接收者通常会
发送220"服务就绪"。发送者在
上一个:用PHP实现POP3邮件的收取(三)
下一个:用PHP实现POP3邮件的收取(二)