SMTP服务扩展

原创 2001年05月04日 13:56:00

SMTP服务扩展

SMTP提供一种可靠的有效的传送机制,它用于传送电子邮件。虽然十几年来,它的作用已经有目共睹,可是对它功能的扩充也是必不可少的。对SMTP服务的扩展我们介绍一下:在SMTP转发的邮件中包括信封和内容这两种东西。我们写信也写信封和信皮,我们可以借生活中的信件来帮助理解。

(1) SMTP信封比较容易理解,它被作为一系列的SMTP协议单元传送,它包括发送者地址,传送模式,还有一个或多个接收者地址。如果有不清楚的地方,请参阅《SMTP协议标准》

(2) 至于内容,它是由两部分组成的,一部分是信头,一部分是信体,信头是由一个个的域/值对(一个域,一个值)组成的,如果信体有结构的话,它的结构是以MIME构造的。内容从根本上来说是文本的,一般也是由ASCII码构成的,但是由于使用了MIME,所以这个限制应该也是没有了,但信头却不行,一般都应该使用ASCII码表示。虽然SMTP协议是一个不错的协议,可是对它的扩展还是不可避免,本文主要说明了一种扩展方法,使用这种扩展方法,服务器和用户之间可以相互知道对方使用了扩展,使用了多少,如果进行通信。

这里我们希望让大家知道网络协议中的一个经验:参数越多,死得越快;参数越少,越能持久。参数太多了,根本不利于使用,无法推广,早晚会被别的协议取代。这也符合科学的基础原理,简单。这说明在实现时一定要小心,如果不小心会便得到的远远小于付出的,有时根本不能提供任何益处。

下面我们看一下EHLO命令,支持SMTP服务扩展的客户应该以EHLO命令开始SMTP会话,而不是通常的HELO命令。如果服务器也支持,那就返回确认响应,如果不支持就返回失败响应。因为引入了EHLO命令,因此会话开始的第一条命令可以是HELO或EHLO。

因此引入了新的参数,所以SMTP的MAIL FROM和RCPT TO命令行长度也能再是512字节了,但是引入新参数的长度必须加以说明,以便实现者准备缓冲区。

命令格式如下:

ehlo-cmd ::= "EHLO" SP domain CR LF

在命令成功是,服务器返回代码250,如果失败返回代码550,如果出错,返回500,501,502,504或421。对比《SMTP协议标准》,EHLO命令可以出现在任何HELO命令出现的地方,在成功发送一个HELO或EHLO命令后再次发送它会使服务器返回503。客户这时不能缓存服务器返回的任何信息。这里一定要注意的是,每次开始SMTP扩展服务会话的时候必须发送EHLO命令。如果服务器能够处理EHLO命令,它会返回代码250。这样,服务器和客户就处于初始状态了,也就是说,所有的状态表和缓冲区已经准备完毕。通常这种响应是多行的,每行响应包括一个关键字,如果有的话,还有一个或多个参数,响应的语法如下:

ehlo-ok-rsp ::= "250" domain [ SP greeting ] CR LF

                             / ( "250-" domain [ SP greeting ] CR LF

                             *( "250-" ehlo-line CR LF )

                            "250" SP ehlo-line CR LF )

greeting ::= 1*<除了CR 或LF的所有字符>

ehlo-line ::= ehlo-keyword *( SP ehlo-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。如果客户不注意这样的小细节,会收到失败代码。

下面我们来看一下MAIL FROM和RCPT TO参数。许多服务扩展是在MAIL FROM和RCPT TO命令后加入一些参数来实现的。下面我们看一下这两个命令的格式:

 

esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF

esmtp-parameters ::= esmtp-parameter *(SP esmtp-parameter)

esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]

esmtp-keyword ::= (字母/数字) *(字母/数字/"-")

esmtp-value ::= 1*<除了空格,"="和控制字符的所有字符>

inner-esmtp-cmd ::= ("MAIL FROM:"返回路径) / ("RCPT TO:"转发路径)

如果服务器不能识别或实现一个或多个MAIL FROM或RCPT TO参数,它应该返回代码555。如果这种情况只是暂时的,服务器返回代码455。其它返回代码请查阅相关资料,这里不再详述了。服务器以服务扩展处理时,它处理的任何信息都应该在包头上加上“服务扩展标记”以示区别。

下面是一个例子:

(1) 双方交互:S是服务器,C是客户。

S: <等待连接在TCP端口25>

C: <连接到服务器>

S: 220 dbc.mtview.ca.us SMTP service ready

