09

电子邮件是当今互联网中使用最广泛的通信手段之一,同时它的发展对互联网技术也起到了极大的推动作用。
本文设计了一个往来电子邮件的收发及管理系统,以目前的互联网技术为依据,应用到了SMTP和POP3等基本的网络协议,并利用VB6.0作为开发工具实现了从邮件客户端来收发电子邮件和对邮件的管理。

按照模块化的编程思想,本设计完成了通过客户端进行信件的发送和信件的接收,并且主要对邮件的管理模块做了一定的扩展,不仅能登记和查询往来邮件而且加入了对邮件帐号的管理和地址薄功能,使得用户之间便捷、准确的联系。
本设计最大的特点是利用了VB的可视化编程,使得该邮件的界面简洁大方,利用Access关系型数据库管理系统增强了邮件的管理功能。
因此该设计呈现给用户的是一个方便操作,容易管理的邮件客户端软件。
关键词 电子邮件,SMTP,POP3,VB
目录
摘要 II
Abstract III
第一章 绪论 1
1.1课题背景 1
1.2电子邮件的研究现状 1
1.3本文研究的主要内容 2
第二章 电子邮件的基本理论 4
2.1.Email传输中的编码标准 4
2.2 电子邮件原理 5
2.3 电子邮件的有关协议 7
2.3.1 SMTP协议 7
2.3.2 POP3协议 9
2.3.3 其他协议 12
第三章 电子邮件系统的设计 13
3.1开发环境和编程语言 13
3.2设计思想 13
3.2.1 邮件的收发 13
3.2.2 邮件的管理 14
3.3模块设计 15
第四章 邮件客户端实现过程 16
4.1 客户端主界面 16
4.2 各功能模块的实现 19
4.2.1 邮件的发送 19
4.2.2 邮件的接收 21
4.2.3 往来邮件收发登记 23
4.2.4 往来邮件的查询 25
4.2.5 邮件的其他管理功能 26
4.3 软件的调试和改进 32
第五章 总结与展望 33
5.1 本文工作总结 33
5.2 课题研究展望 33
致谢 34
参考文献 35
附录 36
摘要
Abstract
Email is one of the most popular communications instruments in internet nowadays , at the same time it’s powerful impulse the development of internet technique .
This article contrived a Email system of sending and receiving with management ,based on the internet technique nowadays , applied the basis of the internet protocol for example the SMTP and POP3 ,and the article realized Email sending and receiving with management using VB6.0 as develop tool via client port .
According to the modularization thought of program ,the article accomplished the sending and receiving via client port ,and mainly expanded the modularization of Email management , make it not only can register and demand Email but also add the management for Email accounts and directory inquiries ,which can make consumer communicated in security ,expediently and by rule and line .
The most prominent characteristic of this article is using the VB’s visual develop tool to make the interface of system be succinct and suitble, using the Access (RDBMS) enhanced the management of the Email system .
So this article take on one Email client port software which is operate conveniently and manage easily.
KEY WORDS email ,smtp,pop3,vb

第一章 绪论

1.1课题背景
电子邮件翻译自英文的email或e-mail,它表示通过电子通讯系统进行信件的书写、发送和接收。今天使用的最多的通讯系统是互联网,同时电子邮件也是互联网上作受欢迎的功能之一。电子邮件的诞生是在1971年秋季(确切的时间已经无法考证),当时已经有一种可传输文件的电脑程序以及一种原始的信息程序。电子邮件的发明人雷.汤姆林森(Ray Tomlinson) 对已有的传输文件程序以及信息程序进行研究,研制出一套新程序,它可通过电脑网络发送和接收信息,再也没有了以前的种种限制。为了让人们都拥有易识别的电子邮箱地址,汤姆林森决定采用@符号,符号前面加用户名,后面加用户邮箱所在的地址。电子邮件由此诞生。
虽然电子邮件是在70年代发明的,它却是在80年才得以兴起。70年代的沉寂主要是由于当时使用Arpanet网络的人太少,网络的速度也仅为目前56Kbps标准速度的二十分之一。受网络速度的限制,那时的用户只能发送些简短的信息,根本别想象现在那样发送大量照片;到80年代中期,个人电脑兴起,电子邮件开始在电脑迷以及大学生中广泛传播开来;到90年代中期,互联网浏览器诞生,全球网民人数激增,电子邮件被广为使用。
在过去5年中,关于电子邮件发生的最大变化是基于互联网的电子邮件的兴起。人们可以通过任何联网的计算机在邮件网站上维护他们的邮件帐号,而不是只能在他们家中或公司的联网电脑上使用邮件。这种邮件是由Hotmail推广的。如今Hotmail已经成为一大热门网站,微软在8月宣布,邮件服务的用户已经达到了1.1亿。但微软在1998年收购此网站的时候却仅用了4亿美元,这个价格后来令Hotmail的创建者沙比尔•布哈蒂尔后悔不迭。
Hotmail的成功使一大批竞争者得到了启发,很快电子邮件成为门户网站的必有服务,如雅虎,netscape,Exicite和Lycos等,都有自己的电子邮件服务。

1.2电子邮件的研究现状
电子邮件【1】系统经过几十年的发展,已经形成了完善的技术体系。但随着社会、经济和科技的发展,对电子邮件的技术提出的新的要求,电子邮件的技术研究可从以下的邮件客户端看出一二:
1. Foxmail 6.0 beta 3
2006年 4月中旬,Foxmail 6.0 beta 3(以下简称 beta 3)推出。其中增添了一些新的功能,譬如发邮件自动构建地址簿;新的邮件列表样式,这样可以将邮件进行分组;可以新建邮件夹,将收取到的不同人的信件自动放到不同邮件夹中。
2. Thunderbird2(雷鸟)电子邮件客户端
开源软件厂商Mozilla基金会推出了 Thunderbird2(雷鸟)电子邮件客户端的最终版本,改进后的电子邮件客户端软件可以使消费者对电子邮件信息进行标签和整理分类。在新版电子邮件客户端软件中,消费者可以对电子邮件信息增加标签定制,新的功能和博客、照片共享网站被证明在目前最为流行。新的标签功能取代了静态的标签,消费者能够在客户端老时版本中分配信息,新版客户端同样具有通过历史电子邮件进行挑选的功能。
3. Eudora电子邮件
Eudora是由Qualcomm出品的老牌电子邮件软件,目前的版本为5.0。它具有界面友好、安装、使用方便及运行稳定等特点。与其他E-mail软件相比,Eudora有特色的功能包括:功能强大的邮件过滤器、支持多帐号和多用户以及方便实用的地址簿等。
从邮件技术方面来说,主要有:
1.Web邮件技术
随着中国Internet应用的日益普及和逐步深入,这些数字仍在不断增长。但是对于电子邮件系统来说,单纯使用邮件客户端程序进行邮件的收发已经不能满足用户移动办公的需要。Web邮件技术【2】的出现,彻底解决了用户办公的需要,使得邮件用户可以在任何地方使用浏览器登录邮件服务器收发邮件,而不用配置邮件客户端程序。
2.多语言
目前光中文就有若干字符集,如GB-18030、GB-2312、Big5等等,虽然我们可以统一标准,但是,在实际的过程中,我们不可能统一所有的邮件客户端,因此我们只能要求邮件服务器支持多语言的环境,使”我们的沟通无障碍”。

