用SMTP,POP3访问Exchange邮箱:Exchange2003系列之六


版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 [url]http://yuelei.blog.51cto.com/202879/76302[/url]
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 protected] ,我们会看到如下图错误提示,提示中明确指出 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:[email protected] (客户机请求服务器替自己发一封信,信的发件人是新浪的管理员,这当然是胡说,没关系的, SMTP 服务器并不校验)
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 会话
 
我们举例从 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 位二进制数, 2 4 ÷64
如果ASCII码字符不正好是3的倍数,例如dufei5ASCII码,这该怎么办呢?系统会自动用0进行填充,将ASCII码凑成3的倍数。如果有1个ASCII码是被填充的,BASE64编码中会出现一个=符号,如果有2ASCII吗是被填充的,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=
 
本文出自 “ 岳雷的微软网络课堂” 博客,请务必保留此出处 [url]http://yuelei.blog.51cto.com/202879/76302[/url]
本文出自 51CTO.COM技术博客

你可能感兴趣的:(职场,Exchange,休闲)