电子邮件SMTP协议原始命令码和工作原理

 中国邮箱网  0条评论  17932次浏览  2013年02月05日 星期二 13:48

分享到: 更多
【中国邮箱网 电子邮件频道】2月5日,SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。

SMTP协议的基本介绍

SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。SMTP 是建立在 TCP上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。

SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP 重要特性之一是其能跨越网络传输邮件,即“ SMTP 邮件中继”。通常,一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。

在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一条 IP 地址。

在传输文件过程中使用端口:25

SMTP是因特网电子邮件系统首要的应用层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样,SMTP也存在两个端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。当一个邮件服务器从其他邮件服务器接收邮件消息时,它是作为SMTP服务器在运行。

SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。 在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。SMTP可以指望由 TCP提供的可靠数据传输服务把该消息无错地传送到服务器。如果客户还有其他邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程;否 则,它就指示TCP关闭该连接。

SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。但是你只须记住下面的内容--该协议的基本命令和方法就行了。 

协议的原理很简单。无非是一个客户端计算机向服务器发送命令,然后服务器向客户端计算机返回一些信息。客房端发送的命令以及服务器的回应都是字符串,你并不需要特别的软件就能读出它们。如果你仔细看过WinsockTerminal示例程序的源代码,你就会发现这一点。现在让我们用这个示例程序来向自己发一封电子邮件吧。 

运行示例程序,单击"Connect"按钮,在"Connectto..."对话框中输入你的电子邮件服务器的地址,选择SMTP选项。最后按"Connect"按钮。如果连接成功,Winsock控件会产生Connected事件,在状态栏中也可看到连接成功的信息。在主文本窗口中你将看到从服务器返回的文本。该文本包含一个三位数的代码及描述,例如: 

220-ns.cinfo.ruSendmail8.6.12/8.6.9readyatWed,22Apr199822:54:41+0300 
220ESMTPspokenhere 

不必太过留意这些描述。因为这些描述可能会因服务器而异。你只须要知道代码所代表的意思就行了。代码220表示成功建立连接,服务器等待你的第一个命令。 

向服务器传递的第一个命令是HELO.该命令包含一个参数,即你的邮箱名。 

HELOoleg 

注意:在RFC821中,HELO是一个可选择性命令,如果服务器不要求该命令的话,你可以把它忽略掉。 

如果命令成功,服务器会返回一个代码为250的回应。下一步用MAILFROM命令告诉服务器你想发一封邮件。该命令以发信人的邮件地址为参数。 

MAILFROM : [email]oleg@vbip.com[/email] 

发完命令后,如果服务器返回一个代码为250回应,你就可以向服务器发送RCPTTO命令了。该命令以收信人地址为参数,一看便知是告诉服务器你想将邮件发到收信人地址处。 

RCPTTO : [email]somebody@domain.com[/email] 

如果你想将邮件发给多个收件人的话。你需要多次使用RCPTTO命令,对每个命令,服务器都会返回代码为250的回应。 

现在你可以向服务器发送邮件正文了。用DATA命令告诉服务器以下的内容为邮件正文。在你从服务器收到代码为354的回应后,你就可以发送邮件正文了。邮件按行发送,每行邮件以一个无回车的换行符结束(在VB中就是vbLf)示例程序知道何时使用换行符,何时使用回车加换行符。所以你只须按回车键就行了。下面是一个例子: 

Subject : Myfirste-mailmessage. 

Firstlineofamessage. 
Secondline. 

注意上面最后一行的最后一个字符是一个小数点。这是正文结束的标志。用VB代码表示就是vbLf&"."&vbCrLf.服务器收到这个标志后,就会立即向你返回一个代码为250的回应以及该邮件的唯一ID号。 

250WAA10568Messageacceptedfordelivery 

任务完成了,你可以继续发送下封邮件,也可以断开同服务器的连接。如果要断开同服务器的连接就用QUIT命令。在这种情况下,服务器会返回一个代码为221的回应并断开连接。 

SMTP协议原始命令码和工作原理 

1.SMTP是工作在两种情况下:

一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器 

2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返 
回状态的三位数字代码 

3.SMTP在TCP协议25号端口监听连接请求 

4.连接和发送过程: 

a.建立TCP连接 
b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令 
服务器端正希望以OK作为响应,表明准备接收 
c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行 
服务器端则表示是否愿意为收件人接受邮件 
d.协商结束,发送邮件,用命令DATA发送 
e. 以.表示结束输入内容一起发送出去 
f.结束此次发送,用QUIT命令退出。 

5.另外两个命令: 

VRFY---用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。 
EXPN---用于扩充邮件列表。 

6.邮件路由过程: 

SMTP服务器基于‘域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录 
来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。 

若SMTP服务器mail.abc.com收到一封信要发到[email]shuser@sh.abc.com[/email]: 

a.Sendmail请求DNS给出主机sh.abc.com的CNAME记录,如有,假若CNAME到shmail.abc.com,则再次 
请求shmail.abc.com的CNAME记录,直到没有为止 
b.假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com域的DNS给出shmail.abc.com的MX记录, 
shmail MX 5 shmail.abc.com 
10 shmail2.abc.com 
c. Sendmail最后请求DNS给出shmail.abc.com的A记录,即IP地址,若返回值为1.2.3.4 
d. Sendmail与1.2.3.4连接,传送这封给[email]shuser@sh.abc.com[/email]的信到1.2.3.4这台服务器的SMTP后台程序 

7.SMTP基本命令集: 

命令        描述 
------------------------------ 
HELO 向服务器标识用户身份 
发送者能欺骗,说谎,但一般情况下服务器都能检测到。 