1.3本文研究的主要内容
本文要求设计一个电子邮件收发及管理系统,以收发双方的名字为专题对所有邮件进行管理。研究的主要内容是如何建立一个邮件客户端,能对邮件进行有效的管理。
在目前的企业应用中,企业最希望的功能是电子邮件的管理功能,企业已经意识到没有管理的电子邮件比没有电子邮件还可怕。企业希望能够高效、安全、稳定地应用电子邮件,为公司的管理、业务、客户服务提供很好的对外、对内的联系方式。
因此,在本文的论述中将主要是通过邮件客户端对邮件的管理做了比较全面的探讨,通过主界面就可以对所有邮件进行方便的管理,界面简洁明了。写新邮件、回复、转发、打印、删除、和帐号的管理等功能都可以在主界面上清楚见的,简洁的界面使用户容易上手,操作方便。对所选择的信件内容也能从该界面上得以显示,对信息的索取方便快捷。
具体的论述将在以下的各个章节做详细的说明。
第二章 电子邮件的基本理论

2.1.Email传输中的编码标准
1.编码的必要性
Email只能传送ASCII码(美国国家标准信息交换码)格式的文字信息,ASCII码是7位代码,非ASCII码格式的文件在传送过程中就需要先编成7位的ASCII代码,然后才能通过E-mail进行传送;如果不经过编码,则在传送过程中会因为ASCII码7位的限制而被分解,分解之后只会让收信方看到一堆杂乱的ASCII字符。经过编码后的文件,在传送过程中可顺利传送,不会有”被截掉一位”的危险。但是收信方必须具有相应的解码程序,将这份经过编码的东西还原,才能看到发信人要传送的信息是什么。
有一点要注意:大部分的人认为”文本文件不需要编码”,但我们的中文是属于8位代码的文字,并不是标准的ASCII码格式,由于在国内中文是通行的文字,所以大部分的邮件服务器都已能够处理GB内码的文件,因而不需要做这种编码/解码的操作,可以直接传送。但如果要送中文邮件到国外,就需要经过这种转换才能传送,因为国外的邮件服务器是无法辨认中文内码的。中文码在经过一些不支持中文内码的传递主机时,依然会被截掉一位,造成文件支离破碎无法读取而经过编码的中文邮件,收信人收到后将文件解码还原,也需要有中文系统才能看所写的中文信息。
2.常见的编码标准
1.UU编码(Unix-to-Unixencoding)
uuencode和uudecode原来是unix系统中使用的编码和解码程序,后来被改写成为在DOS中亦可执行的程序。在早期传送非ASCII码的文件时,最常用的便是这种UU编码方式。
使用的方法是:发邮件前,在DOS下先用uuencode.exe程序将原文件编码成ASCII码文件,然后将邮件发出。收信人收到邮件后,用uudecode.exe程序将文件还原。基于Windows的类似程序有wincode和winzip等。wincode的使用原理和DOS下的uuencode和uudecode没什么两样,只是在Windows的界面下操作更为简便。wincode除支持UU编码外也支持MIME、Binhex等编码格式,应用范围颇为广泛。以上介绍的UU编码并非只能编中文文字。任何你要寄送的文件包括exe等二进制文件都可以按照编码→发送→收信方收信→解码还原的步骤传送。
2.MIME标准(MultipurposeInternetMailExtentions)
UU编码解决了E-mail只能传送ASCII文件的问题。但这种方式其实并不是很方便,因而又发展出一种新的编码标准【3】,其全名是MultipurposeInternetMailExtentions,一般译作”多媒体邮件传送模式”。顾名思义,它可以传送多媒体文件,在一封电子邮件中附加各种格式文件一起送出。
MIME标准现已成为Internet电子邮件的主流。它的好处是以物件作为包装方式,可将多种不同文件一起打包后传送。发信人只要将要传送的文件选好,它在传送时即时编码,收信人的软件收到也是即时解码还原,完全自动化,非常方便。当然先决条件是双方的软件都必须具有这种功能,要不然发信人很方便地把信送出去了,但收信人的软件如果没有这种功能,无法把它还原,看到的也就是一大堆乱码了。使用这种方式,用户根本不需要知道它是如何编码/解码的。即使只是用文字写的信,一样是打好包便寄出。如果是要寄多媒体文件,只要做选文件的动作,选完后寄出,其余的工作由电子邮件软件自动完成。
由于MIME的方便性,愈来愈多的电子邮件软件采用这种方式。(我们现在最常使用的电子邮件软件Eudora、NetscapeMail、InternetMail等就是采用MIME方式,所以我们才能如此轻松地收发电子邮件。)MIME定义的是一种规格,也可以说是一种统称。
其实能够符合这种规格的编码方式并不是单一的一种,只要符合这种MIME规格便可顺利传送。以货运作为比喻,若货运公司规定送交货运的规格是1立方米大小的箱子便可托运,它并没有限制一定要用木箱或是铁皮箱,只要是1立方米大小,货运公司就帮你送达。至于箱子里你是装食品或是书本或是衣服或是混合着装也没有限定,也就是说,多种格式的文件可以一起寄送。
MIME定义两种编码方式:Base64与QP(Quote-Printable)。QP的规则是对于资料中的7位无须重复编码,仅将8位的数据转成7位。QP编码适用于非ASCII码的文字内容,例如我们的中文文件。而Base64的编码规则,是将整个文件重新编码成7位,通常用于传送二进制文件。编码的方式不同会影响编码之后的文件大校而具有MIME功能的E-mail软件大都能自动判别你的邮件是采用何种编码,然后自动选择用QP或Base64来解码。
QP编码的方式,是将一个字节用两个16进制数值表示,然后在前面加”=”。所以我们看到经过QP编码后的文字通常是这个样子:=A4j=AEa=A6n=A1I=A7=DA=AC0=B1=E7=A9s=A7g=A1A=AB=DC=B0=AA=B
Base64编码后的文字通常是:
pGquYaZuoUmn2qxPseepc6dnoUGr3LCqv70ms773t3ymYqa5plakaq5hptu如果你使用支持MIME标准的电子邮件软件,那么在收发信件的过程中是看不到这些乱七八糟的字符的。但如果很不幸,收信人没有这种支持MIME的软件,他看到的东西就是上面那一大段符号了。不过别急,你仍然可以先将这份”天书”存档,然后使用一些decode软件把它翻译回来。
在MIME几乎已成标准规格的现在,用一套支持MIME的软件来做收发Email的工作,这些编码/解码工作就会自动完成,不会给你带来麻烦。

2.2 电子邮件原理
电子邮件的原理【4】与普通邮件的原理有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如图2-1所示:

更进一步的解释涉及到以下几个概念:
MUA — Mail User Agent, 邮件用户代理,帮助用户读写邮件;
MTA — Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务器或邮件投递代理;
MDA — Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。
目前使用的SMTP 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如图2-2所示。

