【SMTP服务扩展】 SMTP提供一种可靠的有效的传送机制 , 它用于传送电子邮件 。虽然十几年来 , 它的作用已经有目共睹 , 可是对它功能的扩充也是必不可少的 。对SMTP服务的扩展我们介绍一下:在SMTP转发的邮件中包括信封和内容这两种东西 。我们写信也写信封和信皮 , 我们可以借生活中的信件来帮助理解 。
(1)SMTP信封比较轻易理解 , 它被作为一系列的SMTP协议单元传送 , 它包括发送者地址 , 传送模式 , 还有一个或多个接收者地址 。假如有不清楚的地方 , 请参阅《SMTP协议标准》 。
(2)至于内容 , 它是由两部分组成的 , 一部分是信头 , 一部分是信体 , 信头是由一个个的域/值对(一个域 , 一个值)组成的 , 假如信体有结构的话 , 它的结构是以MIME构造的 。内容从根本上来说是文本的 , 一般也是由ASCII码构成的 , 但是由于使用了MIME , 所以这个限制应该也是没有了 , 但信头却不行 , 一般都应该使用ASCII码表示 。虽然SMTP协议是一个不错的协议 , 可是对它的扩展还是不可避免 , 本文主要说明了一种扩展方法 , 使用这种扩展方法 , 服务器和用户之间可以相互知道对方使用了扩展 , 使用了多少 , 假如进行通信 。
这里我们希望让大家知道网络协议中的一个经验:参数越多 , 死得越快;参数越少 , 越能持久 。参数太多了 , 根本不利于使用 , 无法推广 , 早晚会被别的协议取代 。这也符合科学的基础原理 , 简单 。这说明在实现时一定要小心 , 假如不小心会便得到的远远小于付出的 , 有时根本不能提供任何益处 。
下面我们看一下EHLO命令 , 支持SMTP服务扩展的客户应该以EHLO命令开始SMTP会话 , 而不是通常的HELO命令 。假如服务器也支持 , 那就返回确认响应 , 假如不支持就返回失败响应 。因为引入了EHLO命令 , 因此会话开始的第一条命令可以是HELO或EHLO 。
因此引入了新的参数 , 所以SMTP的MAILFROM和RCPTTO命令行长度也能再是512字节了 , 但是引入新参数的长度必须加以说明 , 以便实现者预备缓冲区 。
命令格式如下:
ehlo-cmd::="EHLO"SPdomainCRLF
在命令成功是 , 服务器返回代码250 , 假如失败返回代码550 , 假如出错 , 返500 , 501 , 502 , 504或421 。对比《SMTP协议标准》 , EHLO命令可以出现在任何HELO命令出现的地方 , 在成功发送一个HELO或EHLO命令后再次发送它会使服务器返回503 。客户这时不能缓存服务器返回的任何信息 。这里一定要注重的是 , 每次开始SMTP扩展服务会话的时候必须发送EHLO命令 。假如服务器能够处理EHLO命令 , 它会返回代码250 。这样 , 服务器和客户就处于初始状态了 , 也就是说 , 所有的状态表和缓冲区已经预备完毕 。通常这种响应是多行的 , 每行响应包括一个要害字 , 假如有的话 , 还有一个或多个参数 , 响应的语法如下:
ehlo-ok-rsp::="250"domain[SPgreeting]CRLF
/("250-"domain[SPgreeting]CRLF
*("250-"ehlo-lineCRLF)
"250"SPehlo-lineCRLF)
greeting::=1*<除了CR或LF的所有字符>
ehlo-line::=ehlo-keyWord*(SPehlo-param)
ehlo-keyword::=(字母/数字)*(字母/数字/"-")
ehlo-param::=1*<随了空格和控制字符外的字符>
ALPHA::=<大写A到Z , 小写A到Z>
DIGIT::=<0到9>
CR::=<回车 , ASCII码13>
LF::=<换行 , ASCII码10>
SP::=<空格 , ASCII码32>
虽然EHLO要害字可以是大写 , 小写 , 大小写混合的 , 但是对它的处理是大小写敏感的 , 这是与原来规定不同的 。IANA支持SMTP服务扩展注册 , 相对于每个扩展都有一个相应的EHLO要害字值 , 每个在IANA注册的服务扩展必须在一个RFC中定义 。假如一个要害字以X开头 , 它指的是这个服务扩展是双方约定的 , 不是标准的 。
假如出于某种原因 , 服务器不能列出它所支持的服务扩展 , 就返回代码554 。在接收到这个代码后 , 客户要么发送HELO , 要么发送QUIT命令 。有时候服务器接收到EHLO命令 , 可是命令参数不可接受 , 它就返回代码501 。假如服务器识别了EHLO , 但对服务器扩展未实现 , 则返回代码502 。
假如服务器不再提供服务扩展 , 则返回代码421 。在接收到这个代码后 , 客户要么发送HELO , 要么发送QUIT命令 。假如服务器不支持服务扩展 , 则返回500 , 服务器保持现有状态 , 在接收到这个代码后 , 客户要么发送HELO , 要么发送QUIT命令 。
有时候 , SMTP服务器会在接收到EHLO命令后因为某种原因关闭连接 , 这种情况在原来的SMTP协议标准中未涉及 。为了处理这种情况 , 客户必须能够确认服务器是否能够工作 , 它可以重新连接并发送HELO或EHLO命令 。有些服务器在接收到一个EHLO命令后会拒绝接收新的HELO命令 , 这时可以利用RSET命令重新启动 , 然后再发送HELO 。假如客户不注重这样的小细节 , 会收到失败代码 。
下面我们来看一下MAILFROM和RCPTTO参数 。许多服务扩展是在MAILFROM和RCPTTO命令后加入一些参数来实现的 。下面我们看一下这两个命令的格式:
esmtp-cmd::=inner-esmtp-cmd[SPesmtp-parameters]CRLF
esmtp-parameters::=esmtp-parameter*(SPesmtp-parameter)
esmtp-parameter::=esmtp-keyword["="esmtp-value]
esmtp-keyword::=(字母/数字)*(字母/数字/"-")
esmtp-value::=1*<除了空格 , "="和控制字符的所有字符>
inner-esmtp-cmd::=("MAILFROM:"返回路径)/("RCPTTO:"转发路径)
假如服务器不能识别或实现一个或多个MAILFROM或RCPTTO参数 , 它应该返回代码555 。假如这种情况只是暂时的 , 服务器返回代码455 。其它返回代码请查阅相关资料 , 这里不再详述了 。服务器以服务扩展处理时 , 它处理的任何信息都应该在包头上加上“服务扩展标记”以示区别 。
下面是一个例子:
(1)双方交互:S是服务器 , C是客户 。
S:<等待连接在TCP端口25>
C:<连接到服务器>
S:220dbc.mtview.ca.usSMTPserviceready
C:EHLOymir.claremont.edu
S:250dbc.mtview.ca.ussayshello
...
(2)下面也是一个例子:
S:<等待连接在TCP端口25>
C:<连接到服务器>
S:220dbc.mtview.ca.usSMTPserviceready
C:EHLOymir.claremont.edu
S:250-dbc.mtview.ca.ussayshello
S:250-EXPN
S:250-HELP
S:250-8BITMIME
S:250-XONE
S:250XVRB
...
这说明服务器实现了服务扩展EXPN和HELP , 这两个是标准的服务扩展 , 另外两个以X开头的是非标准的 。
(3)最后 , 我们来看看服务器不支持服务扩展时的情况:
S:<等待连接在TCP端口25>
C:<连接到服务器>
S:220dbc.mtview.ca.usSMTPserviceready
C:EHLOymir.claremont.edu
S:500Commandnotrecognized:EHLO
...
代码500表示服务器不支持服务扩展 。
- 云计算服务如何保护用户的数据?
- 快手小店卖货服务费是多少 快手小店服务费是多少
- 退役军人服务站是做什么
- win7电脑提示group policy client服务未能登录如何解决?解决方法说明
- 微服务限流的意义
- win7如何禁用offline files服务 禁用offline files服务操作流程一览
- 订阅号可以升级为服务号吗
- 锤子T2手机支持卡入内存卡吗?锤子T2手机扩展内存说明
- 苹果iphone6s plus定位服务是什么?苹果iphone6s开启定位服务的方法
- 苹果游戏中心iCloud等服务遇故障 目前问题仍在持续中