MAIL 初始化邮件传输 
mail from: 
RCPT 标识单个的邮件接收人;常在MAIL命令后面 
可有多个rcpt to: 
DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束。 
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令 
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用 
HELP 查询服务器支持什么命令 
NOOP 无操作,服务器应响应OK 
QUIT 结束会话 
RSET 重置会话,当前传输被取消 
-------------------------------- 

8. MAIL FROM命令中指定的地址是称作 envelope from地址,不需要和发送者自己的地址是一致的。 
RCPT TO 与之等同,指明的接收者地址称为envelope to地址,而与实际的to:行是什么无关。 

9.为什么没有RCPT CC和RCPT BCC:? 
所有的接收者协商都通过RCPT TO命令来实现,如果是BCC,则协商发送后在对方接收时被删掉信封接收者 

10.邮件被分为信封部分,信头部分和信体部分 
envelope from, envelope to 与message from:, message to:完全不相干。 
evnelope是由服务器主机间SMTP后台提供的,而message from/to是由用户提供的。有无冒号也是区别。 

11. 怎样由信封部分检查是否一封信是否是伪造的? 
a. received行的关联性。 
现在的SMTP邮件传输系统,在信封部分除了两端的内部主机处理的之个,考虑两个公司防火墙之间 
的部分,若两台防火墙机器分别为A和B,但接收者检查信封received:行时发现经过了C.则是伪造的。 
b. received :行中的主机和IP地址对是否对应如: 
Receibed : from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu.... 
c. 被人手动添加在最后面的received行: 
Received : from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5) 
Received : from lemongrass.org by galangal.org (8.7.3) 
Received : from graprao.com by lemongrass.org (8.6.4) 

SMTP协议通讯模型 

SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。可大致用下面的通讯模型示意图来表示: 


SMTP协议的命令和应答 

从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下: 

SMTP命令命令说明 

HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令 
MAILFROM :<reverse-path><CRLF><reverse-path>为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。 
RCPTTO :<forward-path><CRLF><forward-path>标识各个邮件接收者的地址 
DATA<CRLF> 
接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。 
REST<CRLF>退出/复位当前的邮件传输 
NOOP<CRLF>要求接收SMTP仅做OK应答。(用于测试) 
QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输。 
VRFY<string><CRLF>验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。 
EXPN<string><CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。 
HELP<CRLF>查询服务器支持什么命令 

注:<CRLF>为回车、换行,ASCII码分别为13、10(十进制)。 

SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下: 

应答码说明 

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开始邮件输入,以"."结束 
554操作失败

SMTP通信举例

在发送方(客户端)和接收方(服务器)间建立连接之后,接下来是一个合法的SMTP会话。在下面的对话中,所有客户端发送的都以“C:”作为前缀,所有服务器发送的都以“S:”作为前缀。在多数计算机系统上,可以在发送的机器上使用telnet命令来建立连接,比如:
telnet www.example.com 25
它打开一个从发送的机器到主机www.example.com的SMTP连接。
S: 220 www.example.com ESMTP Postfix
C: HELO mydomain.com
S: 250 Hello mydomain.com
C: MAIL FROM: <sender@mydomain.com>
S: 250 Ok
C: RCPT TO: <friend@example.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: Subject: test message
C: From:""< sender@mydomain.com>
C: To:""< friend@example.com>
C:
C: Hello,
C: This is a test.
C: Goodbye.
C: .
S: 250 Ok: queued as 12345
C: quit
S: 221 Bye
虽然是可选的,但几乎所有的客户端都会使用EHLO问候消息(而不是上面所示的HELO)来询问服务器支持何种SMTP扩展,邮件的文本体(接着DATA)一般是典型的MIME格式。

SMTP安全和垃圾邮件

最初的SMTP的局限之一在于它没有对发送方进行身份验证的机制。因此,后来定义了SMTP-AUTH扩展。
尽管有了身份认证机制,垃圾邮件仍然是一个主要的问题。但由于庞大的SMTP安装数量带来的网络效应,大刀阔斧地修改或完全替代SMTP被认为是不现实的。Internet Mail 2000就是一个替代SMTP的建议方案。
因此,出现了一些同SMTP工作的辅助协议。IRTF的反垃圾邮件研究小组正在研究一些建议方案,以提供简单、灵活、轻量级的、可升级的源端认证。最有可能被接受的建议方案是发送方策略框架协议。

维基百科对于SMTP协议介绍

简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在Internet传输email的标准。

SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX (Mail eXchange) DNS。

在八十年代早期SMTP开始被广泛地使用。当时,它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反,SMTP在发送和接收的机器始终连接在网络的情况下工作得最好。

Sendmail是最早实现SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP实现为一个客户端(消息的发送者)或一个服务器(消息的接收者)。一些其他的流行的SMTP服务器程序包括了Philip Hazel的exim,IBM的Postfix, D. J. Bernstein的Qmail,以及Microsoft Exchange Server。

由于这个协议开始是基于纯ASCII文本的,它在二进制文件上处理得并不好。诸如MIME的标准被开发来编码二进制文件以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。

SMTP是一个“推”的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3或IMAP。另一个SMTP服务器可以使用ETRN在SMTP上触发一个发送。

参考资料:

维基百科中文版SMTP介绍:http://zh.wikipedia.org/zh-cn/SMTP
百度百科基于SMTP介绍:http://baike.baidu.com/view/5450.htm

中国邮箱网编辑整理

标签:smtp

我的评论:

请  后发表评论。