如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。
事实上,邮件在传输过程中,服务器要把它打包成一个数据对象,包括上面的信件和一个信封。邮件的投递是依靠信封上的地址或信封信头(envelop address 或envelop header),而不是上面讲的信件上的地址。
从表面上看,一封邮件是从发件人的机器直接传送到收件人的机器,但通常这并不正确,一封邮件发送和接受过程至少要经过四台计算机。参考下图所示。用户通常在自己的电脑前编写阅读邮件,我们把它叫做客户端 (client 1~~4 )。大部分组织里,都是用一台专门的机器处理邮件,称作邮件服务器 (SMTP1, SMTP2). 如果用户是从家里拨号上网,那么邮件服务器是ISP 提供的。
当某个用户在自己的电脑 Client1 前编写完一个邮件,然后把它发送到他的ISP 的邮件服务器SMTP1。此时她的机器已经完成了所有的工作,但邮件服务器SMTP1还必须想法把邮件发送到目的地。SMTP1 通过阅读信头或信封上的地址,找到收件认得邮件服务器SMTP2, 然后与该服务器建立连接,把邮件发到收件人的服务器上,等待收件人来取阅。
电子邮件的工作过程遵循客户-服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。邮件服务器识将消息存放在接收者的电子信箱内,并告知接收者有新邮件到来。接收者通过邮件客户程序连接到服务器后,就会看到服务器的通知,进而打开自己的电子信箱来查收邮件。
通常Internet上的个人用户不能直接接收电子邮件,而是通过申请ISP主机的一个电子信箱,由ISP主机负责电子邮件的接收。一旦有用户的电子邮件到来,ISP主机就将邮件移到用户的电子信箱内,并通知用户有新邮件。因此,当发送一条电子邮件给一另一个客户时,电子邮件首先从用户计算机发送到ISP主机,再到Internet,再到收件人的ISP主机,最后到收件人的个人计算机。
ISP主机起着”邮局”的作用,管理着众多用户的电子信箱。每个用户的电子信箱实际上就是用户所申请的帐号名。每个用户的电子邮件信箱都要占用ISP主机一定容量的硬盘空间,由于这一空间是有限的,因此用户要定期查收和阅读电子信箱中的邮件,以便腾出空间来接收新的邮件。
电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet上的电子邮件。
2.3 电子邮件的有关协议
2.3.1 SMTP协议
1.SMTP的基本结构
SMTP (Simple Mail Transfer Protocol)协议【5】是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有SMTP协议,但事实上它与传输系统和机制无关,仅要求一个可靠的数据流通道。它可以工作在TCP上,也可以工作在NCP, NITS 等协议上。在TCP上,它使用端口25进行传输。SMTP的一个重要特点是可以在可交互的通信系统中转发邮件。
1. SMTP的模型
SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。下面是SMTP的模型示意图。

发件方SMTP向收件方发处MAIL命令,告知发件方的身份;如果收件方接受,就会回答OK。发件方再发出RCPT命令,告知收件人的身份,收件方SMTP确认是否接收或转发,如果同意就回答OK;接下来就可以进行数据传输了。通信过程中,发件方SMTP与收件方SMTP 采用对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。整个过程由发件方控制,有时需要确认几回才可以。
为了保证回复命令的有效,SMTP要求发件方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由ASCII码组成。命令代码是大小写无关的,如MAIL和 mail ﹑mAIL是等效的。
2. SMTP的基本命令
SMTP定义了14个命令,它们是:
HELO
MAIL FROM:
RCPT TO:
DATA
RSET
SEND FROM:
SOML FROM:
SAML FROM:
VRFY
EXPN
HELP [ ]
NOOP
QUIT
TURN
其中使得SMTP工作的基本的命令有7个,分别为:HELO﹑MAIL﹑RCPT﹑DATA﹑REST﹑NOOP和QUIT。下面分别介绍如下:
HELO–发件方问候收件方,后面是发件人的服务器地址或标识。收件方回答OK时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。
MAIL–这个命令用来开始传送邮件,它的后面跟随发件方邮件地址(返回邮件地址)。它也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发件方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。
RCPT –这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,它必须报550错误代码通知发件方。如果服务器同意转发,它要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。
DATA–收件方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是”.”的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复OK。
REST–这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收放必须回答OK.
NOOP–这个命令不影响任何参数,只是要求接收放回答OK, 不会影响缓冲区的数据。
QUIT–SMTP要求接收放必须回答OK,然后中断传输;在收到这个命令并回答OK前,收件方不得中断连接,即使传输出现错误。发件方在发出这个命令并收到OK答复前,也不得中断连接。
3、SMTP响应
对SMTP命令的响应是多样的,它确定了在邮件传输过程中请求和处理的同步,也保证了发送SMTP知道接收SMTP的状态。每个命令必须有且只有一个响应。
SMTP响应由三位数字组成,其后跟一些文本。数字帮助决定下一个应该进入的状态,而文本对人是有意义的。三位的响应已经包括了足够的信息,不用再阅读文本,文本可以直接抛弃或者传递给用户。特别的是,文本是与接收和环境相关的,所以每次接收到的文本可能不同。在附录E中可以看到全部的响应码。正规的情况下,响应由下面序列构成:三位的数字,,一行文本和一个,或者也可以是一个多行响应。只有EXPN和HELP命令可以导致多行应答,然而,对所有命令,多行响应都是允许的。
三位的应答码每一位都有特定的意义。每一位应答表示是否是成功的,失败的或未完成的。通过这一位,不复杂的SMTP发送就可以决定下一步的操作,如果发送方希望大概了解究竟出了什么问题,它可以检测第二位,而第三位则保存了最后更完整的信息。也就是说,从第一位到第三位,接收方可以一步比一步精确地确定接收方的状态。

2.3.2 POP3协议
1.POP3协议
POP3(Post Office Protocol 3) POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称POP3。,它规定怎样将个人计算机连接Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
POP适用于C/S结构的脱机模型。脱机模型即不能在线操作,当客户机与服务器连接并查询新电子邮件时,被该客户机指定的所有将被下载的邮件都将被程序下载到客户机,下载后,电子邮件客户机就可以删除或修改任意邮件,而无需与电子邮件服务器进一步交互。POP3客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行以ASCII文本+OK或-ERR指出相应的操作状态是成功还是失败。
在POP3协议中有三种状态,认可状态,处理状态,和更新状态。当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态, 在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状态。如图2-5所示:
等待连接        身份确认         quit命令
–  |认可|—– |处理|——|更新|
|__________________________________|
重返认可状态

图2-5 POP3工作状态示意图

