Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1240876
  • 博文数量: 190
  • 博客积分: 4090
  • 博客等级: 上校
  • 技术积分: 3878
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-22 15:52
文章分类

全部博文(190)

文章存档

2013年(30)

2012年(160)

分类: 系统运维

2012-05-16 13:09:23

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://blog.chinaunix.net/space.php?uid=16829731&do=blog&id=3210086
SMTP/POP3访问邮箱暨SMTP/POP3原理
 
Exchange早期版本设计时侧重于在企业内部提供邮件服务,邮件传输以MAPI为主;Exchange的后续版本增强了对Internet邮局的支持,现在Exchange2003可以作为一个标准的Internet邮局为用户提供服务,也可以和互联网上的其他Internet邮局进行交互。本文我们将介绍以下内容:
  如何用Outlook Express作客户端软件,通过SMTPPOP3协议访问邮箱
  Exchange和其他互联网邮局通信时注意事项
  SMTPPOP3原理分析
  ESMTP
  BASE64编码
 
实验拓扑如下图,Florence是域控制器和CA服务器,BerlinExchange服务器,Istanbul是客户机
 
  如何用Outlook Express作客户端软件,通过SMTPPOP3协议访问邮箱
 
标准的互联网邮局包括SMTPPOP3两个组件,SMTP负责邮件的出站/入站,POP3负责邮件存储。我们可以利用SMTP把邮件发送出去,也可以利用POP3从自己的邮箱中下载邮件。Exchange2003SMTP来源于Win2003中的IISPOP3倒是和Win2003POP3服务没有任何关系。Exchange2003POP3服务默认是禁用状态,所以首先要启动POP3服务。在Exchange服务器上,开始-管理工具-服务,找到“Microsoft Exchange POP3服务,将POP3服务的启动类型改为自动,然后启动POP3服务。
 
这时Exchange服务器已经可以提供SMTPPOP3服务了,我们在客户机Istanbul上,以Outlook Express(以后简称OE)作为客户端软件,测试一下SMTPPOP3的访问状况。启动OE后,在工具菜单中选择账户,在“邮件”标签下,选择 添加“邮件”
 
填写邮件发送者的名称,在此我们填写一个用户名,如下图所示
接下来要写用户的邮件地址
最重要的参数,分别对SMTPPOP3服务器进行描述,可以用NETBIOS名称,域名或是IP地址
 
输入用户名和口令就可以完成邮件账号的设置了
配置完邮件账户后,启动OE,点击“创建邮件”,给administrator发一封测试信看看
,如下图所示
看看管理员的邮箱,是不是已经收到信了,这证明SMTP工作正常。
 
管理员回封信,看看dufei能否收到,在 OE的“发送/接收”下拉菜单中选择“接收全部邮件”,看看收件箱里有没有回信,如下图所示,已收到回信,POP3工作正常。
 
  Exchange和其他互联网邮局通信时注意事项
做完上述操作后,我们在Exchange邮局内部已经可以正常使用SMTPPOP3了,但要和其他的互联网邮局通信还需要注意以下两点:
1  设置DNS中的MX记录
2  设置SMTP服务器的中继
 
如果DNS服务器中没有正确设置MX记录,那么我们的邮局将无法收到其他邮局发来的邮件。SMTP服务器向其他邮局发送邮件时,要通过查询DNSMX记录来定位接收邮局的邮件服务器,否则互联网上这么多主机,SMTP服务器怎么知道哪台可以接收邮件?早期的电子邮件地址格式是邮箱名@邮件服务器名,这种邮件地址中已经包含了邮件服务器的完全合格域名,因此SMTP服务器直接将邮件发送给邮件服务器就可以了。现在的电子邮件地址格式改成了邮箱名@域名,不再直接指明接收邮件的服务器,因此SMTP服务器就只能依靠MX记录来定位接收邮件服务器了。
 
Exchange服务器中的SMTP中继默认对所有未通过身份验证的用户都是禁用的,所以如果我们向向外网发一封邮件,例如发到,我们会看到如下图错误提示,提示中明确指出 Unable to relay”,不能中继。那如何修改设置呢?
 
Exchange服务器上,开始-程序-Microsoft Exchange-系统管理器-服务器-协议-SMTP-默认SMTP虚拟服务器-属性-访问-中继,如下图
 
