基于WinSock的邮件系统 1 设计目标: 1.1 SMTP发送邮件服务器(c语言) 1.2 POP3接受邮件服务器(c语言) 1.3 php WebMail客户端
2 相关技术介绍: 2.1 TCP/IP协议 2.1.1 发展至今最成功的通信协议,它源于20世纪60年代末美国政府资助的一个分组交换网络研究项目,到20世纪90年代已经发展成为计算机之间最常用的组网协议。它允许分布在各地的装着完全不同的系统的计算机互相通信。它是一个真正的开放系统,该协议的定义及多中实现可以通过多途径无偿得到。随着pc的普及,tcp/ip以其开放的特点,成为了internet的基础,该广域网(WAN)把全世界数以百万的电脑连接在了一起。 2.1.2 TCP/IP结构,如下图:
各种应用层协议 TCP UDP IP 设备驱动程序及接口卡 应用层 传输层 网络层 链路层 2.1.3 各层功能概述: (1)链路层:有时被称作数据链路层或网络接口层,通 常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。该层包含的协议有:ARP(地址转换协议)和RARP(反向地址转换协议).
(2)网络层:有时又被称为互连网层,负责分组在网络中的活动,包括ip(网际协议)、ICMP(Internet互连网控制报文协议)以及IGMP(Internet组管理协议)。 (3)传输层:该层主要为两台主机的应用程序提供端到端的数据通信,它分为两个不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供端到端的质量保证的数据传输,该层负责数据的分组,质量控制和超时重发等,对于应用层来说,就可以忽略这些工作。UDP则只提供简单的把数据从一端发送到另外一端,至于数据是否到达或按时到达、数据是否损坏都必须由应用层来做。这两种协议各有用途,前者可用于面向连接的应用,而后者则在及时性服务中有着重要的用途,如网络多媒体通信等。
(4)应用层:该层负责处理实际的应用程序细节,包括大家十分熟悉的Telnet(电子公告版),HTTP(World Wide Web服务),SMTP(简单邮件传输协议),FTP(简单文件传输协议)和SNMP(简单网络管理协议)等著名协议。 Web服务器 http协议 TCP tcp协议 IP Ip协议 以太网驱动程序 令牌环网驱动程序 令牌环 路由器 以太网
2.2 winsock网络编程技术 2.2.1 Winsock的启动和终止: 由于Winsock的服务是以动态链接库Winsock Dll形式实现的,所以必须先调用WSAStartup函数对Winsoc Dll进行初始化,协商Winsock的版本支持,并分配必要的资源。如果在调用Winsock函数之前,没有加载winsock库,则会返回SOCKET_ERROR错误,在应用程序关闭套接字后,还应调用WSACleanup函数终止对Winsock Dll的使用,并释放资源,以备下次使用. 2.2.2 错误检查和控制: 错误检查和控制对于Winsock应用程序是至关重要的,不成功的Winsock调用返回的最常见的值是SOCKET_ERROR,它是值为-1的常量。如果错误发生了,可以用WSAGetLastError函数来获得一段代码,这段代码明确地表明错误的原因。:
2.2.3 Winsock编程模型: socket() 服务器 bind() listen() accept() 阻塞,等待客户数 connect() 客户机 建立连接 write() read() 请求数据 处理服务请求 应答数据 close()
2.3 windows多线程编程技术 2.3.1 多线程技术介绍: 在Windows的一个进程内,包含一个或多个线程,线程是指进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件,信号标识及动态分配的内存等等,一个进程的所有线程使用同一个32位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行。线程具有优先级别,优先权低的线程必须等到优先权较高的线程执行完任务后再执行,在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样就可使处理器的任务平衡,也提高了系统的效率。进程的主线程在任何需要的时候都可以创建新的线程,当线程执行完任务后,自动终止线程,当进程结束后,所有的线程都终止。
3 SMTP服务器概要设计 3.1本服务器实现的命令集: 3.2 SMTP服务器工作流程图: 2.3.2线程的创建和终止线程: Win32函数库中提供了多线程控制的操作函数,包括创建线程、终止线程、建立互斥区等。首先,在应用程序的主线程或其他活动线程的适当地方创建新的线程,创建了新线程后,则该线程就开始启动执行了当线程函数返回后,线程自动终止,如果线程在执行中终止的话,则可以调用函数实现,相关函数等请查看论文 3 SMTP服务器概要设计 3.1本服务器实现的命令集: HELO,MAIL FROM,RCPT TO,DATA,RSET,NOOP,QUIT,HELP 3.2 SMTP服务器工作流程图:
3.2.1 SMTP服务器主线程流程: 3.2.2 SMTP服务器客户服务线程流程: smtp服务器主线程开启端口25,开始监听 一个客户发起连接请求要求服务 服务器开启一个新线程为该客户服务 是否已经达到最大连接数MAX_CONNECTION_NUM 否 向该用户发送连接数过多信息,并关闭相应连接 是 3.2.2 SMTP服务器客户服务线程流程:
根据id号将客户登录信息记入System.log日志文件 读取客户发送命令并处理命令 返回客户处理结果 3.2.3 SMTP服务器客户端命令处理流程: 读入客户输入的第一条命令 不是 是HELO吗 响应503,并读入下条命令 响应250欢迎信息
处理MAIL FROM命令 否 下条命令为MAIL FROM? 是 下条命令为RCPT TO? 处理RCPT TO 命令 下条命令为DATA? 处理DATA命令 下条命令为REST? 处理REST命令 下条命令为NOOP? 下条命令为HELP? 下条命令为QUIT? 处理NOOP命令 处理HELP命令 处理QUIT命令 向客户输出502 命令不可实现,并读入下条信息
3.2.3 SMTP服务器各个命令详细处理流程:(见论文) 4 POP3服务器概要设计 4.1本服务器实现的命令集: USER PASS DELE LIST LOOP RETR RSET STAT UIDL QUIT 4.2 pop3服务器工作流程图: 4.2.1 pop3服务器主线程流程图: pop3服务器主线程开启端口110,开始监听 一个客户发起连接请求要求服务
4.2.2 pop3服务器客户服务线程流程: 服务器开启一个新线程为该客户服务 是否已经达到最大连接数MAX_CONNECTION_NUM 向该用户发送连接数过多信息,并关闭相应连接 是 4.2.2 pop3服务器客户服务线程流程: 获得客户服务id号 根据id号将客户登录信息记入System.log日志文件 读取客户发送命令并处理命令 返回客户处理结果
4.2.3 pop3服务器客户端命令处理流程: ① 读入客户输入的下一条命令 是 处理USER命令 命令为USER? 否 处理PASS命令 命令为STAT? 处理STAT命令 命令为DELE? 处理DELE命令 命令为LIST 命令为RETR 处理LIST命令 处理RETR命令
4.2.3 pop3服务器各个命令详细处理流程:(见论文) ① 命令为RSET? 命令为RSET? ① 是 处理RSET命令 否 是 命令为UIDL 处理UIDL命令 否 是 命令为LOOP? 处理LOOP命令 否 是 命令为QUTI? 处理QUIT命令 否 向客户输出命令不可实现 4.2.3 pop3服务器各个命令详细处理流程:(见论文)
5 SMTP服务器和POP3服务器详细设计(见论文) 6 测试 6.1 c语言编写的测试程序 6.1.1 SMTP服务器简单测试程序 (1)建立和SMTP服务器连接 (2)发送HELO命令并读取服务器响应信息 (3)发送MAIL FROM命令并回显服务器返回信息 (4)发送RCPT TO命令并回显服务器返回信息
(5)发送DATA命令通知 (6)发送邮件正文并回显服务器信息 (7)发送QUIT命令结束和服务器的会话 (8)SMTP测试程序命令行显示结果 6.1.2 POP3服务器测试程序
(1)建立和POP3服务器的连接 (2)发送”USER wangjianlin1985”命令并回显服务器信息 (3)发送”PASS 198517”命令并回显服务器信息 (4)发送”STAT”命令并回显服务器信息 (5)发送”LIST”命令并回显服务器信息 (6)发送”LIST 1”并回显服务器信息 (7)发送”RETR 1”并回显服务器信息 (8)发送”DELE 1”并回显服务器信息 (9)发送”QUIT”命令并回显服务器信息 (10)POP3服务器测试程序命令行运行效果
6.2 php Web客户端测试程序:
6.2.1 以用户名wangjianlin1985 密码198517登陆php邮件客户端 6.2.2进入邮件系统后显示如下:
6.2.3进入收件箱查看邮件列表:
6.2.4查看邮件详细内容:
6.2.5 给yangyanjie@linlin.com写一封邮件并抄送给 luotianjie@linlin.com:
6.2.6发送邮件后回显的执行命令状态
更多源代码资源:http://www.codefans.net/