2.基本操作
初始时,服务器通过侦听tcp端口110开始pop3服务。当客户主机需要使用服务时,它将与服务器主机建立tcp连接。当连接建立后,pop3发送确认消息。客户和pop3服务器相互(分别)交换命令和响应,这一过程一直要持续到连接终止.pop3命令由一个命令和一些参数组成。所有命令以一个crlf对结束。命令和参数由可打印的ascii字符组成,它们之间由空格间隔。命令一般是三到四个字母,每个参数却可达40个字符长。
pop3响应由一个状态码和一个可能跟有附加信息的命令组成。所有响应也是由crlf对结束。现在有两种状态码,”确定” (”+ok”)和”失败” (”-err”)。对于特定命令的响应是由许多字符组成的。在这些情况中,下面一一表述:在发送第一行响应和一个crlf之后,任何的附加信息行发送,他们也由crlf对结束。当所有信息发送结束时,发送最后一行,包括一个结束字符(十进制码46,也就是”.”)和一个crlf对。如果信息中的任何一行以结束字符开始,此行就是通过在那一行预先装入结束而进行字符填充的。因此,多行响应由五个crlf.crlf 结束。
一旦确认成功,服务器就获取与客户邮件相关的资源,此时这一过程进入了”操作”状态。在此状态中,客户提出服务,当客户发出quit命令时,此过程进入了”更新”状态。在此状态中,pop3服务器释放在”操作”状态中取得的资源,并发送消息,终止连接。 pop3服务器可以拥有一个自动退出登录的记时器。此记时器必须至少可以记录10分钟。这样从客户发送的消息才可能刷新此记时器。当记时器失效时,pop3会话并不进入”更新”状态,而是关闭tcp连接,而且不删除任何消息,不向客户发送任响应
3.”确认”状态
一旦tcp连接由pop3客户打开,pop3服务器发送一个单行的确认。这个消息可以是由crlf结束的任何字符。例如,它可以是: s: +ok pop3 server ready 注意:这个消息是一个pop3应答。pop3服务器应该给出一个”确定”响应作为确认。 此时pop3会话就进入了”确认”状态。此时,客户必须向服务器证明它的身份。在文档中介绍两种可能的处理机制,一种是user和pass命令,另一种是在后面要介绍的apop命令。
用user和pass命令进行确认过程,客户必须首先发送user命令,如果pop3服务器以”确认”状态码响应,客户就可以发送pass命令以完成确认,或者发送quit命令终止pop3会话。如果pop3服务器返回”失败”状态码,客户可以再发送确认命令,或者发送quit命令。当客户发送了pass命令后,服务器根据user和pass命令的附加信息决定是否允许访问相应的存储邮件。
一旦服务器通过这些数据决定允许客户访问储存邮件,服务器会在邮件上加上排它锁,以防止在进入”更新”状态前对邮件的改变。如果成功获得了排它锁,服务器返回一个”确认”状态码。会话进入”操作状态”,同时没有任何邮件被标记为删除。如果邮件因为某种原因不能打开(例如,排它锁不能获得,客户不能访问相应的邮件或者邮件不能进行语法分析),服务器将返回”失败”状态码。
在返回”失败”状态码后,服务器会关闭连接。如果服务器没有关闭连接,客户可以重新发送确认命令,重新开始,或者发送quit命令。 在服务器打开邮件后,它为每个消息指定一个消息号,并以八进制表示每个消息的长度。第一个消息被指定为1,第二个消息被指定为2,以此类推,第n个消息被指定为n。在pop3命令和响应中,所以的消息号和长度以十进制表示。
4.”更新”状态
当客户在”操作”状态下发送quit命令后,会话进入”更新”状态。(注意:如果客户在”确认”状态下发送quit后,会话并不进入”更新”状态。) 如果会话因为quit命令以外的原因中断,会话并不进入”更新”状态,也不从服务器中删除任何信件。
服务器删除所有标记为删除的信件,然后释放排它锁,并返回这些操作的状态码。最后tcp连接被中断。
以上讨论的命令是对pop3服务的最小实现。以下说明的可选命令允许客户更方便地处理信件,这是一个比较一般的pop3服务实现。
命令 参数 限制 说明 响应
top msg n
一个是未被标记为删除的信件数,另一个是非负数(必须提供)仅在”操作”状态下使用。
如果服务器返回”确认”,响应是多行的。在初始的+ok后,服务器发送信件头,一个空行将信件头和信件体分开,对于多行响应要注意字节填充终止符。 注意:如果客户要求的行数比信件体中的行数大,服务器会发送整个信件。
如果给出信件数,不包括被标记为删除的信件。
仅在”操作”状态下使用。如果给出了参数,且pop3服务器返回包括上述信息的”确认”,此行称为信息的”独立-id表”。 如果没有参数,服务器返回”确认”响应,此响应便以多行给出。在初的+ok后,对于每个信件,服务器均给出相应的响应。此行叫做信件的”独立-id表”。 为简化语法分析,所有服务器要求使用独立-id表的特定格式。它包括空格和信件的独立-id。 信件的独立-id由0×21到0×7e字符组成,这个符号在给定的存储邮件中不会重复。 注意:信件不包括被标记为删除的信件。
仅在pop3确认后的”确认”状态中使用。通常,每个pop3会话均以user/pass互换开始。这导致了用户名和口令在网络上的显式传送,这不会造成什么危险。但是,许多客户经常连接到服务检查信件。通常间隔时间比较短,这就加大了泄密的可能性。另 一种提供”确认”过程的方法是使用apop命令。 实现apop命令的服务器包括一个标记确认的时间戳。例如:在unix上使用apop命令的语法为:process-id.clock@hostname,其中进程-id是进程的十进制的数,时钟是系统时钟的十进制表示,主机名与pop3服务器名一致。
客户记录下此时间戳,然后以送apop命令。name语法和user命令一致。digest是采用md5算法产生的包括时间戳和共享密钥的字串。此密钥是客户和服务器共知的,应该注意保护此密钥,如果泄密,任何人都能够以用户身份进入服务器。如果服务器接到apop命令,它验证digest,如果正确,服务器返回”确认”,进入”操作”状态;否则,给出”失败”并停留在”确认”状态。
2.3.3 其他协议
1.IMAP4协议
IMAP【6】是Internet Message Access Protocol的缩写,顾名思义,主要提供的是通过Internet获取信息的一种协议。IMAP4是IMAP协议的第4个版本,正如POP3是POP协议的第3个版本一样。在21cn.com邮件系统内,IMAP是一种强有力的邮箱访问方式。
2.和POP3的区别
由于很多用户都对POP3非常熟悉,我们就从POP3说起。POP3提供了快捷的邮件下载服务,用户可以利用POP3把邮箱里的信下载到PC上进行离线阅读。一旦邮件进入PC的本地硬盘,就可以选择把邮件从服务器上删除,然后脱离与Internet的连接并选择在任何时候阅读已经下载的邮件。
IMAP同样提供了方便的邮件下载服务,让用户能进行离线阅读,但IMAP能完成的却远远不只这些。首先,IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。也就是说,你不必等所有的邮件都下载完毕后才知道究竟邮件里都有些什么。如果你根据摘要信息就可以决定某些邮件对你毫无用处,你就可以直接在服务器上把这些邮件删除掉,而不必浪费你宝贵的上网时间。
如果你的IMAP客户端软件完整支持IMAP4rev1的话(如Netscape 4.5),则你还可以享受选择性下载附件的服务。举例来说,假如一封邮件里含有大大小小共5个附件,而其中只有2个附件是你需要的,你就可以只下载那两个附件,节省了下载其余3个的时间。
3.和WebMail的比较
也有很多用户喜欢通过Web来联机收发邮件,其中一个很重要的原因是这些用户希望把他的邮件都留在服务器上,并且通过WebMail服务建立多个文件夹,然后分类归档地管理自己的邮件。这样,WebMail的用户就可以不分时间地点,只要有一个浏览器就可以马上从服务器上获得自己的邮件,不管是刚收到的还是已经存放了很久,也不必担心客户端的PC重新安装了操作系统或换了一台电脑以后邮件全部丢失了的问题。
IMAP同样满足了WebMail用户的需要。IMAP与POP3不同的地方关键是在支持离线阅读的同时也鼓励用户把邮件存储和组织在服务器上。和WebMail一样,通过IMAP,允许用户在服务器上建立任意层次结构的文件夹,并且可以灵活地在文件夹之间移动邮件,随心所欲地组织你的邮箱(这些显然是通过POP3做不到的)。
只要你的邮件存储在服务器上,任何时候通过一个IMAP的客户端软件都可以立即联机获得你的邮件,这一点与WebMail保持一致,但是,IMAP的以下优点足以把WebMail用户吸引过来:凡是WebMail的用户都必需无奈地阅读页面上的广告,都必需花费宝贵的时间和带宽来下载页面上的图面,修饰字符等等;IMAP则忠实地只为你的Email服务,不让你的资源有丝毫的浪费。
IMAP协议还允许你方便地利用你的邮箱作为信息存储工具,一般的IMAP4客户软件都支持邮件在本地文件夹间和服务器文件夹间的随意拖动,让你得心应手地把本地硬盘上的文件存放到服务器上,然后在你需要的时候同样方便地取回来,所有的功能仅需要一次鼠标拖放的操作来实现,是不是很好?
总的来说,POP3和WebMail的优点在IMAP里都有,而IMAP却能很好地克服POP3和WebMail各自的缺点。

