毕业设计(论文)-SMTP协议研究与实现.doc_第1页
毕业设计(论文)-SMTP协议研究与实现.doc_第2页
毕业设计(论文)-SMTP协议研究与实现.doc_第3页
毕业设计(论文)-SMTP协议研究与实现.doc_第4页
毕业设计(论文)-SMTP协议研究与实现.doc_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

摘 要 I 摘 要 在生活中、工作中,电子邮件都是必不可少的沟通交流工具,电子邮件 (electronic mail,简称 E-mail,标志:,也被大家昵称为“伊妹儿” ) ,又称电 子信箱、电子邮政,它是种用电子手段提供信息交换的通信方式,是 Internet 应用最广的服务,通过网络的电子邮件系统,用户可以用非常低廉的价格(不管 发送到哪里,都只需负担电话费和网费即可) ,以非常快速的方式(几秒钟之内 可以发送到世界上任何你指定的目的地) ,与世界上任何一个角落的网络用户联 系,这些电子邮件可以是文字、图像、声音等各种方式。同时,用户可以得到大 量免费的新闻、专题邮件,并实现轻松的信息搜索。 本论文主要对电子邮件其中一种协议SMTP,进行较为深入的研究与分 析,介绍其基本概念,基本原理,以及基本的工作方式。在此基础上,搭建本地 SMTP 服务器,并用网络比较流行的邮件客户端,实现邮件的发送与转发等简单 功能。 关键字:关键字:SMTP 协议,电子邮件,客户端 ABSTRACT II ABSTRACT In life, work, email is an essential communication tool, e-mail (electronic mail, referred to as E-mail, mark: , also nicknamed “Yemeir”), also known as E-mail, e-post, it is - kind of means electronic means of communication for the exchange of information, is the most widely used Internet service, network e- mail system, the user can use a very low price (regardless of where to send, are just a burdentelephone charges and net charge can), very fast (within a few seconds can be sent to any destination you specified in the world), network users with any corner of the world, these e-mail messages can be text, images, sound and other various ways. In the same time, the user can get a large number of free news, features e-mail, and easily search for the information. This thesis to conduct a more in-depth study on e-mail in one protocol - SMTP, introduce its basic concepts, basic principles, as well as basic work. Times based on setting up a local SMTP server, and network more popular mail client, mail sent forwards simple function. KeyWords: SMTP protocol, e-mail, client 目 录 III 目目 录录 第 1 章引言.1 1.1选题背景.1 1.2研究目标和意义.1 第 2 章SMTP 协议概述 .2 2.1协议简介.2 2.2协议原理.3 2.2.1SMTP 命令 .3 2.2.2信封、首部和正文.4 2.2.3工作模型.4 2.2.4工作过程.6 第 3 章相关协议介绍.10 3.1POP3 协议 .10 3.2IMAP4 协议 .11 第 4 章SMTP 协议客户端软件设计与实现 .12 4.1需求分析与总体设计.12 4.1.1功能分析.12 4.1.2总体设计.12 4.2各模块设计.14 4.2.1实现 SMTP 协议的核心类库.14 4.2.2模块之间的关系.19 4.3核心模块实现与核心功能编码.20 4.3.1邮件发送实现.20 4.3.2邮件内容相关实现.24 4.3.3邮件的编码方式.27 第 5 章软件测试.30 参考文献 .34 目 录 IV 致谢 .35 外文资料原文 .36 译文 .47 第 1 章 引言 1 第 1 章引言 1.1 选题背景 随着信息技术的发展、互联网的普及,电子邮件已经逐渐成为人们正常工作 和生活中进行沟通的重要手段。采用电子邮件服务可以方便快捷的与朋友、同事 或合作伙伴进行沟通,传递信息。电子邮件技术具有方便、快捷、成本低廉等特 性。能够大大减少信息传递的时间,比传统的信件传递方式更快捷,成本也更低。 在实现过程中加入了认证机制,因而,更安全、可靠。 电子邮件(e-mail)无疑是最流行的应用程序。Caceres et al.1991说明,所有 TCP 连接中大约一半是用于简单邮件传送协议 SMTP(Simple Mail Transfer Protocol)的(以比特计算为基础,FTP 连接传送更多的数据)。Paxson 1993发现, 平均每个邮件中包含大约 1500 字节的数据,但有的邮件中包含兆比特的数据, 因为有时电子邮件也用于发送文件。 1.2 研究目标和意义 目前与邮件相关的协议大概可以分为两种:一种是邮件发送协议SMTP 协 议;另一种是邮件接收协议POP 协议。本论文讨论的是用于发送邮件的 SMTP 协议。目前,SMTP 协议已经有了大量的实现,应用广泛。本软件是为了研究 SMTP 协议而作的一个实验型项目。目的在于掌握 SMTP 的工作原理,并实现一个 能够发送邮件的完整邮件客户端。最后的成果和目标是实现 SMTP 协议及其基本 命令,进行邮件发送及转发。 毕业设计论文 2 第 2 章SMTP 协议概述 协议简介 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由 源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属 于 TCP/IP 协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。 通过 SMTP 协议所指定的服务器,就可以把 Email 寄到收信人的服务器上了,整 个过程只要几分钟。SMTP 服务器则是遵循 SMTP 协议的发送邮件服务器,用来 发送或中转发出的电子邮件。 SMTP 是一种 TCP 协议支持的提供可靠且有效电子邮件传输的应用层协议。 SMTP 是建立在 TCP 上的一种邮件服务,主要用于传输系统之间的邮件信息并 提供来信有关的通知。 SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。 SMTP 重要特性之一是其能跨越网络传输邮件,即“ SMTP 邮件中继”。通常,一 个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网 络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层 协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过 中继器或网关实现某处理机与其它网络之间的邮件传输。 在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中 继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输 邮件的下一条 IP 地址。 在传输文件过程中使用端口:25 是因特网电子邮件系统首要的应用 层协议。它使用由 TCP 提供的可靠的数 据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大 多数应用层协议一样,SMTP 也存在两个 端:在发信人的邮件服务器上执行的客 户端和在收信人的邮件服务器上执行的服务器端。SMTP 的客户端和服务器端同 第 2 章 SMTP 协议概述 3 时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件 消息时,它是作为 SMTP 客户在运行。当一个邮件服务器从其他邮件服务器接收 邮件消息时,它是作为 SMTP 服务器在运行。 SMTP 协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行 在发送端邮件服务器主机上的 SMTP 客户,发起建立一个到运行在接收端邮件服 务 器主机上的 SMTP 服务器端口号 25 之间的 TCP 连接。如果接收邮件服务器 当前不在工作,SMTP 客户就等待一段时间后再尝试建立该连接。这个连接建立 之 后,SMTP 客户和服务器先执行一些应用层握手操作。就像人们在转手东西之 前往往先自我介绍那样,SMTP 客户和服务器也在传送信息之前先自我介绍一下。 在这个 SMTP 握手阶段,SMTP 客户向服务器分别指出发信人和收信人的电子 邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。SMTP 可以指望由 TCP 提供的可靠数据传输服务把该消息无错地传送到服务器。如果客户还有其他邮件 消息需发送到同一个服务器,它就在同一个 TCP 连接上重复上述过程;否 则,它 就指示 TCP 关闭该连接。 2.2 协议原理 从 1982 年到现在,SMTP 协议及其相关的协议已经发展成一个比较完整的体 系,不再是建立之初那个只能传送文本消息的简单协议。协议制定者制定了一系 列的相关协议,如:有关认证的部分和附件传送部分等。相关文档也由最初的 RFC821 文档,扩展为目前的 RFC2821、RFC20452049、RFC2554 等多个。目 前按照邮件协议的规定已经不仅仅能够传送文本,而且能够传送文件,网页以及 多媒体信息。但基本的操作模式没有变化,只是增加了相关的命令和格式。邮件 传送的模型,没有变化。 2.2.1SMTP 命令 最小 SMTP 实现支持 8 种命令。常见的有 5 个:HELO,MAIL,RCPT,DATA 和 QUIT。 RSET 命令异常终止当前的邮件事物并使两端复位。丢掉所有有关发送方、 接收方或邮件的存储信息。 毕业设计论文 4 VRFY 命令使客户能够询问发送方以验证接受方地址,而无需向接收方发送 邮件。通常是系统管理员在查找邮件交付差错时手工使用的。 NOOP 命令除了强迫服务器响应一个 OK 应答码(200)外,不做任何事情 还有附加和可选命令。EXPN 扩充邮件表,与 VRFY 类似,通常是由系统管 理员使用的。 TURN 命令使客户和服务器交换角色,无需拆除 TCP 连接并建立新的连接就 能以相反方向发送邮件。其他还有三个很少被实现的命令(SEND、SOML 和 SAML)取代 MAIL 命令。这三个命令允许邮件直接发送到客户终端或发送到接 受方的邮箱。 2.2.2信封、首部和正文 电子邮件由三部分组成: 1)信封(envelope)是 MTA 用来交付的。RFC 821 指明了信封的内容及其 解释,以及在一个 TCP 连接上用于交换邮件的协议。 2)首部由用户代理使用。RFC 822 指明了首部字段的格式的解释(以 X-开 始的首部字段是用户定义的字段,其他是由 RFC 822 定义的) 。长首部字段,多 余行以空格开头。 3)正文(body)是发送用户发给接收用户报文的内容。RFC 822 指定正文为 NVT ASCII 文字行。当用 DATA 命令发送时,先发送首部,紧跟一个空行,然 后是正文。用 DATA 命令发送的各行都必须小于 1000 字节。 用户接收我们指定为正文的部分,加上一些首部字段,并把结果传到 MTA。MTA 加上一些首部字段,加上信封,并把结果发送到另一个 MTA。 内容(content)通常用于描述首部和正文的结合。内容是客户用 DATA 命令 发送的。 2.2.3工作模型 SMTP 设计基于以下通信模型:针对用户的邮件请求,发送 SMTP 建立与接 第 2 章 SMTP 协议概述 5 收 SMTP 之间建立一个双向的传送通道,用于发送与接收 SMTP 的命令与应答码。 其中接收 SMTP 可以是最终接受者也可以是中间传送者。SMTP 命令由发送 SMTP 发出,由接收 SMTP 接收,而应答则反方向传送。 一旦传送通道建立,SMTP 发送者发送 MAIL 命令指明邮件发送者。如果 SMTP 接受者可以接收邮件则返回 OK 应答。SMTP 发送者再发出 RCPT 命令指 明邮件接收者。如果 SMTP 接收者能够接收,那么返回 OK 作为应答;如果不能 收到,则返回拒绝应答(但并不中止整个邮件操作) ,双发如此重复多次。当接 收者收到全部邮件后就会收到特别的序列,如果接受者成功处理了邮件,则返回 OK 应答。如图 2-1 所示。 图 2-1 SMTP 工作模型 SMTP 提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务器 时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传 送服务器时,通过中继 SMTP 服务器传送。为了能够对 SMTP 服务器提供中继能 力,它必须拥有最终目的主机地址和邮箱名称。 MAIL 命令参数是回复路径,它指定邮件从何处来;而 RCPT 命令的参数是 转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径 (它用于发生错误时返回邮件) 。 当同一个消息要发往不同的接收者时,SMTP 遇到了向不同接收者发送同一 份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个 数字代码。 命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两 毕业设计论文 6 者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大 小写是敏感的。这样 SMTP 实现中就将用户邮箱名称保留成初始时的样子,主机 名称对大小写不敏感。 命令与应答由 ASCII 字母表组成,当传送服务提供 8 位字节传送通道,每 7 位字符正确传送,而最高位被填充为 0。当指定一般的命令或应答格式后,参数 会由一些类似于语言的字符串表示出来,如或,这里尖 括号表示这是一种类似于语言的变量。 2.2.4工作过程 从 SMTP 协议的整体工作过程来看,客户端和服务器是典型的 C/S 结构,由 客户端向服务器发起连接请求,发送相关的命令(也可以说是要求的服务) ,等 待服务器的相关信息。得到服务器的信息后,对这些信息进行分析,再继续进行 下一步操作。本节中提供了一些相关过程举例和命令的说明,具体描述了 SMTP 协议中数据的交互过程。本节只介绍了少数几个 SMTP 命令和代码,本节末尾有 详细的命令列表和代码列表。 1、传送 在 SMTP 发送操作中有三步,操作由 MAIL 命令开始给出发送者标识。一系 列或更多的 RCPT 命令紧跟其后,给出了接收者信息,然后是 DATA 命令列出发 送的邮件内容,最后邮件内容指示符确认操作。 1) 过程中的第一步是 MAIL 命令,包括源邮箱。 MAILFROM: 此命令告诉接收者新的发送操作已经开始,请复位所有状态表和缓冲区。它 给出反向路径以进行错误信息返回。如果请求被接收,接收方返回一个 250 OK 应答。中不止包括了邮箱,它包括了主机和源邮箱的反向路由,其 中的第一个主机就是发送此命令的主机。 2) 过程中的第二步是发送 RCPT 命令。 RCPT TO: 第 2 章 SMTP 协议概述 7 此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个 250 OK 应答,并存储向前路径。如果接收者未知,接收方会返回一个 550 Failure 应 答。此过程可能会重复若干次。 不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一 个主机就是接收命令的主机。 3) 过程中的第三步是发送 DATA 命令。DATA 如果命令被接收,接收方返回一个 354 Intermediate 应答,并认定以下的各行 都是信件内容。当信件结尾收到并存储后,接收者发送一个 250 OK 应答。因为 邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可以重新 开始。SMTP 通过在最后一行仅发送一个句号来表示邮件 内容的结束,在接收方, 一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。 注意:邮件内容包括如下提示:Date,Subject,From,To。 邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果 此命令被接收,接收方返回一个 250 OK 应答。DATA 命令仅在邮件操作未完成 或源无效的情况下失败。 上面所述的过程是一个发送操作。这些命令只能以上面的顺序使用。下例表 示了在一个发送操作中这些命令的使用。 SMTP 过程例子此例是在 主机的 123 发送邮件给 主机的 234,345 和 456 的。 S:MAIL FROM:123 R: 250 OK S: RCPT TO: R: 250 OK S: RCPT TO: R: 550 No such user here S: RCPT TO:456 毕业设计论文 8 R: 250 OK S: DATA R: 354 Start mail input; end with CRLF.CRLF S: Blah blah blah. S:.等等 S: CRLF.CRLF R: 250 OK 此信被第一和三两个人接收,而第二个人在此主机上没有邮箱。 2、打开与退出 想进行邮件的发送,就要有一对用于传送信息的通道。这条通道就是发送者 和接接收者用户发送和接收数据的保证。在 SMTP 中规定了建立和销毁通道的命 令。建立命令为:HELO(EHLO) 。销毁的命令为:QUIT。这两个命令的正确应 答码为 220 和 221。信道正常被建立或销毁的时候,服务器端和客户端会分别依 靠命令和应答码来打开或关闭信道。 打开传送通道时,要交换一些信息以确定双方的身份。以下的命令是用于打 开和关闭的: HELO SP domain CRLF QUIT CRLF 在 HELLO 命令中,主机自己发送命令,此命令可以被解释为:“你好,我是 XX” 打开连接的例子: R: 220 Simple Mail Transfer Service Ready S: HELO xx R: 250 关闭联结的例子 第 2 章 SMTP 协议概述 9 S: QUIT R: 221 BBN-UNIX.ARPA Service closing transmission channel 从整个 SMTP 协议的工作过程来看,整个过程很类似于一对朋友的谈话,首 先要由客户端的朋友先向服务器端开口说 HELO,然后服务器端回答它的话。接 下来客户端就会根据一定的顺序,来继续的和服务器朋友进行交流,直到双方谈 话结束,客户端会主动的说 QUIT,表示自己要走了。服务器会回复它一个正常 的代码。之后双方的交流就正式的结束了。应答码列表如图 2-2 所示。 图 2-2 SMTP 协议应答码 毕业设计论文 10 第 3 章相关协议介绍 POP3 协议 POP3(Post Office Protocol 3)即邮局协议的第 3 个版本,它是规定个人计算机 如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的 第一个离线协议标准,POP3 协议允许用户从服务器上把邮件存储到本地主机 (即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮 件,而 POP3 服务器则是遵循 POP3 协议的接收邮件服务器,用来接收电子邮件 的。POP3 协议是 TCP/IP 协议族中的一员,,由 RFC 1939 定义。本协议主要用于 支持使用客户端远程管理在服务器上的电子邮件 POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本 3”。是 TCP/IP 协议族中的一员,由 RFC1939 定义。本协议主要用于支持使用客户端远 程管理在服务器上的电子邮件。提供了 SSL 加密的 POP3 协议被称为 POP3S。 POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子 邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。 这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机 器上,一般是 PC 机或 MAC。一旦邮件发送到 PC 机或 MAC 上,邮件服务器 上的邮件将会被删除。但目前的 POP3 邮件服务器大都可以“只下载邮件,服务器 端并不删除”,也就是改进的 POP3 协议。 POP3 协议默认端口:110 POP3 协议默认传输协议:TCP POP3 协议适用的构架结构:C/S POP3 协议的访问模式:离线访问 第 3 章 相关协议的介绍 11 3.2IMAP4 协议 IMAP4(Internet Message Access Protocol 4) 即 交互式数据消息访问协议第四 个版本。IMAP 协议是由斯坦福大学的 Mark Crispin 教授在 1986 年开发的,后期 版本是华盛顿州立大学进行开发的,IMAP4 是 TCP/IP 协议族中的一员,现在的 版本是“IMAP 第四版第一次修订版”(IMAP4rev1) 。 IMAP4 协议与 POP3 协议一样也是规定个人计算机如何访问互联网上的邮件 服务器进行收发邮件的协议,但是 IMAP4 协议同 POP3 协议相比更高级。IMAP4 协议支持客户机在线或者离线访问并阅读服务器上的邮件,还能交互式的操作服 务器上的邮件。IMAP4 协议更人性化的地方是不需要像 POP3 协议那样把邮件下 载到本地,用户可以通过客户端直接对服务器上的邮件进行操作(这里的操作是 指:在线阅读邮件 在线查看邮件主题 大小 发件地址等信息)。用户还可以在服 务器上维护自己邮件目录(维护是指移动 新建 删除 重命名 共享 抓取文本 等 操作)。IMAP4 协议弥补了 POP3 协议的很多缺陷, ,由 RFC3501 定义。本协议是 用于客户机远程访问服务器上电子邮件,它是邮件传输协议新的标准。 IMAP4 协议的默认端口:143 IMAP4 协议默认传输协议:TCP/IP IMAP4 协议适用的网络构架:C/S IMAP4 协议访问模式:离线/在线 IMAP4 协议存储邮件模式:分布式 毕业设计论文 12 第 4 章SMTP 协议客户端软件设计与实现 需求分析与总体设计 4.1.1功能分析 由本设计的题目可知,本设计的目的就是建立一款能够发送邮件的客户端软 件。对本软件而言,应该具备如下功能: 1)可以根据用户输入的数据连接服务器。 3)可以对有关数据进行加密。 4)可以发送邮件信息。 5)图形界面要信息完整、操作舒适、界面雅观。 根据以上分析,需要进行编码的操作有: 1) 从图形界面获取输入的数据的操作。 2) 根据 MFC 提供的 API 连接服务器,建立一条连接发送者和接收者的通道。 3) 提供 BASE64 的加密算法,能够对用户输入的数据进行加密。生成满足 SMTP 协议要求的数据。 4) 按照 SMTP 的要求,对邮件进行封装,生成满足协议要求的邮件。 5) 对邮件发送过程中,发送者与接收者之间的命令与应答码之间的关系进 行分析。 6) 图形界面编程。 第 4 章 SMTP 协议客户端软件设计与实现 13 4.1.2总体设计 目前流行的工作平台有很多,可以实现目标的编程语言也有多种。下面与流 行的两种平台做比较并说明选择 VC+的原因: 1、整个工程使用 JAVA 平台 从诞生至今,一路走来 JAVA 可以说是一帆风顺。已经超越了 C+称为最受 欢迎的语言之一。如果选择使用 JAVA 作为开发语言,并使用一种集成 IDE,如: JBUILDER。调用下 JAVA 有关邮件发送的类库,那么整个的邮件发送过程就变 成了对少数几个属性的设定问题,整个工程的主要任务就不再是对 SMTP 协议的 分析,而仅仅是对有关界面的设计(而且 JAVA 的界面设计相对于其他的可视化 来说好像有些不足,目前似乎只有 NetBeans 支持的比较好) 。而且使用 JAVA 的 条件是用户必须安装虚拟机,并且 JAVA 的执行速度在目前来看似乎也不太被看 好。因此没有考虑使用 JAVA 来完成本设计。 2、整个工程使用 C 语言实现 论速度而言,除开低等的汇编,C 语言绝对的独占熬头,并且 C 语言的语法 简单,构建出的程序结构也清晰。结构化的程序设计方式,也让人自然而然的从 上而下的去思考。其类库并且提供了大量的有关网络操作 API,让用户能够方便 的使用并获得所求的值。但 C 语言并没有提供太多有关图形设计方面的框架(或 者是目前没有用于 C 语言的应用程序框架) 。开发者可能会花大量的时间在分析 事件的流程上,而不是程序的逻辑。如此一来,得不偿失。 因此,软件采用 MFC 为应用框架,配合 IDE 使用,能够自动提供出一套功 能有限但设计结构清晰的标准 Windows 程序。使用开发语言为 C+,是典型的面 向对象设计语言。利用其面向对象的特性,在开发过程中能够方便的向软件添加 功能。因此,在该程序的设计过程中,选取了 C+作为开发语言,VC+6.0 作为 程序设计的 IDE。在本软件过程中,定义了 CSMTP、CMailMessage、CMIMEMessage、CBASE64 四个工具类,给程序使用。 整个程序就是使用了 MFC 提供的应用程序框架,并在其中添加了上述几个工具 类,相互协调工作而得来。结构清晰,功能相对完备,既完成了预期的需求,也 学习到了有关 SMTP 协议的知识。 毕业设计论文 14 4.2 各模块设计 4.2.1实现 SMTP 协议的核心类库 如上所述,目前与 SMTP 协议有关的核心类共四个,对于邮件的所有操作, 均封装在四个工具类中。按照其完成的功能进行划分,每个工具类都可以作为一 个子模块。四个子模块各守其则,分别代表了某一种功能或实体。 一、CSMTP 子模块:该模块封装了有关邮件发送过程的操作。使用该模块 可以建立或断开与服务器的连接、向服务器发送消息、从服务器接受消息并分析 得到的消息代码是否正确、在服务器返回错误消息时获取到该消息。对于 SMTP 的分析以及发送时发送端与接收端之间的会话,均由此类完成。该类提供了两个 重要的程序接口 Connect 和 TransmitMessage。其他模块只需调用其接口方法,并 传递正确的参数,就可以方便的与服务器建立连接,并传送邮件内容。由于当前 大多数 SMTP 服务器都已经要求用户进行身份验证,因此在该类中还封装了对发 送者身份验证的操作。 成员变量说明: 1)private BOOL m_bConnected:私有成员变量,表示当前是否与服务器连接。 TRUE 表示已连接;FALSE 表示没有进行连接。 2)private UINT m_nPort:私有成员变量,表示与服务器连接的端口。在该软 件中该值为 25。表示使用服务器的 25 号端口。 3)private CString m_nSMTPServerHostName:私有成员变量,表示服务器的 名称。例如:。 4)private CSocket m_SMTPServer:私有成员变量,表示连接到服务器的网络 实体。 5)private CStringList * m_psErrorList:私有成员变量,是用于存放产生的错 误消息的列表。 6)protected TCHAR* responseBuf:保护成员变量,用于存放服务器返回的消 息。 第 4 章 SMTP 协议客户端软件设计与实现 15 7)protected static ResponseCode* responseTable:保护的静态成员变量,代 表消息码与对应消息的映射表。 成员函数说明: 1) private BOOL GetResponse(UINT responseExpected):该方法根据获取的 UINT 类型的参数 responseExpected 来判断所进行的操作是否正确。在该方法中客 户端接收从服务器发送来的消息,并进行解析,然后根据给定的参数 responseExpected 来进行判断。如果判断正确,那么返回 TRUE;否则返回 FALSE。 2) public void SetServerProperties(CString szSMTPServerName , UINT nPort=SMTP_PORT):该方法根据获得的字符串类型和 UINT 类型参数来设置要连 接的服务器的名称以及端口号。其中 szSMTPServerName 是服务器的名称,nPort 是端口号。其默认值为 SMTP_PORT 25。 3) public CString GetLastError():通过调用该方法,能够获取服务器返回的错 误信息。如果没有错误信息,则返回空。 4) public UINT GetPort():获取服务器的端口号。 5) public BOOL Connect():连接服务器方法。通过该方法,可以根据 SetServerProperties 方法设置的属性,连接到指定的服务器。如果连接成功则返回 TRUE;否则返回 FALSE。 6) public virtual BOOL TransmitMessgae(CMailMessage * msg):该方法的作用 是根据传递进来的 CMailMessage 对象传送邮件。在该方法中封装了邮件发送的 操作并对 SMTP 协议规定的命令和应答码的交互操作做了实现,而且与邮件发送 有关的身份验证操作也在该方法中实现。本方法的参数 msg 应包含就是要发送的 邮件的信息,如发送的来源、目的地、邮件的题目、发送时间、正文内容以及附 件,均存储在 msg 对象中。在发送过程中,顺序发送命令:AUTH LOGIN、MAIL FROM 、RCPT TO(可重复多次) 、DATA (结束符 CRLF.CRLF) 、QUIT,并在每次发送后设置一个接收指令,用于接收从服务器传 回的数据,并进行分析。如果是预期的数据那么返回 TRUE,标志发送成功;如 果返回 FALSE,标志发送失败。 毕业设计论文 16 7) private CString CookBody(CMailMessage * msg):该方法用于剔除在邮件正 文以及邮件中与结束标志冲突的字符。在 SMTP 协议中规定:邮件正文以 DATA 命令开始,以“CRLF.CRLF”标志结束,为了避免在邮件正文中,出现上述的结束 标志,必须在发送邮件前检测邮件,把邮件中所有的与邮件结束符号相同的字符 替换为“CRLF.CRLF”,来避免在邮件发送时出现结束位置不明的错误。当邮件发 送到服务器后,会自动的把邮件正文中的被替换的字符换回为原来的字符,从而 保证邮件的正确性。该方法的参数为 CMailMessage*类型的指针,代表一个邮件 对象。该对象包含有关的邮件信息,方便在本方法中对要发送的邮件进行操作。 8) protected static ResponseCode* GetServerResponseMessage(UINT):该方法的 作用是根据传递进来的消息码来返回一个与消息码对应的服务器消息。该方法采 用查表的方式,根据邮件服务器发送的消息,来确定返回消息的具体信息,该方 法主要在邮件操作出错时,提供错误信息。如果查表成功,返回一个合适的出错 信息;如果查表失败,则返回未知错误。有关应答码和与应答码相关信息,均在 本类的静态成员变量 ResponseCode responseTable 中做了规定。 二、CMailMessage 子模块:该模块用于表示邮件的所有内容,如:邮件的发 送者、接收者、标题、正文以及附件。该类的设计借鉴了 JAVA 中 JavaBean 的定 义方式,对私有数据进行封装只能通过对应的方法进行存取。使用本类提供了能 够对邮件内容进行规范化设计的操作,使用这些操作能够得到满足 SMTP 协议规 定的电子邮件。 成员变量说明: 1)public CPtrArray m_Attachments:公有成员变量,表示邮件的附件。使用 MFC 提供的 CPtrArray 类型变量,能够方便的存储多个附件的信息。 2)public CString m_AttachmentString:表示附件文件的名称,在给该类的对 象添加有关的附件信息的时候使用。 3)protected CString m_sSubject、m_sFrom、m_sTo、m_sHeader、m_sBody、m_sPassword、CTime m_tDateTime:表示邮件的信息,分别为:邮件的标题、邮件发送者、邮件接收者、 邮件头信息、邮件体正文、身份验证的密码以及邮件发送的时间。对于每个域均 第 4 章 SMTP 协议客户端软件设计与实现 17 有一对对应的存取方法 Get 和 Set 来对其进行操作。这设计的方式参考了 JAVA 中的 JavaBean 的设计模式。方便调用者使用该类。 4)private CArray m_Recipients:私有成员变量。表 示邮件接收者的一个数组。在 SMTP 协议中规定:一封邮件可以有多个接收者, 每个接收者需要一个 RCPT TO 命令与之对应。该变量就是用于存储多个接收者 的。 成员函数说明: 1) public int AddAttachMent(CString filename):该方法的作用是添加根据参数 提供的文件名称,把该文件当成附件添加到当前的邮件中。返回值为邮件中已有 的附件的个数。该方法有一个重载方法,参数为 CMIMEMessage*,作用是把一 个附件添加到当前邮件。返回值与该方法意义相同。 2) public int GetAttachmentNum():该方法的作用是获取当前附件的个数。 3) public int GetNumberRecipients(RECIPIENTS_TYPE type=TO):作用是获取 当前的接收者的数目。参数是接收者的类型,默认值是 TO 类型,意为普通的接 收者。参数 type 是个 enum RECIPIENT_TYPE 类型的变量,有三个合法值,分别 为:TO,CC,BCC。分别代表:普通接收者,抄送和密送。对于后两个值,本版本 没有提供支持。 4) BOOL AddRecipient(LPCTSTR szEmailAddress , LPCTSTR szFriendlyName= , RECIPIENTS_TYPE type=TO):作用是向邮件添加接收者信息。 默认的接收者类型为 TO,也是当前版本唯一能够支持的类型。szEmailAddress 表 示邮件的地址,szFriendlyName 表示名称。 5) public void AddToHeader(CString sTemp):该方法作用是向邮件添加头信息。 传递的参数为要向邮件添加的头信息。 6) public virtual void PrepareHeader():本方法的作用是根据对象本身的成员变 量来生成邮件头。根据 SMTP 协议的规定,邮件的头包括:From、To(可重复多 次)、Subject、Date、X-Mailer、MIME-Version: 、Content-type 等多个域。这些域 构成了邮件头的信息。只有正确包含上述域的邮件才能被邮件服务器接收。这些 域的生成均包含在了该方法的实现中,通过调用该方法就可以获得一个满足 毕业设计论文 18 SMTP 协议要求的邮件头。 7) public virtual void PrepareBody():该方法的作用是生成一个满足 SMTP 协议 的邮件体。根据 SMTP 协议的规定:邮件的正文和附件消息均要满足固定的格式。 并且邮件正文与附件、附件与附件之间要有正确的分隔标志。该方法中规定的邮 件分隔标志为#BOUNDARY#,该标志由 PrepareHeader()方法中定义。在方法中, 根据当前添加的邮件附件的个数来添加标志。所有附件添加结束后,会添加一个 为“-#BOUNDARY#-”的结束符号。标志邮件正文的结束。 三、CMIMEMessage 子模块:该模块用于表示邮件的附件。使用该类可以根 据提供的文件名读取出正确的文件,保存文件名和标题。并提供了能够取出这些 属性的方法。 成员变量说明: 1) protected CString m_Filename:保护成员变量,表示附件所代表的文件的文 件名。添加到邮件时使用。 2) protected CString m_FileContent、TCHAR * m_ContentBuffer:保护成员变 量,表示附件所代表的文件的内容。 3) protected DWORD bufLen:保护成员变量,表示当前附件的长度,单位是字 节。 成员函数说明: 1) public BOOL Attach(const CString /创建连接,成功继续执行,失败则返回。 if( !this-m_SMTPServer.Create() 第 4 章 SMTP 协议客户端软件设计与实现 21 /用用户指定的服务器和端口号码连接到服务器,成功继续执行;失败返回 if( !this-m_SMTPServer.Connect(p,this-GetPort() /接收服务器发送的消息代码,为 220 说明服务器接受了请求,否则出错 if(!this-GetResponse(SMTP_SERVER_READY) ) /发送 EHLO 命令给服务器,要求建立一条通信通道 helloCommand.Format(EHLO %srn , localHostName); this- m_SMTPServer.Send(LPCTSTR)helloCommand,helloCommand.GetLength();if( !this-GetResponse(SMTP_SERVER_TASK_FINISH) ) 如果在上述过程中没有出错,那么就得到了一条客户端与服务器进行信息交 互的通道。利用该通道就可以进行邮件传送操作了。综上所述,建立与服务器连 接过程程序流程图如图 4-2 所示。 毕业设计论文 22 图 4-2 建立与服务器连接算法流程图 通过上述操作,连接建立结束,接下来的工作就是传送数据了。相关的操作 是在 CSMTP 类中的 TransmitMessage 方法中完成的。方法如下: /首先判断连接是否已经建立 /如果连接已经建立,那么就继续进行下面的操作;否则返回错误信息 if( !this-m_bConnected ) /发送身份验证命令。发送后等待服务器的回复,如果回复为 AUTH_OK, /那么继续下面的操作,否则返回错误信息 sAuth.Format( _T(AUTH LOGINrn) ) ; this-m_SMTPServer.Send( (LPCTSTR)sAuth , sAuth.GetLength() ); if( !this-GetResponse(AUTH_OK) ) /使用 CBASE64 对用户名进行加密并发送 CString username = cBase.Encode( sFrom , sFrom.G

温馨提示

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

评论

0/150

提交评论