PAGE14 / NUMPAGES14

SMTP邮件服务器实验

1. 实验内容和实验环境描述

实验任务:使用Socket API编写一个SMTP邮件服务器程序

实验内容:1)作为SMTP服务器,接收邮件客户端程序的TCP连接请求,接收SMTP命令和邮件数据,将邮件保存在文件中;

2)作为SMTP客户端,建立到实际邮件服务器的TCP连接,发送SMTP命令,将保存的邮件发送给实际邮件服务器;

3)提供邮件差错报告:将实际邮件服务器的差错报告转发给邮件客户端软件;

4)支持一封邮件多个接收者,要求接收者属于不同的域(如、163.com、,…);

5)提供发件人和收件人Email地址格式检查功能,例如下列邮件地址是错误的:chengli,chengli@,, …. 。

实验环境:Microsoft Visual Studio 2010

2. 软件设计

(1) 数据结构:

char mail_from[4096];//存发件地址
char rcpt_to[5][4096];//存收件地址
char data[4096];//存Data
char imf[4096];//存邮件标准格式
WORD A;//加载套接字库
WSADATA B;//储存调用WSAStartup函数返回的Windows Sockets初始化信息
int err;//报错标志
SOCKET sockSrv;//创建用于监听客户端的套接字
SOCKADDR_IN addrSrv;//作为服务器端的socket地址
char recvBuf[4096]="";//接收客户端SMTP指令

(2) 模块结构:

[1]main();//服务器端,用于从客户端接收储存邮件
[2]main_clicenet(SOCKET s);//客户端,用于将收到的邮件转发到邮件服务器,同时将邮件服务器的错误报告通过SOCKET s转发给客户端
[3] ValidEmail(char *addr);//收发件地址(addr)合法性监测

(3) 算法流程:画出流程图,描述算法的主要流程。

Main()

Load Windows Sockets;创建用于监听的socket;绑定socket和sockaddr;将socket设为监听模式;

While(1)

请求队列非空则抽取第一个链接建立连接;打开邮件储存文件;

Send:220 recv:EHLO ;

Send:250 OK recv:MAIL FROM:<...>

T 发 件 地

址 合 法 F

Send:550 Invalid User ; continue

Send:250 OK recv: RCPT TO:<>;检查合法性

While(recv!=DATA)

recv: RCPT TO:<>;检查合法性

Send:250 OK

Recv:DATA

send:354 Start mail input;end with .\r\n recv: DATA fragment, ...bytes

Send:250 recv:IMF; send 250 recv: .

Send:QUIT

调用客户端程序

关闭套接字

关闭文件指针

释放分配的套接字资源

(4) 主要功能模块的实现要点

[1]main();//服务器端,用于从客户端接收储存邮件

实现要点:与客户端建立连接,根据SMTP协议标准进行通信。

[2]main_clicenet(SOCKET s);//客户端,用于将收到的邮件转发到邮件服务器,同时将邮件服务器的错误报告通过SOCKET s转发给客户端

实现要点:与服务器端建立连接,根据SMTP协议标准进行通信。

[3] ValidEmail(char *addr);//收发件地址(addr)合法性监测

实现要点:根据标准email地址格式进行合法性监测

3 实验结果演示及分析

(1) 对于你所实现的功能,逐个进行测试,并将输出截图。

普通邮件群发:

1>

2>

3>

4>

错误报告:

1>

2>

(2) 你的程序是否提供了差错处理功能?可以对哪些差错进行处理?

[1] 将实际邮件服务器的差错报告转发给邮件客户端软件;

[2]监测收发件邮箱地址格式是否正确

(3) 和课堂上学习的SMTP协议相比,你的程序是否完全按照协议来实现,是