第三章 电子邮件系统的设计

3.1开发环境和编程语言
本设计选用VB(Visual Basic)6.0【8】作为系统开发工具。
Visual 指的是开发图形用户界面 (GUI) 的方法–不需编写大量代码去描述界面元素的外观和位置,而只要把预先建立的对象add到屏幕上的一点即可。
Basic指的是 BASIC (Beginners All-Purpose Symbolic Instruction Code) 语言,一种在计算技术发展历史上应用得最为广泛的语言。Visual Basic 在原有 BASIC 语言的基础上进一步发展,至今包含了数百条语句、函数及关键词,其中很多和 Windows GUI 有直接关系。专业人员可以用 Visual Basic 实现其它任何 Windows 编程语言的功能,而初学者只要掌握几个关键词就可以建立实用的应用程序。
VB是一种面向对象的程序设计语言,拥有 图形用户界面(GUI )和快速应用程序开发(RAD)系统,可以轻易的使用 DAO、RDO、ADO 连接数据库,可以轻松的使用VB提供的组件快速建立一个应用程序 。VB可以用于可以开发多媒体、数据库、网络、图形等方面的应用程序。
本设计的电子邮件收发及管理系统主要应用于网络方面,当前使用的Visual Basic 6.0版本引入WebClasses作为一种简化手段,用于配置健壮的面向网络的应用程序非常合适。
电子邮件系统运用VB可以快速的创建用户界面,利用VB6.0提供的MAPI控件可以比较容易的实现邮件的收发,利用和数据库的联接可以实现邮件的管理。
3.2设计思想
本设计从模块化的程序设计思想出发,选用VB作为开发工具,利用ActiveX控件、MAPISession和MAPIMessages,将电子邮件的应用程序和适应MAPI的消息服务链接起来,实现电子邮件的收发和对邮件的管理。
3.2.1 邮件的收发
1.邮件的收取功能采用MAPI的会话控件MAPISession和消息控件【7】来实现。
MAPISession控件用于登录和退出一个MAPI会话。假如已存在MAPI服务,那么,用MAPISession控件进行登录只是提供注册用户的姓名和密码。MAPISession控件将确定操作系统中电子邮件设置,并调用基本的消息子系统。
(1)设置MAPISession的属性
在设计时,可用MAPISession的属性页设置MAPISession的属性。其中UserName和Password属性用来向基本的消息系统提供合法的登录信息。可以在设计时设置这些属性,也可以在运行时向用户提示输入这些属性。在需要向用户提供基本的电子邮件系统的登录对话框时,将LoginUI属性设置为True。如果不存在这样的对话框,则忽略该属性。可以创建自定义的对话框提示用户输入这些信息。
NewSession属性指定是否需要建立新的电子邮件会话。如果已经建立了合法的会话,通过设置属性可使两个会话并发运行。
DownloadMail属性指定在当前会话开始时,是否自动下载该用户的电子邮件。将该值设置为True,将把该用户的所有电子邮件下载到其收件箱。根据电子邮件系统的速度和接收的电子邮件数量,该操作有可能很耗时。通过将该属性设置为False,用户可以选择是否等到以后再下载电子邮件,或者设置自动下载电子邮件的时间间隔。
(2)SignOn和SignOff方法
设置了UserName和Password属性后,就可以在运行时使用SignOn方法启动MAPI会话了。
会话建立后,该会话的句柄被保存在SessionID属性中。根据NewSession属性的值,该会话句柄可能指向新创建的会话,也可能指向已经存在的会话。
要终止会话,使用SignOff方法。
2.邮件的发送功能是利用MAPIMessages控件的相关属性实现发送邮件的功能。
在MAPIMessages中,通过控件的RecipDisplayName属性设置接收邮件的地址信息,通过控件的MsgSubject属性设置发送邮件的主题信息,通过控件的MsgNoteText设置发送邮件的内容信息,通过Send方法发送邮件信息。
3.2.2 邮件的管理
往来邮件的管理,为了方便查看往来邮件,可以将收取的邮件管理起来。用MAPI的会话控件MAPISession和消息控件实现收取电子邮件的功能。运用数据库将收取的邮件进行保存。
当要按照某一用户名来查询往来邮件时,通过数据库的查询功能可将要查询的邮件按序列出到邮件列表里,这样以来用户可以清晰的看到通信双方的往来信件,对这样的信件更加方便查阅和回复。
3.3模块设计
第四章 邮件客户端实现过程
按照上一章的设计思想,用VB实现后如果没有编译错误,运行程序会看到如图4-1所示的主界面:

图4-1 电子邮件主界面
4.1 客户端主界面
在该设计中,首先也是最关键的就是对邮件客户端主界面的设计了,因此本文将对主界面的设计做详细的说明。
作为一个具有邮件收发及管理功能的客户端软件【9】,呈现给用户的必须是完整的功能,而如何对各项功能进行合理的安排使用户操作简洁,容易上手,对此我参照了当今最新版本的邮件客户端软件Dreammail,使我对主界面的设计有了一定的构思。下面将具体的介绍设计过程:
如图4-2所示,是在VB环境下对主界面的设计。

图4-2 主界面设计示意图
打开一个窗体命名为Formmain,在属性窗口里设置Caption值为Mymail,在Icon里选择一个.ico的图标,完成后如上图标识1所示。
对标识2的完成是在菜单编辑器中完成的,从菜单中调出菜单编辑器如图4-3所示:

图4-3 对菜单的编辑
使用编辑器按图中格式分别输入文件、编辑、查看等内容,其中(&S)为快捷键设置,完成后即可看到如标识2的菜单了。
对菜单的操作一般用到单击事件,以(邮件-回复)为例,代码如下:
Private Sub Reply_Click()
If ListViewMain.ListItems.Count > 0 Then
ReplyMail (Val(ListViewMain.SelectedItem.Text))
End If
End Sub
标识3的设计应用到了Toolbar控件,将图标和文字编辑到该控件中,这样的设计给人一种操作的便捷感,使该软件的主要功能一目了然。
对该控件的操作一般也是单击事件,对上面的10个图标单击事件代码如下:
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Index
Case 1: New_Click
Case 2: Reply_Click
Case 3: MsgBox “转发功能现在不可用!”
Case 5: MsgBox “打印功能现在不可用!”
Case 6: DeleteM_Click
Case 8: Send_Click
Case 9: Receive_Click
Case 11: SendReceive_Click
Case 13: Account_Click
Case 14: Address_Click
End Select
End Sub
标识4是一个Treeview控件【10】,它和标识5的Listview一并配合使用,用来显示文件结构和文件。用户可以通过读取数据库信息来填充Treeveiw控件节点,可以通过Add、Remove等方法来添加、删除、编辑节点信息等。因此选用这两个控件可以通过相应的操作实现对邮件的读取。相应的代码分别如下:
Private Sub TreeViewMain_NodeClick(ByVal Node As MSComctlLib.Node)
If TreeViewMain.SelectedItem.Index <> LastFolder Then
SelectFolder TreeViewMain.SelectedItem.Index
LastFolder = TreeViewMain.SelectedItem.Index
End If
End Sub
Private Sub ListViewMain_ItemClick(ByVal Item As MSComctlLib.ListItem)
SelectMail (Val(ListViewMain.SelectedItem.Text))
End Sub
标识6中使用到了Frame控件和Textbox控件,分别用来显示收件人,发件人和主题关键信息和目前所选信件的详细内容。Frame控件和Textbox控件分别定义如下:
Private Sub FrameMain_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
Private Sub Text_Data_Change()
End Sub
4.2 各功能模块的实现
按照第三章模块图的设计,在运行程序主界面后单击相应的功能将弹出相应的窗体,用来执行所选的操作。详细的说明通过以下各小节说明:
4.2.1 邮件的发送
在运行主界面后,单击新邮件选项会弹出如下所示的一个邮件编辑窗口,在这个窗口中编辑好邮件后单击发送就触发了发送程序。对这个窗体主要介绍邮件编辑和发送的有关内容,其界面的设计和主界面的有相似之处,所以不再赘述。

