`
cloudmail
  • 浏览: 271034 次
  • 来自: 广州
社区版块
存档分类
最新评论

SMTP结构及原理

阅读更多

◆ SMTP的基本结构

  SMTP (Simple Mail Transfer Protocol)协议是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有SMTP协议,但事实上它与传输系统和机制无关,仅要求一个可靠的数据流通道。它可以工作在TCP上,也可以工作在NCP, NITS 等协议上。在TCP上,它使用端口25进行传输。SMTP的一个重要特点是可以在可交互的通信系统中转发邮件。

  1. SMTP的模型

  SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。下面是SMTP的模型示意图。

  

  发件方SMTP向收件方发处MAIL命令,告知发件方的身份;如果收件方接受,就会回答OK。发件方再发出RCPT命令,告知收件人的身份,收件方SMTP确认是否接收或转发,如果同意就回答OK;接下来就可以进行数据传输了。通信过程中,发件方SMTP与收件方SMTP 采用对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。整个过程由发件方控制,有时需要确认几回才可以。

  

  为了保证回复命令的有效,SMTP要求发件方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由ASCII码组成。命令代码是大小写无关的,如MAIL和 mail ﹑mAIL是等效的。

 

  2. SMTP的基本命令

  SMTP定义了14个命令,它们是:

HELO
MAIL FROM:
RCPT TO:
DATA
RSET
SEND FROM:
SOML FROM:
SAML FROM:
VRFY
EXPN
HELP [ ]
NOOP
QUIT
TURN

  其中使得SMTP工作的基本的命令有7个,分别为:HELO﹑MAIL﹑RCPT﹑DATA﹑REST﹑NOOP和QUIT.下面分别介绍如下。

  HELO--发件方问候收件方,后面是发件人的服务器地址或标识。收件方回答OK时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。

  MAIL--这个命令用来开始传送邮件,它的后面跟随发件方邮件地址(返回邮件地址)。它也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发件方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。

  RCPT --这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,它必须报550错误代码通知发件方。如果服务器同意转发,它要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。

  DATA--收件方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是"."的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复OK。

  REST--这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收放必须回答OK.

  NOOP--这个命令不影响任何参数,只是要求接收放回答OK, 不会影响缓冲区的数据。

 

  QUIT--SMTP要求接收放必须回答OK,然后中断传输;在收到这个命令并回答OK前,收件方不得中断连接,即使传输出现错误。发件方在发出这个命令并收到OK答复前,也不得中断连接。

 

  下面是SMTP答复中用到的代码和含义:

500 Syntax error, command unrecognized
[This may include errors such as command line too long]
501 Syntax error in parameters or arguments
502 Command not implemented
503 Bad sequence of commands
504 Command parameter not implemented
211 System status, or system help reply
214 Help message
[Information on how to use the receiver or the meaning of a
particular non-standard command; this reply is useful only to the human user]
220 Service ready
221 Service closing transmission channel
421 Service not available, closing transmission channel
[This may be a reply to any command if the service knows it must shut down]
250 Requested mail action okay, completed
251 User not local; will forward to
450 Requested mail action not taken: mailbox unavailable
[E.g., mailbox busy]
550 Requested action not taken: mailbox unavailable
[E.g., mailbox not found, no access]
451 Requested action aborted: error in processing
551 User not local; please try
452 Requested action not taken: insufficient system storage
552 Requested mail action aborted: exceeded storage allocation
553 Requested action not taken: mailbox name not allowed
[E.g., mailbox syntax incorrect]
354 Start mail input; end with .
554 Transaction failed

  最后,让我们看一个RFC821中给出的例子。这封信是Smith在主机Alpha.ARPA 发给主机Beta.ARPA上的

 

  Jones,Green和 Brown.并且假定两台主机在同一个网络上。

S: MAIL FROM:
R: 250 OK
S: RCPT TO:
R: 250 OK
S: RCPT TO:
R: 550 No such user here
S: RCPT TO:
R: 250 OK
S: DATA
R: 354 Start mail input; end with .
S: Blah blah blah...
S: ...etc. etc. etc.
S: .
R: 250 OK

  邮件最后被对方接受。

  ◆ 电子邮件的工作原理

  电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如下图所示:

 

 

  更进一步的解释涉及到以下几个概念:

  MUA -- Mail User Agent, 邮件用户代理,帮助用户读写邮件;

  MTA -- Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务

  器或邮件投递代理;

  MDA -- Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。

  整个邮件传输过程如下:

  目前使用的SMTP 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如下图所示。

  

  如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。

  ◆ 电子邮件的信头结构及分析

 

  1 .邮件的结构

  在最高层,邮件的结构是非常简单的,用户从终端机上看到的邮件格式一般为:

  1. From: user1@domain1.com

  2. To: user2@domain2.com

  3. Subject: Explaination of mail format

  4. Date: Thu, 1 Apr 1999. 10:00:00 GMT

  5. Hi, Jack

  7. This mail is to explain you the mail format

  8. - - - -

  9. Thanks

  10. Bob

  其中, 1~~4 行称作信件信头(message header) 6~~10行描述信件要表达的内容,称为信体 (message body)。第5行是空行,根据RFC822的要求,信头和信体之间必须加入一空行。[i]信头通常包含字段From, To, Subject 和Date,有的邮件还包含cc,bcc等字段。

  2. 邮件的信头

  事实上,邮件在传输过程中,服务器要把它打包成一个数据对象,包括上面的信件和一个信封。邮件的投递是依靠信封上的地址或信封信头(envelop address 或envelop header),而不是上面讲的信件上的地址。

  从表面上看,一封邮件是从发件人的机器直接传送到收件人的机器,但通常这并不正确,一封邮件发送和接受过程至少要经过四台计算机。参考下图所示。用户通常在自己的电脑前编写阅读邮件,我们把它叫做客户端 (client 1~~4 )。大部分组织里,都是用一台专门的机器处理邮件,称作邮件服务器 (SMTP1, SMTP2). 如果用户是从家里拨号上网,那末邮件服务器是ISP 提供的。

  

  当某个用户在自己的电脑 Client1 前编写完一个邮件,然后把它发送到他的ISP 的邮件服务器SMTP1。此时她的机器已经完成了所有的工作,但邮件服务器SMTP1还必须想法把邮件发送到目的地。SMTP1 通过阅读信头或信封上的地址,找到收件认得邮件服务器SMTP2, 然后与该服务器建立连接,把邮件发到收件人的服务器上,等待收件人来取阅。

 

  下面我们将通过一个例子说明整个邮件传送过程及邮件的信头变化。假设发件人的名字叫 Sender, email地址是 sender@domain1.com使用的电脑名字叫 client1, IP 地址是 [111.11.1.1] (假设的地址)。 收件人的名字叫 receipt, email 地址是 receipt@domain2.com, 使用的电脑的名字叫 client2,IP地址是 [222.22.2.2] (假设的地址)。当邮件编辑完传送给其邮件服务器mail.domain1.com 时,邮件的信头格式为:

 

From: sender@domain1.com
To: receipt@domain2.com
Date: Tue, Mar 18 1998 15:36:24 GMT
X-mailer:Sendmail 8.9.0
Subject: Greetings

  当邮件服务器 mail.domain1.com 把邮件传到接收方的服务器 mail.domain2.com 时,接受方服务器会在信头上记录下有关的计算机信息,邮件的信头变成:

Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:3 7:24 GMT
From: sender@domain1.com
To: receipt@domain2.com
Date: Tue, Mar 18 1998 15:36:24 GMT
Message-Id:
X-mailer:Sendmail 8.9.0
Subject: Greetings

  当收件人服务器mail.domain2.com 把邮件接收并存初下来,等待收件人来阅读时,邮件的信头将会再加入一条记录:

Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with ESMTP id LAA20869; Tue, Mar 18 1998 15:39:44 GMT
Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT
From: sender@domain1.com
To: receipt@domain2.com
Date: Tue, Mar 18 1998 15:36:24 GMT
Message-Id:
X-mailer:Sendmail 8.9.0
Subject: Greetings

  上面整个记录就将是收件人看到的完整的邮件信头。让我们逐行看一下信头中各行的含义:

 

Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with ESMTP id LAA20869; Tue, Mar 18 1998 15:39:44 GMT

  这封信是从一台自称为 mail.domain1.com 的机器上接收的;这台机器的IP 地址是[111.11.1.0],真实名字就是标称名字 mail.domain1.com; 接收方的机器名称是 mail.domain2.com, 运行的邮件服务器是 Sendmail, 版本(8.8.5/8.7.2) 。接收方机器给邮件的编号是ESMTP id LAA20869, 接收到的时间是 Tue, Mar 18 1998 15:39:44 GMT。

Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT

  这条记录表明信件是由机器client1.domain1.com ( IP 地址是 [111.11.1.1]) 在Tue, Mar 18 1998 15:37:24 GMT交给mail.domain1.com,并赋给编号id 004A21。

  From,TO ,Date和Subject 都易于理解,分别指明发件人,收件人,信件编辑日期及信件主题。

 

Message-Id:

  这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。

  ◆ OPEN RELAY 的原理及测试

  1.OPEN RELAY 的原理

  由于技术的原因,在80年代前,网络还不是很健全,机器之间很少能直接对话发送邮件,人们必须得找出一条有效的连接通路来,然后信件沿着通路一步一步传送到目的地。SMTP协议中就明确指出当邮件在不同的网络间传送时,需要借助中间服务器的RELAY。

  邮件在收件方和发件方之间会经过毫不相干的第三方服务器,这就是邮件转发 (RELAY)。 如下图所示:

  

 

  图中的 MAIL SERVER 是可以对要求转发的邮件进行限制的,如只转发来自某个域的邮件或来自于某些IP 得邮件。如果转发没有任何限制,就被称为 OPEN RELAY 或 THIRD PARTY RELAY。

  从历史上看,relay 曾经发挥过重要作用。而且当时这些工作主要靠手工来做,就像我们今天通过邮局发一封信一样。假如我想从沈阳发一封信件到深圳,我再信封上写好收信地址深圳,邮局就需要找到定义的运送路线: 沈阳,北京,郑州,长沙,广州,深圳。甚至还要长一些。其中很重要一点是每一个中继站都能很好的理解这封信将被送到哪里,下一个接收站是谁。在电子邮件里,这就相当于每个中继服务器清楚下一个服务起是谁,这就是邮件的转发。

  目前,正常邮件转发已经不再必要,相反,无限制转发常常被发送垃圾邮件的人利用,隐藏真实的邮件来源,让别人以为是从另外的ISP 发出的信件;同时,也把大量的处理工作转移到别人机器上。

  由于前面提到的历史的原因,最初的绝大多数邮件服务器都允许OPEN RELAY的。今天,大部分邮件服务器升级版本已经在缺省设置中关闭了OPEN RELAY, 如Sendmail 从8.9.3版本开始,Exchange Server从5.5版本开始关闭了open relay。有的服务器虽然没有相应的升级版本,也都提供了关闭open relay 的方法,如在NOTES SERVER的配置文件notes.ini 中加入一行:SMTPMTA_REJECT_RELAYS=1。但由于很多服务器管理员的疏忽而没能及时的修补这些安全漏洞,被利用来转发垃圾邮件。

  2. 如何确认邮件服务器是否RELAY

  假设要测试的IP是202.112.0.0. 可以使用下列命令进行测试,文中的绿色斜题字为测试邮件服务器的反馈信息:

#telnet 202.112.0.0 25
Trying 202.112.0.0...
Connected to 202.112.0.0.
Escape character is '^]'.
220 dns.ccert.edu.cn ESMTP Sendmail 8.11.1/8.11.1; Sat, 30 Jun 2001 21:07:10 +0800
helo mydomain
250 dns.ccert.edu.cn Hello point.ccert.edu.cn [202.112.50.3], pleased to meet you
mail from:nobody@yahoo.com
250 2.1.0 nobody@#yahoo.com... Sender ok
rcpt to:nobody@hotmail.com
550 5.7.1 nobody@hotmail.com... Relaying denied

  最后的Relaying denied 表明该服务器已经安全设置,不会再relay无关邮件了。如果显示的结果是下面的样子,这表明服务器可以转发任何人的邮件。

 

rcpt to:nobody@hotmail.com
250 nobody@hotmail.com... Recipient ok
data
354 Enter mail, end with "." on a line b
y itself

 

this is a test of the relay
.
250 VAA00289 Message accepted for delivery

  除了用上面的命令行的方法测试外,下面的链接提供了一个测试工具,只需输入IP即可。

分享到:
评论

相关推荐

    邮箱实现原理。POP3,SMTP

    了解和掌握SMTP和POP3的原理及编程,对于开发邮件应用至关重要,包括能够编写异步的邮件接收和发送程序,理解邮件的结构(信封、首部、正文和结束符号),以及如何处理SMTP响应码,这些都是成为熟练的IT从业者所必需...

    电子邮件收发原理和实现(POP3, SMTP) [整理]

    电子邮件是互联网上最常用的信息交流方式之一,其收发原理主要依赖于两个协议:POP3(Post Office Protocol version 3)和SMTP(Simple Mail Transfer Protocol)。这篇内容将深入讲解这两个协议的工作机制,并通过...

    SMTP邮件服务器实验报告及源代码.docx

    总的来说,这个实验帮助学生深入理解SMTP协议的工作原理,并通过实践掌握了Socket API的使用。虽然这个简单的SMTP服务器可能不包含所有专业邮件服务器的复杂特性,但它提供了基础的邮件接收和转发功能,对于学习和...

    SMTP邮件发送程序

    在本文中,我们将深入探讨SMTP的工作原理、C++编程中的SMTP邮件实现、Base64编码以及如何处理邮件附件,同时也将提及邮件炸弹程序的概念。 1. SMTP工作原理: SMTP是互联网标准,用于在邮件服务器之间传输邮件。它...

    smtp sdk

    在给定的文件列表中,我们可以推测这可能是一个SMTP SDK相关的项目构建结构: - `build.xml`:这通常是Ant构建工具的配置文件,用于自动化构建过程,如编译、测试和打包。 - `testdata`:这个目录可能包含了用于单元...

    Wireshark协议分析之SMTP.zip

    Wireshark是一款强大的网络封包分析软件,它可以捕获并解析网络流量,对于理解SMTP协议的工作原理非常有帮助。在这个名为"Wireshark协议分析之SMTP.zip"的压缩文件中,包含了四个*.pcapng数据包,这些数据包记录了...

    SMTP.zip_mail server_smtp_smtp server

    SMTP(Simple Mail Transfer Protocol)是互联网上用于发送电子邮件的标准协议。...了解SMTP的工作原理和如何使用SMTP服务器发送邮件是网络编程中的重要知识,尤其对于开发企业级应用或者自动化邮件系统来说。

    smtp_邮件发送客户端.zip

    通过研究和运行这个SMTP邮件发送客户端,开发者可以深入理解SMTP协议的工作原理,学习如何在实际项目中实现邮件发送功能。这不仅有助于提升网络编程技能,还能为开发企业级应用或自动化任务提供基础。

    smtp 协议实例

    通过阅读和理解这些源代码,开发者不仅可以学习如何使用C++编写网络应用程序,还能深入理解SMTP协议的工作原理以及MIME在电子邮件中的应用。对于希望在邮件系统开发或网络编程领域深化的人来说,这是一个非常有价值...

    http soap smtp协议

    HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它定义了客户端(通常是浏览器)和服务器之间数据交换...在实际工作中,掌握这些协议的原理和使用方法,能够帮助开发者更高效地设计和实现网络通信方案。

    SMTP服务器实现

    1. SMTP服务器原理: SMTP服务器主要负责接收来自客户端的邮件,并将其转发到目的地,或者存储在本地邮箱系统供用户收取。SMTP基于文本命令/响应机制,通过TCP/IP连接进行通信。当用户通过电子邮件客户端发送邮件时...

    SMTP客户端

    在本主题中,我们将深入探讨SMTP客户端的原理、实现方式以及如何利用WinSocket进行邮件发送。 SMTP客户端的核心功能是将用户创建的邮件传递到指定的收件人邮箱。这个过程通常包括以下几个步骤: 1. **连接服务器**...

    SMTP.rar_SMTP under TCP_java smtp_计算机协议

    SMTP协议的工作原理可以分为三个主要阶段:连接建立、邮件传输和连接关闭。在连接建立阶段,邮件客户端(或发件人服务器)通过TCP连接到邮件接收服务器的25号端口。然后,双方进行一系列的握手命令来确认身份和服务...

    易语言SMTP邮件发送源码.rar

    易语言中需要构建相应的数据结构来表示邮件,并将其转换为SMTP服务器可识别的格式。 5. **网络通信**:发送邮件涉及到网络通信,需要处理TCP连接的建立和关闭,以及错误处理。易语言提供了网络通信的相关接口,如...

    易语言简单SMTP协议源码

    SMTP(Simple Mail Transfer Protocol)是互联网上用于发送电子邮件的标准协议,它定义了邮件服务器之间交换邮件的格式和交互过程。...如果你能提供源码文件,我可以进一步深入解释其工作原理和关键代码。

    OpenSmtp.rar_C# 源码_C源码_opensmtp_smtp

    本文将围绕"OpenSmtp.rar"这个C#与C源码项目,探讨其核心原理及SMTP协议的应用。 首先,"OpenSmtp"是一个开源的邮件发送库,它提供了C#和C两种编程语言的接口,使得开发者能够方便地在自己的应用程序中集成邮件发送...

    用Java实现SMTP服务器

    ### 使用Java实现SMTP服务器 在当今的互联网世界中,电子...理解SMTP协议的基本原理和掌握Java网络编程技巧是这一过程中的关键。无论是用于教育目的,还是构建企业级的邮件系统,Java都是实现SMTP服务器的优秀选择。

    基于smtp协议的邮件发送程序

    1. **SMTP工作原理**: SMTP是一种基于文本的协议,它使用TCP/IP连接进行通信。邮件的发送通常分为三个阶段:连接、邮件传输和关闭连接。在连接阶段,客户端与SMTP服务器建立连接;在邮件传输阶段,客户端发送邮件...

    在MFC中用SMTP协议实现简单的邮件传输

    在实际编程中,理解SMTP的工作原理和MFC的类库结构是至关重要的。同时,熟练掌握ATLMAPI的使用,以及异常处理和用户交互的设计,将有助于开发出稳定且用户友好的邮件发送功能。 总之,在MFC中使用SMTP协议实现邮件...

    SMTP邮件协议

    理解SMTP协议及其工作原理对于维护和管理电子邮件系统至关重要,同时也有助于防止垃圾邮件和网络钓鱼等安全问题。在实际应用中,SMTP常与其他协议(如POP3或IMAP)结合,以实现完整的邮件收发功能。

Global site tag (gtag.js) - Google Analytics