C: EHLO ymir.claremont.edu

S: 250 dbc.mtview.ca.us says hello

...

 

(2) 下面也是一个例子:

S: <等待连接在TCP端口25>

C: <连接到服务器>

S: 220 dbc.mtview.ca.us SMTP service ready

C: EHLO ymir.claremont.edu

S: 250-dbc.mtview.ca.us says hello

S: 250-EXPN

S: 250-HELP

S: 250-8BITMIME

S: 250-XONE

S: 250 XVRB

...

 

这说明服务器实现了服务扩展EXPN和HELP,这两个是标准的服务扩展,另外两个以X开头的是非标准的。

 

(3) 最后,我们来看看服务器不支持服务扩展时的情况:

S: <等待连接在TCP端口25>

C: <连接到服务器>

S: 220 dbc.mtview.ca.us SMTP service ready

C: EHLO ymir.claremont.edu

S: 500 Command not recognized: EHLO

...

代码500表示服务器不支持服务扩展。

SMTP服务扩展

SMTP提供一种可靠的有效的传送机制,它用于传送电子邮件。虽然十几年来,它的作用已经有目共睹,可是对它功能的扩充也是必不可少的。对SMTP服务的扩展我们介绍一下:在SMTP转发的邮件中包括信封和内容这两种东西。我们写信也写信封和信皮,我们可以借生活中的信件来帮助理解。

(1) SMTP信封比较容易理解,它被作为一系列的SMTP协议单元传送,它包括发送者地址,传送模式,还有一个或多个接收者地址。如果有不清楚的地方,请参阅《SMTP协议标准》

(2) 至于内容,它是由两部分组成的,一部分是信头,一部分是信体,信头是由一个个的域/值对(一个域,一个值)组成的,如果信体有结构的话,它的结构是以MIME构造的。内容从根本上来说是文本的,一般也是由ASCII码构成的,但是由于使用了MIME,所以这个限制应该也是没有了,但信头却不行,一般都应该使用ASCII码表示。虽然SMTP协议是一个不错的协议,可是对它的扩展还是不可避免,本文主要说明了一种扩展方法,使用这种扩展方法,服务器和用户之间可以相互知道对方使用了扩展,使用了多少,如果进行通信。

这里我们希望让大家知道网络协议中的一个经验:参数越多,死得越快;参数越少,越能持久。参数太多了,根本不利于使用,无法推广,早晚会被别的协议取代。这也符合科学的基础原理,简单。这说明在实现时一定要小心,如果不小心会便得到的远远小于付出的,有时根本不能提供任何益处。

下面我们看一下EHLO命令,支持SMTP服务扩展的客户应该以EHLO命令开始SMTP会话,而不是通常的HELO命令。如果服务器也支持,那就返回确认响应,如果不支持就返回失败响应。因为引入了EHLO命令,因此会话开始的第一条命令可以是HELO或EHLO。

因此引入了新的参数,所以SMTP的MAIL FROM和RCPT TO命令行长度也能再是512字节了,但是引入新参数的长度必须加以说明,以便实现者准备缓冲区。

命令格式如下:

ehlo-cmd ::= "EHLO" SP domain CR LF

在命令成功是,服务器返回代码250,如果失败返回代码550,如果出错,返回500,501,502,504或421。对比《SMTP协议标准》,EHLO命令可以出现在任何HELO命令出现的地方,在成功发送一个HELO或EHLO命令后再次发送它会使服务器返回503。客户这时不能缓存服务器返回的任何信息。这里一定要注意的是,每次开始SMTP扩展服务会话的时候必须发送EHLO命令。如果服务器能够处理EHLO命令,它会返回代码250。这样,服务器和客户就处于初始状态了,也就是说,所有的状态表和缓冲区已经准备完毕。通常这种响应是多行的,每行响应包括一个关键字,如果有的话,还有一个或多个参数,响应的语法如下:

ehlo-ok-rsp ::= "250" domain [ SP greeting ] CR LF

                             / ( "250-" domain [ SP greeting ] CR LF

                             *( "250-" ehlo-line CR LF )

                            "250" SP ehlo-line CR LF )

greeting ::= 1*<除了CR 或LF的所有字符>

ehlo-line ::= ehlo-keyword *( SP ehlo-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。如果客户不注意这样的小细节,会收到失败代码。

下面我们来看一下MAIL FROM和RCPT TO参数。许多服务扩展是在MAIL FROM和RCPT TO命令后加入一些参数来实现的。下面我们看一下这两个命令的格式:

 

esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF

esmtp-parameters ::= esmtp-parameter *(SP esmtp-parameter)

esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]