图4-4 邮件发送窗体
如图4-4,标识1的代码如下:
Private Sub tbToolBar_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Index
Case 1: Send_Click
Case 2: SaveTemp_Click
Case 4: Undo_Click
Case 5: Cut_Click
Case 6: Copy_Click
Case 7: Paste_Click
End Select
End Sub
即单击各个选项将触发相应的事件。
以下是对文本输入框3的激活代码,当文本框3激活时标识1中灰色的选项可用:
Private Sub Text_Mail3_Click()
If Text_Mail3.SelLength <> 0 Then
Cut.Enabled = True
Copy.Enabled = True
tbToolBar.Buttons(5).Enabled = True
tbToolBar.Buttons(6).Enabled = True
ElseIf Text_Mail3.SelLength = 0 Then
Cut.Enabled = False
Copy.Enabled = False
tbToolBar.Buttons(5).Enabled = False
tbToolBar.Buttons(6).Enabled = False
End If
End Sub
以编辑一段文字用来发送为例,如图4-5所示:

图4-5 发送操作窗体
当文本输入完毕后,若单击发送会进入邮件的发送状态窗体,用来实时提供邮件的验证、检测和发送情况等信息。发送状态中的一个截图如图4-6所示:

图4-6 发送状态图
这一过程的主要代码如下:
Private Sub Send_Click()
SendNewMail
End Sub
其中SendNewMail是在模块中编写好的,此处只是用Click事件来触发邮件的发送模块,这里只对发送模块代码做简要介绍,限于篇幅对发送模块的完整代码请参阅附录代码部分。
Public Sub SendEmail(Wsk As Winsock, StatusText As Label, ServerName As String, UserName As String, Receiver As String, FromMail As String, ToMail As String, Subject As String, Data As String)
发送helo标志
StatusText.Caption = “HELO”
Wsk.SendData “HELO ” & Wsk.LocalHostName & vbCrLf
Resp = WaitResponse
发送mailfrom标志
StatusText.Caption = “Mail From”
Wsk.SendData “MAIL FROM: <” & FromMail & “>” & vbCrLf
Resp = WaitResponse
准备发送数据
StatusText.Caption = “DATA”
Wsk.SendData “DATA” & vbCrLf
Resp = WaitResponse
开始发送数据
StatusText.Caption = “DATA…”
Wsk.SendData “Date: ” & Format(Date, “Ddd”) & “, ” & Format(Date, “dd Mmm YYYY”) & ” ” & Format(Time, “hh:mm:ss”) & “” & ” +0800″ + vbCrLf
Wsk.SendData “From: ” & UserName & ” <” & FromMail & “>” & vbCrLf
Wsk.SendData “To: ” & Receiver & ” <” & ToMail & “>” & vbCrLf
Wsk.SendData “Subject: ” & Subject & vbCrLf
Wsk.SendData “X-mailer: MyEmail [cn]” & vbCrLf
Wsk.SendData “Mime-Version: 1.0″ & vbCrLf
Wsk.SendData “Content-Type: text/plain; charset=” & Chr(34) & “GB2312″ & Chr(34) & vbCrLf
Wsk.SendData “Content-Transfer-Encoding: 7bit” & vbCrLf & vbCrLf
Wsk.SendData Data & vbCrLf & vbCrLf
Wsk.SendData “.” & vbCrLf
Resp = WaitResponse
4.2.2 邮件的接收
邮件的接收是在主界面上来完成的,对已经接收到的邮件显示如图4-7:

图4-7 邮件的接收窗体
邮件的接收是通过模块中的接收模块来完成的,限于篇幅完整代码参考附录。
此处仅做简单介绍如下:
Public Sub ReceiveEMail(Wsk As Winsock, StatusText As Label, ServerName, UserName, PassWrd As String)
收到的邮件数据的第一块,它包含数据头,需要解码
If MailStatus = 0 Then
ReadInfo = True
第一行 “+OK Message follows”开始的位置
LineStart = InStr(1, Str, vbCrLf) + 2
Do Until Not ReadInfo
第二行开始的位置,该行信息是
“Return-Path: ” 或”Delivered-To: hanfeng850708@yahoo.com.cn” LineEnd = InStr(LineStart, Str, vbCrLf)
第一次”:”号出现的位置,这之前的内容可能是信息行的状态字
StrStart = InStr(LineStart, Str, “:”)
If StrStart > 0 And StrStart < LineEnd Then 第一次出现”:”的位置不在该行外,可以判定它为状态字
MsgStr = Trim(Mid(Str, LineStart, StrStart – LineStart)) 取得该状态字
InfoStr = Trim(Mid(Str, StrStart + 1, LineEnd – StrStart – 1)) 取得相应的信息
MsgStr = UCase(MsgStr)
Select Case MsgStr
Case “FROM”: FAddr = InfoStr
Case “TO”: TAddr = InfoStr
Case “SUBJECT”: Subject = InfoStr
End Select
LineStart = LineEnd + 2
Else
ReadInfo = False
End If
Loop
在对邮件的接收过程中,与邮件的发送相同都有一个状态条来实时检测邮件的接收状态,截图如下所示:

图4-8 接收状态图
对该进度条的显示程序主要代码如下:
If FormSend.ProgressBar_Send.Value < 5000 Then
FormSend.ProgressBar_Send.Value= FormSend.ProgressBar_Send.Value + 1
Else
FormSend.ProgressBar_Send.Value = 0
End If
4.2.3 往来邮件收发登记
下面的叙述主要是针对邮件的管理功能,说到管理就必然要涉及到数据库的有关内容。本设计应用到了Access关系型数据库管理系统并使用ADO连接Access数据库。因此往来邮件的收发登记是通过读写数据库来实现的,具体的操作是在主界面上来完成的。
以发送邮件为例,当我们发送邮件到对方的邮件地址的时候,系统会自动的将发送的邮件保存在发件箱里,便于以后的查询。如下图所示:

