用
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 POP 3 ” 服务,将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
中继默认对所有未通过身份验证的用户都是禁用的,所以如果我们向向外网发一封邮件,例如发到
[email][email protected][/email]
,我们会看到如下图错误提示,提示中明确指出
“
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
)
rcpt to:[email protected]
(客户机描述这封信的收件地址)
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 会话
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
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
位二进制数,
2
4
÷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 1001
00 000000
,蓝色部分为系统填充内容。
用
10
进制表示就是
25 7 21 38 25 22 36
,查询
BASE64
编码表
可知分别对应
ZHVmZWK
,最后那个由填充产生的
000000
用一个=表示。所以最后我们看到的
BASE64
编码是
ZHVmZWk=
。