TA的每日心情 | 奋斗 2020-10-12 15:25 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]测试排长
|
4#
楼主 |
发表于 2010-1-20 20:15:10
|
只看该作者
3.电子邮件的工作原理
电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如下图所示:
更进一步的解释涉及到以下几个概念:
MUA -- Mail User Agent, 邮件用户代理,帮助用户读写邮件;
MTA -- Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务
器或邮件投递代理;
MDA -- Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。
整个邮件传输过程如下:
目前使用的SMTP 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如下图所示。
如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。
4. 电子邮件的信头结构及分析
4.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的要求,信头和信体之间必须加入一空行。信头通常包含字段From, To, Subject 和Date,有的邮件还包含cc,bcc等字段。
4.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: <client1254556544-45556454@mail.domain1.com>
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: <client1254556544-45556454@mail.domain1.com>
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: <client1254556544-45556454@mail.domain1.com>
这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。
第二章 OPEN RELAY 的原理及测试
1.OPEN RELAY 的原理
由于技术的原因,在80年代前,网络还不是很健全,机器之间很少能直接对话发送邮件,人们必须得找出一条有效的连接通路来,然后信件沿着通路一步一步传送到目的地。SMTP协议中就明确指出当邮件在不同的网络间传送时,需要借助中间服务器的RELAY。
邮件在收件方和发件方之间会经过毫不相干的第三方服务器,这就是邮件转发 (RELAY)。 如下图所示:
图中的 MAIL SERVER 是可以对要求转发的邮件进行限制的,如只转发来自某个域的邮件或来自于某些IP 得邮件。如果转发没有任何限制,就被称为 OPEN RELAY 或 THIRD ** 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 by itself
this is a test of the relay
.
250 VAA00289 Message accepted for delivery |
|