课程设计论文邮件收发器.doc_第1页
课程设计论文邮件收发器.doc_第2页
课程设计论文邮件收发器.doc_第3页
课程设计论文邮件收发器.doc_第4页
课程设计论文邮件收发器.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机科学与技术学院课程设计(论文)报告姓 名: 学 号:专 业: 网络工程 班 级: 设计题目: 邮件收发器 2011年 6 月计算机科学与技术学院课程设计(论文)报告1 绪论1.1电子邮件的发展历程 电子邮件由英文electronic mail或email翻译而来,它表示通过电子通讯系统进行信件的书写、发送和接收。作为互联网上最受欢迎的功能之一,电子邮件系统可以为世界上任何一个网络用户传递信息,内容包括文字、图像、声音、视频等。同时,如果用户愿意,通过电子邮件可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索,这是传统邮件无法比拟的。 电子邮件发明于1971年,当时已经存在可传输文件的电脑程序以及一种原始的信息程序。但这两个程序存在局限性,发信方只能给接收方发送公报,且接收方的电脑必须与发送方一致。雷饧姆林森(Ray Tomlinson)在已有的传输文件程序以及信息程序的基础上,研制出一套全新的文件信息传输程序,可以通过电脑网络发送和接收文件信息。为让人们都拥有容易识别的电子邮箱地址,汤姆林森采用了符号,符号前面加用户名,后面是用户邮箱所在的地址,即useraddress的形式表示用户邮箱地址,这标志着电子邮件的诞生。当时,汤姆林森所在的企业受聘于美国军方,参与Arpanet网络的建设和维护工作。 虽然电子邮件在1970年代发明,却是在1980年代兴起。由于1970年代使用Arpanet网络的人较少,网速较慢,用户只能发送简短的信息,这限制了电子邮件的使用;到1980年代中期,个人电脑及Internet的兴起,电子邮件开始传播开来;1990年代中期,互联网浏览器诞生,全球网民人数激增,电子邮件开始被广泛使用。 电子邮件系统经过三十多年的发展,目前主要有三种系统类型: (1)免费邮箱 大多数网民都有电子邮箱,这种方式投资少,免维护,但每天需要处理大量的邮件,导致邮件的收发速度受到限制,且无法保证邮箱的安全性和服务质量。因此免费邮箱只能作为简单应用,不适合用于交流重要的、需要保密的信息。 (2)收费邮箱 收费电子邮箱一般比免费邮箱安全、稳定、收发速度快,而且具有邮件杀毒、邮件到达通知、手机收发邮件等功能。但对于企业来说,每个员工可能使用不同的邮箱域名,影响企业形象且不能对邮箱服务器进行管理,无法根据企业实际需要对邮件系统进行改进及扩展。(3)自建邮箱系统随着网络化进程的进一步发展,大多企业或高校建立了自己的电子邮件系统。单位将企业名作为服务器域名。这样,每个企业员工具有使用相同的邮箱服务器,有利于宣传企业形象并可以对邮件服务器进行管理,并提供较好的安全性。目前邮箱服务器主要基于Windows操作系统或Unix操作系统,虽然Windows平台界面友好,操作方便,但基于Windows平台的邮件系统一般为商业性软件,源码保密,不便于对其进行二次开发;Unix平台下虽然有开放的邮件系统源码,但管理复杂,要求管理员深入了解电子邮件系统原理,并具备丰富的Unix平台开发经验。因此,本文自主开发了电子邮件收发器,它属于自建邮箱系统但自主研发。此邮件系统不仅可以实现以局域网为基础的单位内部电子邮件传递,也能通过Intemet和外部进行信息交流。同时,还可根据互联网的发展,随时对邮件系统进行升级与改造,使之更符合单位内部的发展需要12电子邮件简介 电子邮件系统工作在TCP/lP协议的应用层,采用客户端服务器模式,通过客户端与服务器的相互通信实现邮件传递。它由两部分组成:MUA(用户代理)和MTA(邮 件传输代理)。它的传输过程如图所示:在图中,MUA为用户提供读写邮件界面,也就是常说的客户端;MTA运行在邮件服务器上,负责邮件的完整的传递过程,主要包括SMTP、POP3和MDA三部分。MDA负责将收件人是本地用户的邮件投递到用户邮箱中;而SMTP和POP3负责邮件的传递和收件人从服务器上收取邮件的功能,本文在第二章对它们进行了详细介绍。 用户使用MUA发送编写好邮件后,利用SMTP协议发送给自己的MTA。MTA对邮件的收件人进行判断,如果是本地用户则将邮件转给MDA由它将邮件投递到收件人邮箱;如果用户是其它服务器用户,MTA则连接收件人的MTA,利用SMTP协议将邮件转发,再由收件人的MDA进行投递。最后收件人使用MLTA利用POP3协议将邮件收取到本地主机上。在邮件传递过程中,邮箱地址是必不可少的元素,它表明了邮件的起始与目的地址。 完整的邮件地址为:用户名域名。用户名是用户在服务器上的标识,服务器通过用户名来识别的具体邮箱;而域名则是邮箱所属的服务器的域名,其它服务器可以通过这个域名查询到服务器的m地址;符号是专门用来表示邮箱地址的特殊符号,它代表“at”的意思。这三部分组合在一起成为邮箱在Interact上的唯一标识。1.3电子邮件主要协议 (1)SMTP协议 SMTP为简单邮件传输协议,主要保证电子邮件能够可靠和高效地传送。SMTP主 要应用在两种情况:一是电子邮件从客户端传输到服务器;二是邮件从一个服务器转发到另一个服务器。当收信人和发信人在同一个网络上时,SMTP服务器把邮件直传发送给收信人信箱;当双方不在同一个网络上时,发信方的SMTP服务器作客户端,将邮件发送给收信入所在网络的SMTP邮件服务器。SMTP协议的基本命令有7个1101,分别为:HELO、MAIL,RCPT,DATA,REST,NOOP和QUIT等。客户端向服务器发送邮件时,首先向SMTP服务器提出连接请求, 服务器接受此客户端连接后,双发可以开始通信。 以下是对SMTP命令的一些介绍:HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都 能检测到。EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。 . MAIL FROM 命令中指定的地址是发件人地址RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束VRFY 用于验证指定的用户/邮箱是否存在;由于url=javascript:;安全/url方面的原因,服务器常禁止此命令EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用HELP 查询服务器支持什么命令NOOP 无操作,服务器应响应 OKRSET 重置会话,当前传输被取消QUIT 结束会话(2)POP3协议 电子邮件系统中,常采取用户代理(UA)方式实现邮件发送和接收,而使用邮件传输系统(MTs)为用户提供邮箱服务。POP是用户和邮件服务器之间收取邮件的协议,全称为Post Office Protocol,是基于TCP协议的应用层协议,通信端口号为110。现在普遍使用的是POP协议第三版,即POP3协议。 POP3协议采用CS工作模式,即客户服务器模式。提供POP3服务的主机称为POP3服务器,请求POP3服务的主杌称为POP3客户机。服务器首先为每个邮箱建立一个帐 户,每个帐户由用户名和密码构成。邮箱内保存此帐户的未读邮件,客户端通过POP3 协议从邮箱内收取邮件后在本地机上进行处理,因此POP3是一个脱机协议。邮件被客户机取走后即被删除,服务器上不保留邮件各份。 客户机在和服务器通信前,首先建立连接,然后依次向服务器发送命令。POP3协 议包含12条命令,并包含三种状态,即认证状态(Authorization State)、处理状态 (Transaction State)和更新状态(Update State),不同的命令带有不同的参数,适用于不同袄态。客户端通过向服务器发送命令请求服务,如果此请求符合当前服务状态并且语法正确,则服务器接受此请求,返回一条正确信息,此信息以“+OK”开头,后面是服务器相应的响应信息;如果请求命令语法错误或不符合当前服务状态,则返回错误信息,以“-ERR”开头。后面是相应的错误描述信息。以下是POP3 命令及参数:USER username 认证用户名PASS password 认证密码认证,认证通过则状态转换APOP name ,digest 认可一种安全传输口令的办法,执行成功导致状态转换请参见 RFC 1321 。STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。LIST n 处理 server 返回指定邮件的大小等RETR n 处理 server 返回邮件的全部文本DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除RSET 处理撤消所有的 DELE 命令TOP n , m 处理 返回 n 号邮件的前 m 行内容,m 必须是自然数NOOP 处理 server 返回一个肯定的响应QUIT 希望结束会话。如果 server 处于处理 状态,则现在进入更新状态,删除那些标记成删除的邮件。如果 server 处于认可状态,则结束会话时 server 不进入更新状态 。2 工具技术介绍Visual C+ 6.0,简称VC或者VC6.0,是微软推出的一款C+编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了 Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0由Microsoft开发, 它不仅是一个C+ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。现在的最新版C+编译器集合在Microsoft Visual Studio 2010软件里面,包含C+,Visual basic,C#,J#,.net。等, 其中,VC开发环境的版本已经升级至Microsoft Visual C+ 2010,对C+的支持更加全面稳定,建议电脑性能好的可以使用此版本。 3 需求分析 3.1稳定性 软件最重要的性能就是它的稳定性。本软件在Windows操作系统下使用Visual C+软件进行编写,保证的平台的稳定性。 客户端对邮件的所有处理都是在网络连接建立之前进行的,在发送邮件时只是简单的从文件中读取并发送,无需对邮件进行任何处理。这样简化了发送过程,缩短了网络连接时间,避免了发送邮件时要解决邮件格式和内容错误的问题,减少了网络出错的机率。而服务器将收取到的邮件存储在本地硬盘临时文件夹中,只有在邮件投递到用户的邮箱、成功转发或在指定次数内无法转发的情况下才删除,这就保证了邮件不会丢失。 3.2兼容性 SMTP电子邮件系统应该与目前广泛使用的各种客户端软件及邮件服务器系统相兼容。具体的要求是: SMTP客户端发送的邮件应该可以被其他邮件客户端软件解析并正确显示;- SMTP客户端可以向现在被广泛使用的邮件服务器发送邮件; SMTP服务器可以接收任何客户端发送的邮件; SMTP服务器能够将邮件正确投递或者将收件人不是本地用户的邮件转发给目的服务器。 3.3易于维护及修改 每个功能设计成独立的模块进行编写程序,模块之间关联性很小,系统的整体设计简洁、清晰。这使得软件有良好的可读性和可移植性,特别是方便了以后对软件进行修改、维护和升级,即使要改变或增减系统的某些功能,也不需要重新编写整个程序,只需对该功能相应的函数进行修改就可以。 4 系统的分析与设计4.1系统总体框架 电子邮件系统可分为SMTP客户端和POP3客户端两部分,根据邮件在传输时使用的协议它们又分别可以分为SMTP和POP3。下图给出了电子邮件系统的整体框架结构,其中箭头令表示了邮件的传输路径。 首先由SMTP客户端编写并发送邮件;SMTP服务器接收到邮件后根据收件人是否是本地用户进行分发。如果是本地用户,则将邮件直接投递到用户邮箱中;如果是远程邮箱,则将邮件转发到收件人所在的服务器上;最后收件人通过POP3客户端经过POP3服务器,把邮件从服务器上的邮箱中取到本地主机上进行解析和显示。电子邮件服务器的用户名、密码以及其它参数(如每个邮箱的最大存储空间、每封信的大小等)都是通过管理服务器进行管理的。4.2系统通信模型调用socket函数创建一个用于通信的套接字,设置套接字地址结构,使用服务器端的的地址和端口号。调用connect函数来建立与服务器的连接。此时,可以调用读写函数进行数据的收发操作。操作完毕后,关闭该套接字,终止连接。4.2.1WinsockAPI函数 (1)初始化和终止使用Winsock函数 每个使用WinsockAPI的应用程序,在调用Winsock函数之前都必须检查系统是否加载Winsock库。应用程序通过调用函数WSAstartupO实现这个功能,只有在成功的调用该函数后,程序才能进一步的调用其他Winsock函数。当应用程序不再使用Winsock API中的任何函数时,必须调用WSACleanup()函数终止对Winsock函数库的使用。(2)建立和关闭套接口函数 应用程序在使用套接口通信前,必须使用Socket()函数创建一个套接口,该函数具有三个参数。参数AF说明套接口所使用的协议地址族,如果希望建立一个UDP或TCP套接口,则用常量AF_INET表示使用互联网协议(IP)。参数type描述套接口类型,在AF参数是AF_INET时,它只能是SOCK_STREAM,SOCK_DRAM或SOCK_RAW三个套接口类型中的一个,分别表示要创建的是流式套接口、数据报套接口和原始套接口。protocol参数说明套接口使用的特定协议,当参数AF和type都确定后,它可以使用限定了的值。当一个套接口不再使用时,一定要调用closcsocket()函数关闭这个套接口,以释放与该套接口关联的所有资源,包括正在等待处理的数据。(3)地址绑定函数 在使用于流式和数据报套接口时,服务器端是使用socket()函数创建套接口后,还不能马上使用,需要用bind()函数将套接口与本地主机地址和分配好的端口号联系起来。Winsock中使用sockaddr in结构体指定m地址和端口信息,它的定义如下: struct sockaddr_in( short sin_family, short sin_port, struct in_addr sin_addr, char sin_zero8);其中,sin_family必须是AF_INET,说明使用IP地址族;sin_port和sin_addrlP分别表示端口号和P地址:sin_zero般使用0填充。 (4)监听连接函数 服务器端将套接口与主机地址和端口号绑定后,用listen()函数指示该套接口进入监听连接状态请求的状态,等待客户端发出连接请求。除了用来标识一个已经绑定地址的套接口的参数外,该函数只有一个backlog参数指定了正待等待连接的最大队列长度。服务器按顺序从队列中接受连接请求,并将以接受的请求从队列中删除。 (5)请求和接受连接函数 当服务器端进入监听连接状态后,客户端就可以在建好的套接口上用connect()函数向服务器提出连接请求;而服务器端则使用acccpt()函数从等待连接队列中接受连接。这样就在服务器套接口和客户端套接口之间建立了一个连接。这两个函数的定义如下 :int connect(SOCKET s, const struct sockaddr FAR * name,int namelen); int accept(SOCKET s,struct sockaddr FAR * addr,int namelen);两个函数中的三个参数类型十分相似;s参数表示一个套接口。name和addr参数是以一个指向套接口地址结构体的指针,namelen说明了地址结构体的长度。但在每个函数中每个参数代表着不同的意义:connect()函数中,参数s是将要建立连接的套接口, name指向的地址结构体中存放着远端服务器套接口地址信息;而accept0函数中,参数s为服务器上处于监听状态的套接口,addr指向的结构体中存放着发出连接请求的客户端套接口地址信息。 (6)发送和接受数据函数 在Winsock函数库中有两套用于发送、接受数据的函数,它们分别是在已建立连接套接口上发送接受数据的函数send0、recv0和在无连接套接口上发送接受数据的函数sendto()、recvfrom()。这两套函数实现的功能相同,send()和sendto()函数将缓冲区中的数据发送给远端的套接口,recv()和recvfrom()函数从接收数据的缓冲区读取出远端套接口发送到的信息。它们的不同之处在于,用sendtoO和recvfrom()函数是每次发送,接受数据时,都需要有一个地址结构体用来存放远端套接口信息。 (7)套接口状态查询函数 使用send()和recv()等函数进行Io操作时,若套接口工作在阻塞方式线程会被迫进入等待状态。为了防止程序出现这个情况,可以使用select0函数,它在执行IO操作前对套接口进行检查。Select()函数可以通过参数设置分别检查套接口的可读性和可写性,它的返回有三种状态:可以进行IO操作、发生错误不能进行IO操作和等待时间超出参数设定的时间。该函数具有fds、*readfds、*writefds、*exceptfds和*timout五个参数。其中,nfds参数是为与Berkeley API相兼容并不使用;*readfds、*wdtefds和*exceptfds参数为fd_set眈类型的结构体,它代表一系列特定套接口的集合*readfds表示需要检查是否有可读数据的套接口集合,writefds参数表示需要检查是否可写数据的套接口集合,而exceptfds参数需要检查是否有外带数据的套接口集合;*timeout参数是一个指向设定了超时时间结构体的指针。 (8)数据存储类型的转换函数 不同的计算机系统在存储由多个字节组成的信息时,主机对字节值的存储顺序不同:将低序字节存放在低地址的方式叫做“小序在前(Little-endian)”,而将高序字节存放在低地址的方式叫做“大序在前(Big-endian)”。在计算机中TCPIP协议使用整数如端口号和地址,是按计算机各自的字节顺序来表示的,被称为“主机字节(Host-byte)”。而网络通信协议要求,在网络中使用的字节必须按“大序在前”的形式来表示,一般称之为“网络字节(Network-byte)”。由于Windows系列的操作系统使用的是“小序在前”的存储方式,因此在Winsock中有一系列特定的API函数用来进行主机字节顺序和网络字节顺序的转换: htonl()和htons():将主机字节顺序的数转化为网络字节顺序;ntohl()和ntohs():将网络字节顺序的数转化为主机字节顺序。在网络程序设计中,常常会使用到m地址,它一般使用点分十进制形式表示,如 202118666,这种IP地址在程序中一般是用ACSII字符串的形式存储的;但在网络上,P地址是以网络字节顺序表示的。Winsock函数库中,分别用inet_addr()和inet_ntoa()函数进行点分十进制表示的IP地址到网络字节顺序的m地址的转换及其逆转换。 (9)获取主机及网络信息函数 网络应用程序有时需要获取主机与网络的相关信息如主机名、远端地址等,这些信息一般存放在数据文件中。而获取这些主机和网络信息的函数被称作数据库函数。 Winsock函数库中数据库函数根据获取信息得不同可分为获取主机信息、协议信息和服务信息这三类。在本文中使用的这类函数为:gethostname()用来获取主机名;gethostbyname()函数根据主机名获取包含主机的妒地址的主机信息。4.3系统总体构成 预设计的简易电子邮件收发客户端模块是一个软件包,它应该包含邮件的发送、接收和显示功能,还可以对用户邮箱进行处理,如下图所示:4.3.1 SMTP客户端的设计 功能设计 电子邮件客户端肩负着电子邮件系统与用户交互邮件信息的重任,它是电子邮件系统中MUA(用户代理)部分。完整的电子邮件客户端应至少具备对邮件进行编写、传输、收取、阅读这几个基本功能。由于电子邮件的大部分使用者为非计算机专业人员,对电子邮件的原理并不了解,这就要求电子邮件客户端应该具有易于用户操作的界面,帮助用户进行邮件的编写和阅读,并且对邮件的具体处理(如生成标准格式的邮件、发送邮件、接收邮件、提取邮件信息等)操作应放在后台处理。 客户端的整体框架如图所示:它根据功能可分为两部分:SMTP客户端和POP3客户端。SMTP客户端是客户端中编辑、发送邮件部分,用户通过界面输入邮件信息后,SMTP客户端根据邮件信息生成标准格式的邮件,并发送到SMTP服务器上;POP3客户端实现邮件的接收和读取显示功能。(2)流程图根据模块化设计思想,按照SMTP客户端的不同功能将其分为检查邮件信息完整性、生成标准格式的邮件和发送邮件这三部分。SMTP客户端的基本流程图如下图:每部分的基本功能如下: (1)写邮件:在编写邮件界面用户按要求填写邮件正文、附件及其它必须的信息: (2)从界面获取邮件信息:调用MFC的函数将界面中的内容存储到结构体中以便程序中使用; (3)检查邮件信息完整性:检查从界面读取的信息中是否包括全部的发送邮件必备信息;(4)生成标准邮件:根据得到的邮件信息编写邮件头及邮件体各部分的头信息,并对需要编码的邮件体进行编码,然后将这些内容按照RFC822和MIME的规定的格式并存入临时文件中: (5)发送邮件:使用SMTP协议将邮件发送到服务器上。如果发送过程出现错误,则提示用户错误信息并返回编写邮件界面。建立网络连接 SMTP采用客户端朋艮务器工作模式,客户端与服务器之间建立一条TC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论