图4-9 发件箱示意图
Private Sub SelectFolder(FolderIndex As Integer)是对Treeview控件使用的声明函数。当从Treeview中选择某一个目录时,该函数负责显示属于该目录下的邮件信息。以刚才的发件箱为例,调用其中有关发件夹的一个程序段,如下代码:
Case 3: ‘发件夹
ListViewMain.ColumnHeaders.Add , , “ID”, ListViewMain.Width / 9
ListViewMain.ColumnHeaders.Add , , “收件人”, 2 * ListViewMain.Width / 9
ListViewMain.ColumnHeaders.Add , , “主题”, 4 * ListViewMain.Width / 9
ListViewMain.ColumnHeaders.Add , , “日期”, 2 * ListViewMain.Width / 9
Set RSEMail = DBEmail.OpenRecordset(”select * from Mail where Status=” & STA_NEWLETTER, dbOpenDynaset, dbSeeChanges, dbOptimistic)
If RSEMail.EOF Then
RSEMail.Close
Set RSEMail = Nothing
Exit Sub
End If
RSEMail.MoveFirst
i = 1
Do Until RSEMail.EOF
If i = 1 Then
SelectMail (RSEMail.Fields(”ID”).Value)
End If
RSEMail.MoveNext
i = i + 1
Loop
RSEMail.Close
Set RSEMail = Nothing
4.2.4 往来邮件的查询
本设计要求有对往来邮件的查询,即发送和接收的邮件都可以通过调用数据库的记录来查询【11】历史信息,并将查询到的信息显示出来。
此处对查询功能做一探讨:
在VB中进行数据库记录查询操作,根据打开数据库的方式来区分大致可分为四种:SEEK查询、FILTER查询、Find查询和SQL查询。目前比较流行的是SQL查询,SQL是Structured Query Language的缩写,意思为结构化查询语言,目前绝大多数关系型数据库管理系统,都采用了SQL语言标准。
若是通过双方的名称来查询往来邮件设置查询功能,如图4-10所示:

图4-10 往来邮件查询
从图4-10可以看出,按照收发功能在右边的列表中就可以看到所有只和”258309828″联系的往来邮件。
这样以来,就可调用往来邮件查询功能,方便的从数据库中读出所需信息。
主要代码如下:
Set RSEMail = DBEmail.OpenRecordset(”select * from Mail where TAddress=’258309828′”)
If RSEMail.EOF Then
RSEMail.Close
Set RSEMail = Nothing
Exit Sub
End If
4.2.5 邮件的其他管理功能
1.帐号管理
在电子邮件的操作中,帐号的管理是必不可少的。当发件人发送一封邮件给接收地址时,必须要有自己的帐号、密码、SMTP地址和POP3地址。在该软件中,对帐号可以进行添加、编辑和删除等操作。如图4-11所示:
图4-11 帐号管理窗体

在上述的界面中当要新建一个帐号时,会弹出一个新帐号的对话框,如图4-12:

图4-12 帐号建立窗体

同样也可以对已经建立好的帐号进行编辑,如图4-13:

图4-13 帐号编辑窗体
对帐号的管理可以从VB的有关代码中调用,模块代码如下:
Public Sub LoadAccountBox()
‘当打帐号管理话框时,装载帐号列表
Dim RSAccount As Recordset
Dim i As Integer

FormAccount.ListViewAccount.ListItems.Clear
Set RSAccount = DBEmail.OpenRecordset(”select * from Account”, dbOpenDynaset, dbSeeChanges, dbOptimistic)
If Not RSAccount.EOF Then
RSAccount.MoveFirst
i = 1
Do Until RSAccount.EOF ‘遍历所有帐号
FormAccount.ListViewAccount.ListItems.Add , , RSAccount.Fields(”ID”).Value
FormAccount.ListViewAccount.ListItems(i).SubItems(1)= RSAccount.Fields(”AccountName”).Value
FormAccount.ListViewAccount.ListItems(i).SubItems(2)= RSAccount.Fields(”EMail”).Value
RSAccount.MoveNext
i = i + 1
Loop
End If
RSAccount.Close
End Sub
对帐号的操作都是通过调用上述模块代码来完成的。以编辑帐号为例,在帐号管理界面进入编辑窗口时,通过下列代码实现:
Private Sub Command2_Click()
If ListViewAccount.ListItems.Count > 0 Then
EditAccount (Val(ListViewAccount.SelectedItem.Text))
End If
End Sub
Private Sub EditAccount(AccountIndex As Integer)
‘编辑Account表中AccountIndex所指的记录
Dim RSAccount As Recordset

Set RSAccount = DBEmail.OpenRecordset(”select * from Account where ID=” & Str(AccountIndex), dbOpenDynaset, dbSeeChanges, dbOptimistic)
If RSAccount.EOF Then
MsgBox Str(AccountIndex) & “号帐号没有找到,无法编辑该帐号!!”
RSAccount.Close
Set RSAccount = Nothing
Exit Sub
Else
RSAccount.MoveFirst
FormAccountEx.Caption = “编辑帐号…”
FormAccountEx.Text1.Text = RSAccount.Fields(”AccountName”).Value
FormAccountEx.Text2.Text = RSAccount.Fields(”UserName”).Value
FormAccountEx.Text3.Text = RSAccount.Fields(”PassWord”).Value
FormAccountEx.Text4.Text = RSAccount.Fields(”PassWord”).Value
FormAccountEx.Text5.Text = RSAccount.Fields(”EMail”).Value
FormAccountEx.Text6.Text = RSAccount.Fields(”SMTPAddress”).Value
FormAccountEx.Text7.Text = RSAccount.Fields(”POPAddress”).Value

FormAccountEx.Show vbModal
If FormAccountEx.OK Then
RSAccount.Edit
RSAccount.Fields(”AccountName”).Value= FormAccountEx.Text1.Text
RSAccount.Fields(”UserName”).Value= FormAccountEx.Text2.Text
RSAccount.Fields(”PassWord”).Value = FormAccountEx.Text3.Text
RSAccount.Fields(”EMail”).Value = FormAccountEx.Text5.Text
RSAccount.Fields(”SMTPAddress”).Value=FormAccountEx.Text6.Text
RSAccount.Fields(”POPAddress”).Value=FormAccountEx.Text7.Text
RSAccount.Update
RSAccount.Close
Set RSAccount = Nothing
LoadAccountBox ‘刷新显示
Else
RSAccount.Close
Set RSAccount = Nothing
End If
End If
End Sub ‘Sub EditAccount()
Private Sub DeleteAccount(AccountIndex As Integer)
‘删除Account表中AccountIndex所指的记录
Dim RSAccount As Recordset

Set RSAccount = DBEmail.OpenRecordset(”select * from Account where ID=” & Str(AccountIndex), dbOpenDynaset, dbSeeChanges, dbOptimistic)
If RSAccount.EOF Then
MsgBox Str(AccountIndex) & “号帐号没有找到,无法删除该帐号!!”
RSAccount.Close
Set RSAccount = Nothing
Exit Sub
Else
RSAccount.MoveFirst
RSAccount.Edit
RSAccount.Delete
RSAccount.Close
Set RSAccount = Nothing
LoadAccountBox ‘刷新显示
End If
End Sub
其他操作的实现源代码与此类似,请参考附录完整代码。
2.地址薄管理
一般情况下,电子邮件客户端都应该有一个地址薄方便用户保存接收人的邮件地址而不需要每次输入,节省时间提高效率。
在该软件中,增加了对地址薄的管理功能,使用过程中的截图如图4-14所示:

图4-14 地址薄管理窗体
同样也可以对地址薄进行简单的管理。以”编辑”为例:

图4-15 地址薄编辑窗体
可以在对话框中输入姓名、邮件地址、电话、居住地和备注等信息。当需要给某人写邮件时,可直接从地址薄提取他的邮件地址。
对地址薄的管理可从模块代码中调用,如下所示:
Public Sub LoadAddressBox()
‘打开地址簿时装载地址列表
Dim RSAddress As Recordset
Dim i As Integer