esmtp-keyword ::= (字母/数字) *(字母/数字/"-")

esmtp-value ::= 1*<除了空格,"="和控制字符的所有字符>

inner-esmtp-cmd ::= ("MAIL FROM:"返回路径) / ("RCPT TO:"转发路径)

如果服务器不能识别或实现一个或多个MAIL FROM或RCPT TO参数,它应该返回代码555。如果这种情况只是暂时的,服务器返回代码455。其它返回代码请查阅相关资料,这里不再详述了。服务器以服务扩展处理时,它处理的任何信息都应该在包头上加上“服务扩展标记”以示区别。

下面是一个例子:

(1) 双方交互:S是服务器,C是客户。

S: <等待连接在TCP端口25>

C: <连接到服务器>

S: 220 dbc.mtview.ca.us SMTP service ready

C: EHLO ymir.claremont.edu

S: 250 dbc.mtview.ca.us says hello

...

 

(2) 下面也是一个例子:

S: <等待连接在TCP端口25>

C: <连接到服务器>

S: 220 dbc.mtview.ca.us SMTP service ready

C: EHLO ymir.claremont.edu

S: 250-dbc.mtview.ca.us says hello

S: 250-EXPN

S: 250-HELP

S: 250-8BITMIME

S: 250-XONE

S: 250 XVRB

...

 

这说明服务器实现了服务扩展EXPN和HELP,这两个是标准的服务扩展,另外两个以X开头的是非标准的。

 

(3) 最后,我们来看看服务器不支持服务扩展时的情况:

S: <等待连接在TCP端口25>

C: <连接到服务器>

S: 220 dbc.mtview.ca.us SMTP service ready

C: EHLO ymir.claremont.edu

S: 500 Command not recognized: EHLO

...

代码500表示服务器不支持服务扩展。

php发送邮件插件

  • 2013年06月27日 16:22
  • 107KB
  • 下载

php 走 本地 smtp 发邮件

  • huithe
  • huithe
  • 2012年05月07日 10:48
  • 669

RFC2554 SMTP服务认证扩展

SMTP服务认证扩展(RFC 2554 SMTP Service Extension for Authentication)Status of this Memo   This document sp...
  • pangkeyu
  • pangkeyu
  • 2008年04月10日 15:43
  • 251

Python2.7.8第三方邮件服务商的 SMTP 测试访问

#-*- coding:utf-8 -*- import smtplib from email.mime.text import MIMEText from email.mime.multipart ...
  • qq_20032995
  • qq_20032995
  • 2017年03月03日 11:36
  • 785

php实现邮件发送---实用的小功能(一)

如今借助三方邮箱和短信验证注册越来越普及,为方便初学者,特分两部分讲解基于php的最简单的邮件发送与短信发送,长话短说 php本身并没有自带的邮件类库,实现邮件功能,简单的方法就是依赖email类来实...
  • zhangsheng_1992
  • zhangsheng_1992
  • 2015年03月29日 17:04
  • 7109

PHP 发送邮件

  • 2017年08月21日 15:53
  • 209KB
  • 下载

Windows 2003设置PHP扩展支持OpenSSL的解决方法 服务器发送邮件

以下就是Windows 2003 + IIS 下,如何在PHP扩展里打开openssl支持的方法: 1、在c:\windows\php.ini中 将;extension=php_openssl.d...
  • magicbreaker
  • magicbreaker
  • 2014年07月29日 11:56
  • 2003

安装POP3和SMTP服务组件

 Windows Server 2003默认情况下是没有安装POP3和SMTP服务组件的,因此我们要手工添加。 1.安装POP3服务组件以系统管理员身份登录Windows Server 2003 系统...
  • tanzugan
  • tanzugan
  • 2011年03月28日 12:07
  • 2729

不能发送邮件 php+smtp失败:The following From address failed

合肥手机站最近出现不能发送邮件,但我在本地windows上测试是可以通过的,但上传到ubuntu服务器上却不行了,提示The following From address failed错误,所以断定是...
  • maorenqi101
  • maorenqi101
  • 2013年08月12日 10:11
  • 2924

No releases for package "pear/Net_SMTP" exist 错误的解决

pear install Net_SMTP-1.8.0.tgz.gz 执行这个命令的时候,报这个错误, No releases for package "pear/Net_SMTP" exist ...
  • u010154380
  • u010154380
  • 2017年05月06日 10:50
  • 417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SMTP服务扩展
举报原因:
原因补充:

(最多只允许输入30个字)