当前的中继设置如下图所示,只有通过身份验证的邮件发送者才可以将邮件中继到其他邮局
 
 
修改中继设置,允许192.168.2.0子网内的计算机进行邮件中继,不要设置成允许任何人进行邮件中继,那会招致大量的垃圾邮件发送
 
改完中继设置后,重启SMTP服务,可以把信发往其他的互联网邮局了。
 
  SMTPPOP3原理分析
 
我们用SMTPPOP3在互联网上进行邮件收发,邮件传递的过程是什么样的?我们假设163邮局的User1准备给263邮局的User2发信,大致过程如下
1         User1通过邮件客户端软件用SMTP协议把待发邮件提交到163邮局的SMTP服务器
2         163邮局的SMTP服务器通过查询DNSMX记录,定位263邮局的邮件服务器,然后通过SMTP协议把邮件中继到263邮局的SMTP服务器
3         263邮局的SMTP服务器将邮件入站后,把邮件转给POP3服务器
4       POP3服务器把邮件存储在User2的邮箱中
5       User2利用邮件客户端软件通过POP3协议访问263邮局的POP3服务器,并从自己的邮箱中把邮件下载到本机计算机
 
接下来我们具体分析一下第一步和第五步,看看OE如何利用SMTP协议提交邮件,以及如何利用POP3协议访问邮箱。
 
先分析SMTP,根据RPC821SMTP协议提供了一些简单的四个字符原语操作指令,OE就利用了这些指令发送邮件。常用的SMTP命令有
HELO :发件方问候收件方,后面是发件人的IP地址或计算机名。收件方回答OK时标识自
己的身份。问候和确认过程表明两台机器可以进行通信。
MAIL FROM: 这个命令用来开始传送邮件,命令后面的参数是发件人邮件地址。         
RCPT TO: 这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,
每次只能指明一个人。
DATA :收件方把该命令之后的数据作为发送的数据,数据被加入数据缓冲区中。        
RSET :这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待
传送的数据都必须清除,接收放必须回答OK
NOOP :空操作,不影响任何参数,只是要求接收方回答OK
QUIT SMTP要求接收放必须回答OK,然后中断传输
 