FormAddress.ListViewAddress.ListItems.Clear
Set RSAddress = DBEmail.OpenRecordset(”select * from Address”, dbOpenDynaset, dbSeeChanges, dbOptimistic)
If Not RSAddress.EOF Then
RSAddress.MoveFirst
i = 1
Do Until RSAddress.EOF
FormAddress.ListViewAddress.ListItems.Add , , RSAddress.Fields(”ID”).Value
FormAddress.ListViewAddress.ListItems(i).SubItems(1)= RSAddress.Fields(”Name”).Value
FormAddress.ListViewAddress.ListItems(i).SubItems(2)= RSAddress.Fields(”EMail”).Value
RSAddress.MoveNext
i = i + 1
Loop
End If
RSAddress.Close
End Sub
以编辑地址为例,当要对地址薄中的某一个地址进行编辑时,调用上述的模块代码并附以”编辑”的程序源代码即可完成该操作。如下:
Private Sub EditAddress(AddressIndex As Integer)
‘编辑Address表中AddresstIndex所指的记录
Dim RSAddress As Recordset

Set RSAddress = DBEmail.OpenRecordset(”select * from Address where ID=” & Str(AddressIndex), dbOpenDynaset, dbSeeChanges, dbOptimistic)
If RSAddress.EOF Then
MsgBox Str(AddressIndex) & “号信息没有找到,无法编辑该信息!!”
RSAddress.Close
Set RSAddress = Nothing
Exit Sub
Else
RSAddress.MoveFirst
FormAddressEx.Caption = “编辑地址…”
FormAddressEx.Text1.Text = RSAddress.Fields(”Name”).Value
FormAddressEx.Text2.Text = RSAddress.Fields(”EMail”).Value
FormAddressEx.Text3.Text = RSAddress.Fields(”Phone”).Value
FormAddressEx.Text4.Text = RSAddress.Fields(”BP”).Value
FormAddressEx.Text5.Text = RSAddress.Fields(”Address”).Value
FormAddressEx.Text6.Text = RSAddress.Fields(”Memo”).Value

FormAddressEx.TabStrip1.Tabs(1).Selected = True
FormAddressEx.Show vbModal
If FormAddressEx.OK Then
RSAddress.Edit
RSAddress.Fields(”Name”).Value = FormAddressEx.Text1.Text
RSAddress.Fields(”EMail”).Value = FormAddressEx.Text2.Text
RSAddress.Fields(”Phone”).Value = FormAddressEx.Text3.Text
RSAddress.Fields(”BP”).Value = FormAddressEx.Text4.Text
RSAddress.Fields(”Address”).Value = FormAddressEx.Text5.Text
RSAddress.Fields(”Memo”).Value = FormAddressEx.Text6.Text
RSAddress.Update
RSAddress.Close
Set RSAddress = Nothing
LoadAddressBox ‘刷新显示
Else
RSAddress.Close
Set RSAddress = Nothing
End If
End If
End Sub
本节主要对该客户端软件的功能和实现方法做了较为详细的介绍,从介绍中使读者对该软件的功能有了一个全面的了解。限于篇幅的原因,对实现功能的源代码只给出了主要的部分并不能直接运行,完整的源代码请参照附录。
4.3 软件的调试和改进
程序在写代码过程中产生的一些问题,在后期软件的调试过程中得到了一定的解决和改进。主要包括以下几个方面:
1.编译错误
主要是在代码的编写过程中,由于输入的大意造成的。幸好没有逻辑上的错误,对这种错误在编译的过程中经过细心的纠正一般都能得到解决。当一个模块或功能编写完成后就应该进行纠正,以免错误的积累增加了问题的复杂性。
2.邮件的乱码
在邮件的收发过程中会出现乱码【12】,主要有两方面原因:
(1)传输机制不同,由于INTERNET的某些邮件服务器不支持8位(非ASCII格式)传输造成的。具体来说,在直接发送中文双字节或二进制等非ASCII码格式(如中文双字节、图片文件.JPG、可执行文件.EXE、压缩文件.ZIP等二进制文件)时,由于主机无法处理,便把信件中的每一字符的第八位都截去,造成邮件失真或损坏,接收到的邮件便是一堆乱码。此种乱码不可恢复,只能重发。
一般的解决方法是在发送8位格式的文体文件时,必须事先进行编码,将文件转换成7位ASCII码或更少位数的邮件之后,再发送出去,收件人在收到邮件后,利用专用的解码软件如WINZIP7.0、XFERPRO2.0等进行解码,这样,便可阅读了。
(2)邮件编码不同,由于各种电子邮件软件的默认配置不同,收件和发件人自己的选项也各不相同,所以在收编码的信件后,系统不能自动识别编码方法,系统不能自动解码,这样当你查看信件的内容时,就会出现所谓的乱码,使收件人无法阅读该文件。
对于编码不同造成的乱码的解决方法是,应首先试一试转换编码的方法。因为这种编码大多出现在中文邮件上。因此,当乱码出现时首先应当检查编码方式是否正确,如果不行就要转换成其他编码试试,通常问题都能得到解决。
第五章 总结与展望
5.1 本文工作总结
本文以全面、系统的角度对电子邮件的原理和邮件客户端功能的设计做了比较详细的论述和说明。本文不仅完成了对课题所要求的收发功能的设计和介绍,而且对邮件的管理功能做了一定的扩展并做了较为细致的介绍。
从设计的角度来看,该客户端软件的界面简洁大方容易操作,对邮件的管理功能上有显著的特点,但对邮件的安全性和垃圾邮件的过滤问题上可能存在一些忽略,希望在以后的时间里能这两个方面做进一步的探讨。
至此本文的工作即将结束,那么电子邮件今后的发展将会如何,都有那些新的特点呢?下一节将主要讲述这个问题。

5.2 课题研究展望
目前本设计的工作只是完成了一部分,对邮件附件的发送和接收以及目前比较流行的语音邮件和视频邮件的收发还没有做详细的研究,希望今后能对此做一些探讨。
本软件也没有过多的涉及到对垃圾邮件和邮件安全性方面的讨论,而这个话题一直都是电子邮件领域的热点和焦点,如何能最大限度的防范垃圾邮件和阻止不法分子对邮件的恶意攻击是以后很长一段时间要探讨的话题,如果该课题在以后能对上述两个问题得到一定的解决,将会使该邮件客户端软件有一个质的飞跃和提高。
参考文献
[1] 林冬梅. 计算机应用基础[M]. 北京:清华大学出版社 2006
[2] 张曾科. 计算机网络[M]. 北京:清华大学出版社 2005
[3] 吴功宜. Internet基础[M] 北京:清华大学出版社 2006
[4] 李恒舟.电子邮件原理[EB/OL]
http://www.5dmail.net/html/2004-2-3/200423200710.htm, 2004-2-3
[5] K Johnson. Internet Email协议开发指南[J] 北京: 机械工业出版社2000
[6] Inc. Javvin Network protocols handbook[M]北京:清华大学出版社2005
[7] David Wood. Programming Internet Email[M] US 1999
[8] 王兴晶. Visual Basic 软件项目开发实例[M] 北京:电子工业出版社 2004
[9] 王栋.Visual Basic程序设计实用教程[M] 北京:清华大学出版社 2000
[10]明日科技.Visual Basic程序开发范例宝典[M] 北京:人民邮电出版社 2006
[11]Microsoft.Microsoft Visual Basic 6.0 Contrlos Reference[M] USA 1999
[12]王景义.中文Visual Basic实例全解教程[M] 海口:南方出版社 2003
[13]佚名. 邮件乱码知多少[EB/OL]
http://www.chinaengine.cn/wangluo/ShowArticle.asp?ArticleID=8420 2006

附录

完整源代码单独成册,请参阅附录!


相关日志

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>