用SMTP/POP3访问邮箱暨SMTP/POP3原理
Exchange早期版本设计时侧重于在企业内部提供邮件服务,邮件传输以MAPI为主;Exchange的后续版本增强了对Internet邮局的支持,现在Exchange2003可以作为一个标准的Internet邮局为用户提供服务,也可以和互联网上的其他Internet邮局进行交互。本文我们将介绍以下内容:
一 如何用Outlook Express作客户端软件,通过SMTP,POP3协议访问邮箱
二 Exchange和其他互联网邮局通信时注意事项
三 SMTP,POP3原理分析
四 ESMTP
五 BASE64编码
实验拓扑如下图,Florence是域控制器和CA服务器,Berlin是Exchange服务器,Istanbul是客户机
一 如何用Outlook Express作客户端软件,通过SMTP,POP3协议访问邮箱
标准的互联网邮局包括SMTP和POP3两个组件,SMTP负责邮件的出站/入站,POP3负责邮件存储。我们可以利用SMTP把邮件发送出去,也可以利用POP3从自己的邮箱中下载邮件。Exchange2003的SMTP来源于Win2003中的IIS,POP3倒是和Win2003的POP3服务没有任何关系。Exchange2003的POP3服务默认是禁用状态,所以首先要启动POP3服务。在Exchange服务器上,开始-管理工具-服务,找到“Microsoft Exchange POP3”服务,将POP3服务的启动类型改为自动,然后启动POP3服务。
这时Exchange服务器已经可以提供SMTP和POP3服务了,我们在客户机Istanbul上,以Outlook Express(以后简称OE)作为客户端软件,测试一下SMTP和POP3的访问状况。启动OE后,在工具菜单中选择账户,在“邮件”标签下,选择 添加“邮件”
填写邮件发送者的名称,在此我们填写一个用户名,如下图所示
接下来要写用户的邮件地址
最重要的参数,分别对SMTP和POP3服务器进行描述,可以用NETBIOS名称,域名或是IP地址
输入用户名和口令就可以完成邮件账号的设置了
配置完邮件账户后,启动OE,点击“创建邮件”,给administrator发一封测试信看看
,如下图所示
看看管理员的邮箱,是不是已经收到信了,这证明SMTP工作正常。
管理员回封信,看看dufei能否收到,在 OE的“发送/接收”下拉菜单中选择“接收全部邮件”,看看收件箱里有没有回信,如下图所示,已收到回信,POP3工作正常。
二 Exchange和其他互联网邮局通信时注意事项
做完上述操作后,我们在Exchange邮局内部已经可以正常使用SMTP,POP3了,但要和其他的互联网邮局通信还需要注意以下两点:
1 设置DNS中的MX记录
2 设置SMTP服务器的中继
如果DNS服务器中没有正确设置MX记录,那么我们的邮局将无法收到其他邮局发来的邮件。SMTP服务器向其他邮局发送邮件时,要通过查询DNS的MX记录来定位接收邮局的邮件服务器,否则互联网上这么多主机,SMTP服务器怎么知道哪台可以接收邮件?早期的电子邮件地址格式是邮箱名@邮件服务器名,这种邮件地址中已经包含了邮件服务器的完全合格域名,因此SMTP服务器直接将邮件发送给邮件服务器就可以了。现在的电子邮件地址格式改成了邮箱名@域名,不再直接指明接收邮件的服务器,因此SMTP服务器就只能依靠MX记录来定位接收邮件服务器了。
Exchange服务器中的SMTP中继默认对所有未通过身份验证的用户都是禁用的,所以如果我们向向外网发一封邮件,例如发到,我们会看到如下图错误提示,提示中明确指出 “Unable to relay”,不能中继。那如何修改设置呢?
在Exchange服务器上,开始-程序-Microsoft Exchange-系统管理器-服务器-协议-SMTP-默认SMTP虚拟服务器-属性-访问-中继,如下图
当前的中继设置如下图所示,只有通过身份验证的邮件发送者才可以将邮件中继到其他邮局
修改中继设置,允许192.168.2.0子网内的计算机进行邮件中继,不要设置成允许任何人进行邮件中继,那会招致大量的垃圾邮件发送
改完中继设置后,重启SMTP服务,可以把信发往其他的互联网邮局了。
三 SMTP,POP3原理分析
我们用SMTP,POP3在互联网上进行邮件收发,邮件传递的过程是什么样的?我们假设163邮局的User1准备给263邮局的User2发信,大致过程如下
1 User1通过邮件客户端软件用SMTP协议把待发邮件提交到163邮局的SMTP服务器
2 163邮局的SMTP服务器通过查询DNS的MX记录,定位263邮局的邮件服务器,然后通过SMTP协议把邮件中继到263邮局的SMTP服务器
3 263邮局的SMTP服务器将邮件入站后,把邮件转给POP3服务器
4 POP3服务器把邮件存储在User2的邮箱中
5 User2利用邮件客户端软件通过POP3协议访问263邮局的POP3服务器,并从自己的邮箱中把邮件下载到本机计算机
接下来我们具体分析一下第一步和第五步,看看OE如何利用SMTP协议提交邮件,以及如何利用POP3协议访问邮箱。
先分析SMTP,根据RPC821,SMTP协议提供了一些简单的四个字符原语操作指令,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,这就是发送邮件时的日志文件
打开日志文件,里面记录了OE与SMTP服务器交互的全过程,[rx]代表OE收到的数据,[tx]代表OE发出的数据,仔细看看,OE作的操作和我们刚刚在命令行中作的完全一样。
我们再来分析一下OE利用POP3协议从Exchange邮件服务器收信的过程,POP3和SMTP类似,根据RFC1939也定义了一些四字符的原语命令,常用的POP3命令有
USER : 输入邮箱名
PASS : 输入邮箱密码
STAT : 显示邮箱状态
LIST : 列出邮箱中的邮件
RETR : 读取邮件内容
DELE: 将邮件标记为删除
NOOP : 空操作,仅返回一个回应
RSET: 中断当前操作,将标记为删除的邮件恢复
QUIT 退出POP3会话
我们举例从dufei邮箱收信,我们使用下列指令
telnet berlin 110
user dufei (准备访问dufei的邮箱)
pass passW0rd (输入dufei的邮箱口令)
list (列出邮箱中的邮件)
Retr 1 (显示第一封邮件的内容)
dele 1 (删除第一封邮件)
quit (退出)
过程如下图所示,有兴趣的话大家可以结合OE中的POP3日志进行分析。
四 ESMTP
从前面的SMTP原理分析中我们可以看出,SMTP在设计时完全没有考虑安全问题,任何人都可以很方便地利用SMTP服务器发送邮件,这种处于安全真空的设计在互联网的初期是成立的,毕竟那时无孔不入的商业还不曾渗透进这片专属于科研人员的净土。但现在如果在公网上放置这么一个服务器,那肯定会后果很严重,垃圾邮件立刻就会把你淹没。因此,ESMTP对SMTP进行了升级,主要是在邮件的发送过程中支持身份验证,而且在传输邮件内容时也支持用SSL进行加密,大大提高了安全性。
在Exchange中把SMTP升级到ESMTP很容易,只要在SMTP服务器上禁止匿名访问,再选择一种身份验证方式就可以了。在Exchange服务器上,开始-程序-Microsoft Exchange-系统管理器-服务器-协议-SMTP-默认SMTP虚拟服务器-属性-访问-身份验证,如下图所示
我们取消“匿名访问”和“集成Windows身份验证”,只保留“基本身份验证“,现在这就是一台ESMTP服务器了,重新启动SMTP服务,然后在Istanbul上我们发送一封邮件测试一下,如下图所示,发信出问题了,错误提示告诉我们由于没有进行身份验证,我们没有权限进行邮件发送
既然要求身份验证,那我们就满足这个条件,在OE的工具菜单中选择账户,点击邮件标签,查看邮件账户的属性,如下图所示,勾选“我的服务器要求身份验证”,点击“设置”
在设置中,我们填写了用户名和口令,再来试试,发出去了!
调出日志smtp.log查看一下发送细节,看到了一个奇怪的现象,如下图红框标示处显示的是用户名,但我们填写的用户名是dufei,怎么在这里成了ZHVmZWk=?不要着急,这就是我们下面要讲到的BASE64编码
五 BASE64编码
BASE64编码其实很简单,它把常用的64个字符重新做了个编码表。每个BASE64编码用6个2进制数表示,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个为一组转换为4个BASE64编码,因为每个ASICC码为8位二进制数,3×8=24,每个BASE64编码是6位二进制数,24÷6=4。
如果ASCII码字符不正好是3的倍数,例如dufei是5个ASCII码,这该怎么办呢?系统会自动用0进行填充,将ASCII码凑成3的倍数。如果有1个ASCII码是被填充的,BASE64编码中会出现一个=符号,如果有2个ASCII吗是被填充的,BASE64编码中会出现两个=号,不可能有三个=出现的,大家仔细想想为什么?
以dufei为例,dufei的ASCII码为 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只有5个ASCII码,系统会用0填充为6个ASICC码,填充的结果是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