OE发送邮件时,首先连接邮件服务器的25端口,我们在命令行下模拟这个过程
telnet berlin 25
Helo Istanbul (客户端进行自我介绍,我的名字是Istanbul
mail from:admin@sina.com (客户机请求服务器替自己发一封信,信的发件人是新浪的管理员,这当然是胡说,没关系的,SMTP服务器并不校验)
rcpt to:administrator@exchtest.com (客户机描述这封信的收件地址)
data (客户机表示要开始输入信件内容)
subject:mail test!  (客户机输入邮件主题 mail test!)
Just testting!      (客户机输入邮件内容 Just testting!
敲一下回车 敲一下.(再敲一下回车 邮件内容结束,邮件开始进入发送队列
上述过程如下图所示:
 
 
检查一下管理员的邮箱,有没有收到这样一封信,如下图所示,真的收到了,而且以为是sina的管理员发来的,要记住,邮件是很容易欺骗的。
这样我们就用SMTP命令发了一封电子邮件,是不是很简单呢?其实我们可以来看一下OE发信的过程,打开OE,在“工具”菜单中选择“选项”,点击“维护”标签,在疑难解答下选择“邮件”,这样OE发送邮件时的过程会记录在日志文件中供我们分析使用。
 
OE中发送一封邮件,测试一下。
邮件发出去了,检查下图路径中的smtp.log,这就是发送邮件时的日志文件
 
 
打开日志文件,里面记录了OESMTP服务器交互的全过程,[rx]代表OE收到的数据,[tx]代表OE发出的数据,仔细看看,OE作的操作和我们刚刚在命令行中作的完全一样。
 
 
我们再来分析一下OE利用POP3协议从Exchange邮件服务器收信的过程,POP3SMTP类似,根据RFC1939也定义了一些四字符的原语命令,常用的POP3命令有
USER  输入邮箱名
PASS  输入邮箱密码
STAT 
  显示邮箱状态
LIST  
  列出邮箱中的邮件
RETR 
  读取邮件内容
DELE
   将邮件标记为删除
NOOP 
 空操作,仅返回一个回应
RSET
   中断当前操作,将标记为删除的邮件恢复
QUIT        
退出POP3会话
 
我们举例从dufei邮箱收信,我们使用下列指令
telnet  berlin  110
user dufei (准备访问dufei的邮箱)
pass  passW0rd (输入dufei的邮箱口令)
list (列出邮箱中的邮件)
Retr  (显示第一封邮件的内容)
dele  1  (删除第一封邮件)
quit  (退出)
 
过程如下图所示,有兴趣的话大家可以结合OE中的POP3日志进行分析。
 
  ESMTP
从前面的SMTP原理分析中我们可以看出,SMTP在设计时完全没有考虑安全问题,任何人都可以很方便地利用SMTP服务器发送邮件,这种处于安全真空的设计在互联网的初期是成立的,毕竟那时无孔不入的商业还不曾渗透进这片专属于科研人员的净土。但现在如果在公网上放置这么一个服务器,那肯定会后果很严重,垃圾邮件立刻就会把你淹没。因此,ESMTPSMTP进行了升级,主要是在邮件的发送过程中支持身份验证,而且在传输邮件内容时也支持用SSL进行加密,大大提高了安全性。
Exchange中把SMTP升级到ESMTP很容易,只要在SMTP服务器上禁止匿名访问,再选择一种身份验证方式就可以了。在Exchange服务器上,开始-程序-Microsoft Exchange-系统管理器-服务器-协议-SMTP-默认SMTP虚拟服务器-属性-访问-身份验证,如下图所示
 
我们取消“匿名访问”和“集成Windows身份验证”,只保留“基本身份验证“,现在这就是一台ESMTP服务器了,重新启动SMTP服务,然后在Istanbul上我们发送一封邮件测试一下,如下图所示,发信出问题了,错误提示告诉我们由于没有进行身份验证,我们没有权限进行邮件发送
 
既然要求身份验证,那我们就满足这个条件,在OE的工具菜单中选择账户,点击邮件标签,查看邮件账户的属性,如下图所示,勾选“我的服务器要求身份验证”,点击“设置”
 
 
在设置中,我们填写了用户名和口令,再来试试,发出去了!
调出日志smtp.log查看一下发送细节,看到了一个奇怪的现象,如下图红框标示处显示的是用户名,但我们填写的用户名是dufei,怎么在这里成了ZHVmZWk=?不要着急,这就是我们下面要讲到的BASE64编码
 
 BASE64编码
BASE64编码其实很简单,它把常用的64个字符重新做了个编码表。每个BASE64编码用62进制数表示,BASE64的编码表如下
 
 
 
0 A 17 R 34 i 51 z 
1 B 18 S 35 j 52 0 
2 C 19 T 36 k 53 1 
3 D 20 U 37 l 54 2 
4 E 21 V 38 m 55 3 
5 F 22 W 39 n 56 4 
6 G 23 X 40 o 57 5 
7 H 24 Y 41 p 58 6 
8 I 25 Z 42 q 59 7 
9 J 26 a 43 r 60 8 
10 K 27 b 44 s 61 9 
11 L 28 c 45 t 62 + 
12 M 29 d 46 u 63 / 
13 N 30 e 47 v 
14 O 31 f 48 w (pad) = 
15 P 32 g 49 x 
16 Q 33 h 50 y
 
ASCII码向BASE64的转换过程中,ASCII码会每3个为一组转换为4BASE64编码,因为每个ASICC码为8位二进制数,3×824,每个BASE64编码是6位二进制数,24÷64
如果ASCII码字符不正好是3的倍数,例如dufei5ASCII码,这该怎么办呢?系统会自动用0进行填充,将ASCII码凑成3的倍数。如果有1个ASCII码是被填充的,BASE64编码中会出现一个=符号,如果有2ASCII吗是被填充的,BASE64编码中会出现两个=号,不可能有三个=出现的,大家仔细想想为什么?
dufei为例,dufeiASCII码为 100 117 102 101 105, ASCII码为100 117 102 101 105 。展开成二进制是01100100  01110101  01100110  01100101  01101001,每6个一组形成BASE64编码是 011001 000111 010101 100110  011001 010110 1001,由于dufei只有5ASCII码,系统会用0填充为6ASICC码,填充的结果是011001 000111 010101 100110  011001 010110 100100 000000,蓝色部分为系统填充内容。10进制表示就是 25  7  21 38  25  22  36  ,查询BASE64编码表 可知分别对应  ZHVmZWK,最后那个由填充产生的000000用一个=表示。所以最后我们看到的BASE64编码是ZHVmZWk= 
 

本文出自 “岳雷的微软网络课堂” 博客,请务必保留此出处http://blog.chinaunix.net/space.php?uid=16829731&do=blog&id=3210086

阅读(2525) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~