这几天敝人并没有及时更新博客,一是由于白天工作中的锁事比较繁杂,二来连续看了两个晚上的SMTP协议。
我比较喜欢用实践来证明一切,这样才会加深自己的理解!
一、准备工作:
1、本机环境:Windows XP SP3、ADSL 10M光纤
2、开发工具:WildPackets OmniPeek V5.1.4
Visual C++ 6.0
Outlook Express6.0
FlexEdit V2.3.1871
二、SMTP命令:
1、HELO 向服务器标识用户身份
2、MAIL 初始化邮件传输mail from: <xxx>
3、RCPT 标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to: <xxx>
4、DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,初始化数据传输,以.结束
5、NOOP 无操作,服务器应响应OK
6、RSET 重置会话,当前传输被取消
7、QUIT 结束会话
三、分析数据包:
1、打开Outlook Express6.0,创建新邮件,内容如下:
2、打开OmniPeek,选择SMTP:
3、先开始抓包,再发送上面的测试邮件,得到的数据包如下图:
(要注意Source与Destination,即源地址与目标地址)
4、只需要看第20条数据包,其他可以比较容易理解:
5、其他小技巧
<CR> <LF>即对应C/C++中的"/r /n"
比如 Line 8: charset="gb2312"<CR><LF>,因为需要用到转义字符
所以对应的字符串应该为char * sData = "charset=/"gb2312/"/r/n";
四、相关代码:
1、以下代码通过socket与SMTP服务器建立连接并验证身份。打开Visual C++,新建一个控制台工程、并添加一个CPP文件:
2、下面是Base64加解密头与CPP文件:
3、程序运行效果: