最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

基于Java Mail的电子邮件收发系统毕业设计

来源:动视网 责编:小OO 时间:2025-10-01 20:58:35
文档

基于Java Mail的电子邮件收发系统毕业设计

第4章详细设计…………………………………………………………………………………..15附件1:开题报告附件2:译文及原文影印件第1章概述随着信息时代的到来,Internet的广泛应用,相信大家对qq邮箱,163邮箱,yahoo邮箱已经并不陌生,这一类邮箱的出现是计算机和网络不断发展的结果,与每个人都密不可分,已经成为网络中最广泛使用的一部分。1.1研究目的和意义从人类发展开始,信息交换一直都是人类的基本需求之一。人们会通过各种途径来实现信息的交换,从而达到一种交流。从以前的快马送信和口耳相传到如
推荐度:
导读第4章详细设计…………………………………………………………………………………..15附件1:开题报告附件2:译文及原文影印件第1章概述随着信息时代的到来,Internet的广泛应用,相信大家对qq邮箱,163邮箱,yahoo邮箱已经并不陌生,这一类邮箱的出现是计算机和网络不断发展的结果,与每个人都密不可分,已经成为网络中最广泛使用的一部分。1.1研究目的和意义从人类发展开始,信息交换一直都是人类的基本需求之一。人们会通过各种途径来实现信息的交换,从而达到一种交流。从以前的快马送信和口耳相传到如
 第4章 详细设计  …………………………………………………………………………………..15

附件1:开题报告

附件2: 译文及原文影印件

第1章 概述

    随着信息时代的到来,Internet的广泛应用,相信大家对qq邮箱,163邮箱,yahoo邮箱已经并不陌生,这一类邮箱的出现是计算机和网络不断发展的结果,与每个人都密不可分,已经成为网络中最广泛使用的一部分。

1.1研究目的和意义

从人类发展开始,信息交换一直都是人类的基本需求之一。人们会通过各种途径来实现信息的交换,从而达到一种交流。从以前的快马送信和口耳相传到如今的电话电脑和邮政系统,随着先进技术的不断进步,人类信息交流的方式也一直在进步,其中电子邮件服务就是计算机和网络技术出现之后的一个例子。它较以前更加方便快捷,深受人们的喜爱。

电子邮件又被称为电子邮箱,是一种典型的通过先进技术的电子手段提供信息交换的一种通信方式,同时也是Internet的所有应用中最广泛的服务。电子邮件不是只局限于信件的传递了,而是另外还包括文件,声音及图形图像等信息的传递。这种非交互式的通信方式,加速了数据传送从而更快的达到信息的交流,促进了社会的发展。她是一种简单且快速的方法,电子邮件系统通过连上全世界的网络,用户就可以免费地并且非常快的(几秒钟之内)可以将信息发送到世界上任何你指定的目的地。同时,用户也可以从电子邮件系统中得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。这是任何传统的方式也无法相比的。

     电子邮件最显著地特点是“存贮转发式”服务,并不是一种“终端到终端"的服务,利用这种存贮转发可以进行异步通信,即信件发送人可以在任何时间任何地点发送文件,这并不要求接收者必须同时在场,即使是对方不在,发送者的邮件还是可以立刻送到对方的信箱内,并进行了存储,这样接收者可以在他方便时登录邮箱来收取邮件,来查看邮件内容,这不必受到时间空间的。这种存贮转发服务也正是电子邮箱系统的核心。

  随着上网用户越来越多,上网速度越来越快,作为网络基础应用的电子邮件系统所面临的问题也日益突出,不管是使用免费的邮箱yahoo.com.cn,还是163.com等,还是使用收费的个人邮箱,ISP提供的虚拟机邮箱都存在着种种问题。介于当下流行的各大邮件客户端软件的除了最主要的收发信件之外,功能越来越复杂,但是我们的日常生活中真正用到的功能却很少,同时作为中小型企业,邮箱的成本也越来越高,很多功能尤其对于计算机知识相对缺乏的人来说,显得太过华丽且不太实用。有鉴于此,在了解smtp和pop3等底层协议的基础之上,开发了这个各种功能相对简单实用的邮件系统,简化了用户的操作。

1.2国内外发展趋势和现状

 电子邮件是互联网最基本且最重要的服务之一。据统计,目前全世界的电子邮件账号超过15亿个,电子邮件成为Internet上所占比例最大的应用。中国互联网络信息中心关于中国互联网发展状况统计报告(2005年1月)表明,我国目前上网人数9400万,人均拥有电子邮箱1.5个。还有另一项数据表明,互联网上百分之三十的业务量都是电子邮件,由于我国通信设施较差,以及网络速度慢等弊端,快捷的电子邮件服务更具实用性。《CINNIC中国互联网络发展状况统计报告》中指出,中国用户最常使用的网络服务71.65%是电子邮件,而搜索引擎和上传或下载服务分别只占50.40%和44.16%。

早期的电子邮件系统在网络形成的时候就已经出现了,1961年的时候,麻省理工学院在7094大型机系统上开发出了一套兼容时分共享系统(CTSS)。这也允许许多用户使用主机的新能力,使用户可以用新的方法来共享信息。当CTSS系统的用户需要向其他用户传递信息时,他们会在一个通用的目录下以“TO TOM”之类的文件名简历一个文件,查看或者打印其中的内容,在这种简单的信息发送方法的基础上,出现了第一个“邮件”工具,通过这个工具,CTSS系统的管理员可以向用户发送信息。例如某个用户他丢失的文件已经通过备份找回,这是通过在目录用户中创建特定的文件来实现的。

   这以后,CTSS系统上也出现了用于用户之间信息传递的邮件工具。在其他的多用户系统上,也陆续开发和使用了类似的邮件软件。这些软件的工作原理类似,都是在用户目录下设置一个特殊的目录,一个用户给另一个用户发信时,就在收信者的牡蛎下建立一个新的文件,并在其中保存新建的内容。 当收信者稍后登陆的主机上时,检查该目录就可以知道自己有新的邮件,并可以打开和查看邮件内容,这些早期的邮件系统虽然非常简陋,也存在很多问题,但是其基本思想都是通过文件的传递来实现用户之间的异步传输,和今天所用的电子邮件系统基本相同。现代电子邮件系统正式在这些原始的邮件软件基础上发展而来的。

   到了20世纪60年代末70年代初,在美国国防部领导下,现代INTERNET 的前身—ARPANET 开始建立和运行,它将成员单位的多台主机连接起来组成了一个网络。当时,网络内的大部分主机上都已经有了内部的邮件系统,于是一个很自然的想法出现了,就是能否利用ARPANET使这些邮件系统能够相互通信。事实上,邮件系统的互联正式ARPANETA最早期的网络应用尝试之一。

   1969年,在ARPANET原型网还在试验的时候,拉里罗伯特编写了第一个通过网络发送电子邮件的程序。

   1971年1月,ARPA RFC 196《邮箱协议(Mail Box Protocol)》中讨论了如何通过ARPANET 发送邮件的问题。之后有多个类似的RFC文件进行了这个方面的探讨。

   由于当时FTP协议已经比较成熟,而邮件发送一直没有成熟的协议,所以一些人开始研究利用FTP协议来发送邮件的方法。1972年8月,在RCF385《关于FTP协议的注释》中第一次提出通过扩展FTP协议的方法来发送电子邮件。之后的一些RFC文件进一步对该方案进行了改进。在1973年一次会议上,大家统一在FTP命令中使用“用户名@主机名”形式的地址来标明邮件地址,这被写入了RFC469文件。RFC498则提出了不用FTP协议进行邮件传输的方法。这些方案由于各种原因都未能得到推广使用,ARPANET上的邮件系统一直处于各自为政的状态。

    除了邮件收发的问题外,邮件格式也是电子邮件协议中的一个重要内容。1977年,洛克等人提出来一个统一的邮件格式标准,也就是后来的RFC733.但是这次统一邮件格式标准的尝试并未能获得成功。这便是早起ARPNET上的电子邮件系统。

    早起的各种基于网络的电子邮件传输协议都存在这样那样的问题。要么功能不完善,要么过于复杂。人们需要的是一个全新的,易于实现而有功能强大的电子邮件传输协议。1980年,RFC772《邮件传输协议》发布了,其中描述了一个全新的邮件传输协议。但是这个协议还是过于复杂了,于是人们在它的基础上又进行了改进,纵欲在1981年的RFC780中发布了简单邮件传输协议,经过一些晓得改进后,最总形成了RFC821《SMTP协议》,这也正是今天的电子邮件系统的标准传输协议。

    统一的邮件传输协议自然需要统一的邮件格式,1982年,克鲁克在RFC733的基础上编写RFC822《APRAInternet文本信息格式标准》,他也最终成为电子邮件的标准格式。但是在RFC822格式中,邮件都是文本格式的,没有考虑非文本的邮件内容问题。很快人们就对电子邮件提出更多的要求,希望能用它来发送非文本格式的附件,如图片,多媒体文件等。于是在1996年又发布了RFC2045—2049,规定了MIME编码格式。通过这种格式,可以实现各种文件和文本信息之间的无损转换,这样就可以将他们封装在标准RFC822格式的文本邮件中直接发送,从而使电子邮件系统也可以发送非文本的信息了。

    后来,人们根据邮件系统中使用的问题,又陆续对SMTP协议以及其父树协议进行了一些小的修改,如增加用户身份认证功能等。到目前为止,SMTP协议的最新版本是RFC2821,邮件格式规范的最新版本是RFC2822。这便是现代电子邮件系统的出现。

    从以上分析中可以得出这样的结论,由于在电子邮件系统存在的种种缺陷,我们要学会重新设计出一种全新的,每个地方都考虑到并彻底解决各种安全问题和隐患的电子邮件系统,用它来代替现有的电子邮件系统给人们提供更高一层的服务。但遗憾的是,由于各种现实的问题,(如环境,技术,资金等)使其在可预见的未来,仍然是一个不可能实现的任务,但是无论如何,一个已经成功的或者试图成功的电子邮件系统,必须要能够较好的解决这些问题[2]。

1.3 系统特点

   邮件服务器提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收邮件服务器)。发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器;接收邮件服务器使用接收邮件协议,常用的是POP3协议,所以通常接收邮件服务器也称为POP3服务器。

     SMTP(Simple Mail Transfer Protocol),即简单的邮件传送协议,是互联网传送电子邮件的基本协议,是TCP/IP协议组的成员,它可以解决邮件系统如何通过一条链路,把邮件从一台机器上传送到另一台机器上的问题,它的特点是具有很好的可伸缩性和简单性,因此它在广域网和局域网都能适用,并且在Internet上能够发送邮件的服务器几乎都支持SMTP协议,这也正是它成功的关键。服务器接收客户端发过来的SMTP协议格式的命令,这些命令有HELO ,MAIL FROM,RCPT TO,DATA,QUIT,服务器接到这些命令后,给出对应的响应码,然后发给客户端。

     POP3(Post Office Protocol 3)是邮局协议的第3个版本,它规定邮件客户端怎么从服务器那里接收邮件,是第一个电子邮件的离线协议标准。它既允许接收服务器向邮件用户发送邮件,也可以接收来自SMTP服务器的邮件,邮件客户端软件会与POP3服务器之间进行交互,下载由POP3服务器接收到的邮件,POP3协议支持用户从服务器上接收邮件然后存储到自己的计算机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,服务器接收客户端发过来的POP3协议格式的命令,这些命令有USER,PASS,LIST,RETR,DELE,REST,QUIT,服务器接到这些命令后,给出对应的响应信息+OK或者-ERR,然后连同邮件信息发给客户端。基于POP3协议的邮件系统能提供快捷,实惠的服务,因此深受广大用户的青睐。POP3协议也是TCP/IP协议族中的一员,由RFC 1939 定义。

第2章 相关技术和工具简介

2.1 .Swing简介

     Swing是一个专门用于开发Java用户界面程序的工具包。它是在抽象窗口工具包(AWT)的基础上让跨平台JAVA程序能够使用所有可插拔的界面风格,Swing程序员只需要用简单的代码就能够利用Swing模块化的,丰富的功能和灵活的组件来编出漂亮的系统界面。工具包中的包都以swing来命名的,例如javax.swing.event。

  Swing开发包全部是用Java来实现的,Swing本身不依赖于操作系统,也没有除JAVA之外的其它代码,是一个轻量级的组件,这就是他和AWT的却别。因为AWT是通过与具体操作系统相关的对等类来实现的,所以Swing要比AWT具有更加强的实用性。Swing在所有平台上的表现都是一致的,并且能表现出除当前系统之外的其它界面风格。Swing效仿了MVC的设计模式,即"模型-视图-控制",其中模型是专门用来存放内容的,视图是专门用来查看内容的,控制器是用来负责用户输入的。在AWT中,由于控制界面外观的对等类和具体的平台息息相关,因而AWT组件的外观只和本机的外观相关,但是Swing能使程序在一个操作系统上运行的时候有不同的外观以供用户可以选择自己习惯的外观。

2.2 Java Mail简介

Java Mail是由Sun提供的API,但是它没有被放在JAVA标准的基本开发包中,表明你在开发JAVA MAIL系统时需要另外下载JAVAMAIL包。另外,你还得下载Sun公司的JAF包,JAF非常复杂,JAVAMAIL的运行需要JAF的支持。

Java Mail包是可选的,因此如果需要使用的话你需要首先从java.sun.com下载。目前最新版本是JavaMail1.4,使用JavaMail的时候需要下载JAF,安装Java Mail只是需要把他们加入到CLASSPATH中去,如果你不想修改CLASSPATH的话,可以直接把他们的jar包copy到JAVA_HOME/lib/ext下,这样Java Mail就安装好了[5]。Java Mail包中用于处理电子邮件的核心类是:Session,Message,Address,Authenticator,Transport,Store,Folder等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。另外很好的实现了Java Mail API的框架有James、Spring Mail。

2.3 Java平台简介

Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么,Java平台更分细一点的话主要是由一个compiler(编译器),一个运行环境(runtime environment),和一个核心的API组成。Java应用编程接口为Java应用提供了一个于操作系统的标准接口,可分为基本部分和扩展部分,在安装了Java运行平台后,Java程序就能够被运行了。Java API为分为基本部分与扩展部分,Java应用提供了一个于操作系统的标准接口。因此Java程序只需要编译一次,就可以在所有系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的JDK版本是1.6,最新版本为1.7。与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术,全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容,“Java 语言靠群体的力量而非公司的力量”为Sun公司的一个口号,并得到了大多数软件开发公司的认同,这和微软公司的模式不同,微软提倡的是注重精英和封闭的模式, Java 程序设计语言是个面向对象的,简单的、解释性的、分布式的、安全的、健壮与系统无关、高性能、可移植、动态和多线程的语言。

Java 平台是基于 Java 语言的平台,这样的平台非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言,Java是一个可以在不同操作系统(例如windows, unix等)上运行的编程语言,java平台是指运行在各种终端(如pc、服务器、移动设备、嵌入式设备)的系统软件,PC机上的java程序是用java SE开发出来的,服务器端的java程序是用javaEE开发出来的,移动设备的java程序是用java ME开发出来的。

2.4 Eclipse简介

Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。   

虽然大多数用户很乐于将Eclipse当作Java集成开发环境(IDE)来使用,但Eclipse 的目标却不仅限于此。Eclipse还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。

这种平等和一致性并不仅限于Java开发工具。尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言;例如,支持诸如C/C++和COBOL等编程语言的插件已经可用,或预计将会推出。Eclipse框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。

基于Eclipse的应用程序的一个突出例子是IBM® Rational® Software Architect,它构成了IBM Java开发工具系列的基础。

至于Eclipse的安装首先要创建一个java的工作环境,在sun的网站上下载j2se,安装到自己的系统中,我下载的是1.4版本,安装目录为“D:\\j2sdk1.4.2_04”。

下载地址为:http://java.sun.com/j2se/1.4.2/download.html

设置环境参数的步骤如下:

   右键“我的电脑”-“属性”-“高级”-“环境变量”增加:

   java_home=D:\\j2sdk1.4.2_04\

   ClassPath=d:\\j2sdk1.4.2_04\\;d:\\j2sdk1.4.2_04\\lib\ools.jar;d:\\j2sdk1.4.       2_04\\lib\\dt.jar;d:\\j2sdk1.4.2_04\\bin

   Path=d:\\j2sdk1.4.2_04\\bin\环境就设置好了。

第3 章  系统需求分析和总体设计

3.1用户对电子邮件系统需求 

    (1)  方便性。电子邮件系统可以像离线QQ信息一样,在自己有时间的时候可以处理记录下来的请求,通过电子邮件可以方便快捷地传送文本信息、图像文件、报表和计算机程序等信息。

    (2)  快捷性。电子邮件在传递过程中,若某个通信站点发现用户给出的收信人的电子邮件地址有错误而无法继续传递时,电子邮件会迅速地将原信件逐站退回,并告知其原因。当邮件被送到目的地后,该计算机的邮件系统就立即将它放人收件人的信箱中,等候用户自行读取。用户只要随时以计算机联机方式打开自己的电子邮件信箱,便可以查看自己的邮件。

     (3) 广域性。电子邮件系统具有开放性,许多没有连接到互联网的用户能够通过本机的网关(Gateway)和网络上的用户相互交换邮件。

    (4) 透明性。电子邮件系统采用“存储转发”的方法帮助用户传送电子邮件,通过在互联网络的一些通信节点计算机上运行相应的软件,使这些计算机充当“邮局”的角色。当用户希望通过互联网络给别人发送邮件时,首先要与为自己提供电子邮件的计算机联机,然后把要发送的邮件和收件人的邮件地址发给邮件系统。电子邮件系统就会把用户的邮件通过网络一站一站地送到目的地,所有过程对于用户来说都是透明的。

    (5) 廉价性。网络的空间可以说是无限大的,公司能够将不同的产品以及服务信息放置在网络上,这样用户就能够随时从网络上获取这些信息,并且相对于电话,邮寄或印刷来说在网上存储与发送信息是非常廉价的。在公司与顾客“一对一”关系的电子邮件服务中,费用低廉,从而节约大量费用。

    (6) 全天性。对顾客而言,电子邮件的优点之一是没有任何时间上的。一天24小时,一年365天内,任何时间都可发送电子邮件。比如,当顾客发生问题时,他们随时都可以把发生的问题发送给公司,而公司有关负责人可以在他方便的时候,查阅这些信件,决定哪些信件必须首先处理,哪些可以稍后处理,哪些应该转发给其他部门去承办。而以前没有电子邮件时,顾客的产品本身或产品在使用过程中发生了问题,需要等到公司人员上班时,才能给公司打电话。而且什么时候打电话也很讲究,打早了,公司负责人还没有上班,打晚了公司负责人又可能出去开会了。电子邮件的全天候服务,从根本上解决了这种状况,大大改善了公司与顾客的关系,改善了公司对顾客的服务。

3.2产品可行性分析

    电子邮件系统包括电子邮件客户端和电子邮件服务器端,其中通过SMTP协议进行发送邮件,POP3协议进行接收邮件。电子邮件系统的工作过程和相关收发协议如下图:

  图3.1电子邮件系统工作过程图

     Java Mail是Sun发布的用来处理E-mail的API。它可以方便的执行一些常用的邮件传输。Java Mail API是Java对电子邮件处理的延伸,它可以处理各种E-mail格式,包括IMAP,POP3,SMTP,为Java应用程序提供了收发电子邮件的公共接口,如下图所示:

  图3.2JavaMail API的客户端工作原理图

   JavaMail API主要位于javax.mail.internet中,主要类框架图如下:

 

                              图3.3  JavaMail API中主要类的框架图

    1.java x.mail.Session:Session类代表JavaMail中的一次邮件会话.每个基于JavaMail的应用程序至少有一次会话,也可以产生多次会话.发送邮件之前,通常应该建立邮件会话。

    它的作用有:

          (1)接收各种配置属性信息:通过Properties对象设置的属性信息;

          (2)初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境以便通过Session对象创建其他重要类的实例。

    2.javax.mail.Transport:邮件操作只有发送或接收两种处理方式,JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。

    3.java.mail.Store 该类实际特定邮件协议上的读,写,监视,查找等操作,通过javax.mail.Store类可以访问javax.mail.Folder类.

    4.javax.mail.MimeMessage该对象是实际发送的电子邮件的信息.邮件对象通常使用MimeMessage创建,创建该对象时应传入一个邮件会话参数.该类采用InternetHeaders类来解析和保存e-mail的顶级RFC 822文件头[9].该类包含如下属性:

           Protected byte[] content 该e-mail内容的字节数组

           protected internetHeaders headers 返回保存该e-mail的文件头的对象

           void addFrom(Address[] addresses 为该e-mail设置发件人的地址

          void addHeader(String name ,String value) 在name的文件头内容上增加value;

          void addRecipients(Message.RecipientType type, Address[] addresses)该方法还 有一个重载的方法,都是增加指定类型的收件地址.

          Address[] getFrom返回该e-mail的发件人的地址列表

          void setContent(Multipart mp) 为该e-mail设置内容

    5.javax.mail.Address 该对象用于确定发件人/收件人地址..和Message一样,Address是个抽象类,时间使用的是他的子类,javax.mail.internetAddress类.  一旦您创建了Session 和Message,并将内容填入消息后,就可以用Address 确定信件地址了

    6.javax.mail.Folder:Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。

3.3系统总体设计

   3.3.1 电子邮件系统所包含的功能

 图3.4  系统功能图

   本系统主要包括:

               (1)登录系统:用某个邮箱的账号和密码登录; 

               (2)接收邮件:从指定邮箱服务器获取邮件; 

           (3)发送邮件:用此账号发送邮件到指定的电子邮箱地址,包括发送普通  文本和附件; 

           (4)群发邮件: 将邮件群发给指定邮件地址列表,包括抄送等;

           (5)邮件管理:查看邮件,删除邮件;

           (6)系统配置:配置邮箱服务器的smtp地址和pop3地址;

3.3.2电子邮件收发过程

图3.5电子邮件收发过程图

 电子邮件服务基于客户/服务器模式,其工作过程如下:邮件客户端和邮件服务器通过POP3协议收取邮件;通过SMTP传输邮件内容,实现邮件信息交换。SMTP通过用户代理(UA)和邮件传输代理程序(MTA)实现邮件的传输。

   发送方编辑完毕的电子邮件发送给当地的邮件服务器,邮件服务器收到客户送来的邮件,根据收件人的邮件地址发送到对方的邮件服务器中。对方的邮件服务器接收到其他邮件服务器发来的邮件,并根据邮件地址分发到相应的电子邮箱中,这样接受方可通过电子邮箱来读取邮件,并对他们进行相关的处理。

     电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet上的电子邮件。

  3.3.3 服务器的设置

     用户在发送和接收邮件的时候,需要设置好邮件服务器的地址、邮箱账号和密码等这些信息。该系统提供了对上述配置的设置和存储功能,这里,我们将配置信息存储在一个属性文件里面。其文件名为config.properties,位于工程的根目录下,可使用java.uitl。properties 类的setProperty()方法和getProperty()方法对属性文件中的属性内容进行存取。本系统smtp pop3.properties文件的内容格式如下 :

    popAddress=pop3服务器地址(如pop3.qq.com.cn)

    smtpAddress=smtp服务器地址(如smtp.qq.com.cn)

    username=用户名(如x y z)

    password=密码(如123456)

                   

第4章 详细设计

4.1 登录功能的设计

  (1)选择登录服务器,连接服务器。

  (2)选择指定的邮件地址和密码。在本系统中有所提供的Mail服务器创建了账户进行登录。必须选用正确的邮件地址和密码才可以登录,在该模块中,用户输入账户和密码,程序会根据用户输入的用户名和密码在用户信息数表中查找,如果查找成功,就进入系统主界面,如果查找失败,就会报错。

  登录的设计主要有下图的几个步骤。

     

图4.1登录流程图

4.2发送邮件的设计

   (1)编写文本邮件。该内容是电子邮件系统中最基本的功能。用户需填写邮件信息:包括收件人,主题,文字内容。

   (2)上传附件。在编写邮件时,邮件内容可以和附件(如图片,声音等)一起发送,这样就需要先将附件上传到服务器,然后再发送给对方。 

    发送邮件的设计如下图所示:

                             图4.2发送邮件流程图

4.3接收邮件的设计

    (1)接收邮件。包括发件人,发件时间。这是一个电子邮件系统最基本的功能。

(2)浏览到邮件列表,也可看到邮件主题,是按时间先后排序。

     接收邮件的设计如下图所示:

 

 

      图4.3接收邮件流程图

4.4邮件管理的设计

     (1)查看邮件内容。包括发邮件的时间,邮件的内容和主题,以及发件人,以达到信息传递

     (2)删除邮件。要删除邮件,只需先选择某邮件,再单击删除命令就可以删除邮件。此外还可以批量删除邮件,这也只需要多个选择邮件,再单击删除就能实现。

      邮件管理的设计如下图所示:

图4.4邮件管理图

第5章  系统功能的编码实现

5.1用户登录界面的实现

    用户选择对应的邮件服务器 然后输入账号密码登录,邮件服务器的配置会保存到配置文件中。例如 选择的是@qq.com 则SMTP地址为:smtp.qq.com,POP3地址为:pop.qq.com。

       5.1 登录界面图

  部分实现的核心代码:

      private boolean saveConfig() {

        String server = (String) typeBox.getSelectedItem();

        ConfigBean configBean = new ConfigBean();

        configBean.setUserName(userNameText.getText() + server);

        configBean.setPassWord(passWordText.getText());

        configBean.setType(server);

        if (server.equals("@qq.com")) {

            configBean.setSmtpAddress("smtp.qq.com");

            configBean.setPopAddress("pop.qq.com");

        } else if (server.equals("@163.com")) {

            configBean.setSmtpAddress("smtp.163.com");

            configBean.setPopAddress("pop.163.com");

        } else {

            configBean.setUserName(userNameText.getText() + "@yahoo.cn");

            configBean.setSmtpAddress("smtp.yahoo.com.cn");

            configBean.setPopAddress("pop.yahoo.com.cn");

        }

        ReturnType type = PropertiesUtility.saveConfig(configBean);

        if (type == ReturnType.RIGHT) {

            return true;

        }

        return false;

    }

5.2主界面的实现

    当用户登录后,会进入到该界面,可以选择需要的服务(发邮件,收邮件,服务器配置(Config)),点击左边的相应邮件功能按钮,右边会显示相应的邮件界面。

图5.2主界面图

   部分实现的核心代码:

      public void setLayout() {

        try {

            loadImage();

            container = this.getContentPane();

            container.setLayout(null);

            container.setBackground(new Color(168, 193, 227));

            this.setIconImage(titleImage);

            setLeftPanel();

            setSendPanel();

            container.add(controlPanel);

        } catch (Exception e) {

            System.out.println(e.getMessage());

        }

     }

5.3 邮件配置界面的实现

    点击主界面上方的config按钮会弹出改配置框,通过该界面可以查看以及修改账户和服务器地址

    

图5.3邮件配置界面图

    部分实现代码:

      private void addUserName() {

          userNameLabel = new JLabel("UserName:");

          userNameLabel.setFont(new Font("黑体", Font.BOLD, 14));

          userNameLabel.setBounds(14, 25, 72, 15);

          container.add(userNameLabel);

          userNameText = new JTextField();

         userNameText.setBounds(92, 20, 180, 25);

         container.add(userNameText);

     }

5.4 发送邮件界面的实现

填好收件人地址,主题,内容,抄送或添加附件,点击发送按钮,即会发送相应的内容到对方邮箱。点击重置按钮所有内容会清空。

图5.4发送邮件界面图

  部分实现的代码:

   public void addButton() {

          send = new JButton("发   送");

          send.setBounds(80, 425, 100, 30);

          sendPanel.add(send);

          send.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                boolean temp = check_Text();

                if (temp) {

                    send_Event();

                 }

              }

          });

        JButton reset = new JButton("重  置");

        reset.setBounds(300, 425, 100, 30);

        sendPanel.add(reset);

        reset.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                reset_Event();

            }

        });

    }

5.5 接收邮件界面的实现

     点击收取邮件按钮 就可收取该账户的邮件,并按先后时间显示邮件列表。

    

图5.5接收邮件的界面图

  部分实现的代码:

    public void initTable() {

        defaultTable = new MyTableModel();

        addColumnName(defaultTable);

        table = new JTable(defaultTable);

        setTableAttr();

        JScrollPane scrollPane = new JScrollPane(table);

        scrollPane.setBounds(5, 25, 475, 400);

        receivePanel.add(scrollPane);

        defaultTable.addTableModelListener(new TableModelListener() {

            @Override

            public void tableChanged(TableModelEvent e) {

            }

        });

        table.addMouseListener(new MouseAdapter() {

            @Override

            public void mouseClicked(MouseEvent e) {

                mouse_Event(e);

            }

        });

    }

第6章  系统实现的功能测试

   6.1 登录邮箱测试

 

 图6.1登录邮箱测试

     选择好服务器,然后输入对应的账号和密码 然后点击登录,则登录邮箱成功

然后会进入到如上图所示的主界面

6.2发送邮件测试

    包括发送文字和附件,以及抄送测试。抄送就是你写的这封邮件能同时发给多个人,并且收件人知道你把这封邮件同时发给了他和抄送栏里写的邮件地址的人。

图6.2.1发送文字邮件测试图

图6.2.2发送附件测试图

图6.2.3抄送功能测试图

6.3接收邮件测试

    点击收取邮件,就能达到邮件的收取。

图6.3接收邮件测试图

6.4查看邮件内容测试

    双击要查看的邮件后会显示出邮件内容

图6.4查看邮件内容测试图

6.5删除邮件测试

    先选择单个要删除的邮件,也可同时选择多个要删除的邮件,点击删除标记按钮,就能删除邮件,并由相关提示,提醒删除邮件成功,显示出邮件删除后的最新列表。

 

 图6.5.1 删除单个邮件测试图

图6.5.2删除多个邮件测试图

  下图是删除邮件成功的提醒

图6.5.2 删除邮件成功提醒图

图6.5.3 邮件删除后的新列表图

第7章 总结

在本次毕业设计开发过程中,我遇到了许许多多的困难,系统虽然基本完成,但是也仍存在一些不足,在这里只是简要叙述一些主要的困难和不足之处。

在开发邮件系统的过程中,中文乱码也是一个比较棘手的问题,因为乱码可能会在邮件的标题,附件以及正文等诸多地方出现,但是没有某一种方法能够解决全部的乱码问题,因而解决乱码问题也是系统开发的重点难点之一。经过一番上网查找和请教老师,终于找出导致乱码可能出现的原因,通过网上和老师给予的拟采用的解决途径,终于使乱码问题得到解决。此外,在邮件系统的开发中如何处理各种类型的信息成为了开发过程中的又一个重点与难点,事实上,Java Mail底层在接收处理MIME数据方面依赖与JAF,JAF提供了对MIME数据进行处理的部件,它通常用于发送附件以及实现对MIME数据的常用操作。在开发过程中要编写的东西很多。并且由于自己刚接触,很多都不熟悉,所以出现问题解决速度很慢,对功能的实现方法也比较少。

本次毕业设计在很多地方未能考虑周全以至于系统存在着很多不足之处,这些不足主要是由于时间不足造成的,这就需要在以后系统维护过程中逐步发现,并不断进行升级,都有待进一步改善。

通过本次课程设计,对java mail也有一些感悟,感觉它真是一个神奇的东西,里面富含那么多的类,给人们带来了极大的方便。一个人编写代码真的是很容易出现一些可能看不到的小问题,从古至今人们确实从自己身上找问题比较难,所以说请教朋友和老师,注重合作更有利于项目的开发

还值得一提的,实践确实是学习一样新技术最快的方法。理论固然要看,但是需要理论结合实践,在实践操作中深化对理论的理解,这样才掌握得快。

                      

参考文献

[1](美)埃史尔.Java编程思想(第四版).机械工业出版社.2007

[2] Liang,Y.D.Java语言程序设计基础篇.机械工业出版社,2006

[3] 李金铭,林晓宇,宁正元.面向对象程序设计——Java.北京:北京交通大学出版社,2005

[4] 朱福喜著.Java 项目设计与开发范例[M].北京:电子工业出版社,2005

[5](美) Nathaniel T. Schutta, Ryan Asleson著.Ajax与Java高级程序设计.邮电出版社,2007

[6] O'Reilly & Associates,Inc 《Java Cookbook》in the United States or Canada

[7] O’reilly,《Java Servlet Programming》,American:Sernni Yey

[8] 印雯,Java语言与面向对象程序设计.北京:清华大学出版,2002年. 

[9] 毕广吉.Java程序设计实例教程[M]. 北京:冶金工业出版社,2007年

[10]张桂珠,刘丽,陈爱国 Java面向对象程序设计(第2版) 北京邮电大学出版社

[11]刘腾红,孙细明.信息系统分析与设计[M]. 北京:科学出版社,2003年

致  谢

在老师和同学的支持与帮助下,我顺利地完成了本次毕业设计。通过这段时间的毕业设计,本人受益非浅,对电子邮件系统有了更深刻的理解,在此期间,我认识到自己的不足之处并争取完成毕业设计,收获颇多,学到了以前很多没有学到的知识,同时也巩固了以前所学过的知识。

这次的毕业设计是在邓泽林老师的悉心指导下完成的,邓老师在整个毕业设计期间一直特别认真负责,经常主动联系我们,询问我们的进度,帮助我们查找资料,在修改设计报告期间总是耐心的为我们查看报告的内容和格式,不厌其烦的指导我们完善设计报告,达到最终的要求。在我个人设计的整个过程中,也给予我很多意见和建议,帮助我解决了很多问题,使我真正了解了如何从整体上分析、设计该系统,邓老师严谨的治学态度和认真负责给我留下了深刻的印象,在此衷心的对邓老师说声谢谢您。这次毕业设计也让我获益匪浅,让我明白应该以一种什么样的心态去面对一个新的知识领域,应该怎样协调理论和具体实践之间的关系。

回顾大学学习期间的日日夜夜,自己为有机会潜心研究,静心思考,并实现了邮件系统的基本功能而感到非常的欣慰。同时,我要向关心与支持我的老师和同学们表示真诚的感谢!他们在系统开发期间给予我热情的帮助和鼓励,提出了许多宝贵的意见,使我拓宽了视野,丰富了思路,获得了许多解决问题的行之有效的方法。感谢在设计中被我引用或参考的论著的作者。

 最后,再一次感谢在设计过程中帮助和鼓励我的所有人。在以后的学习和生活中我将更加努力,使自己工作的能力得到进一步的提高。

附录:部分源程序代码

package com.bes.mail.assist;

import java.io.*;

import java.text.*;

import java.util.*;

import javax.mail.*;

import javax.mail.internet.*;

/**

 * 有一封邮件就需要建立一个ReciveMail对象

 */

public class ReceiveOneMail {

 附件下载后的存放目录

 存放邮件内容

 默认的日前显示格式

     this.mimeMessage = mimeMessage;

     this.mimeMessage = mimeMessage;

 获得发件人的地址和姓名

     InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();

     String from = address[0].getAddress();

     if (from == null)

      from = "";

     String personal = address[0].getPersonal();

     if (personal == null)

      personal = "";

     String fromaddr = personal + "<" + from + ">";

     return fromaddr;

 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址

     String mailaddr = "";

     String addtype = type.toUpperCase();

     InternetAddress[] address = null;

     if (addtype.equals("TO") || addtype.equals("CC")

       || addtype.equals("BCC")) {

      if (addtype.equals("TO")) {

       address = (InternetAddress[]) mimeMessage

         .getRecipients(Message.RecipientType.TO);

      } else if (addtype.equals("CC")) {

       address = (InternetAddress[]) mimeMessage

         .getRecipients(Message.RecipientType.CC);

      } else {

       address = (InternetAddress[]) mimeMessage

         .getRecipients(Message.RecipientType.BCC);

      }

      if (address != null && !address.equals("")) {

       for (int i = 0; i < address.length; i++) {

        String email = address[i].getAddress();

        if (email == null)

         email = "";

        else {

         email = MimeUtility.decodeText(email);

        }

        String personal = address[i].getPersonal();

        if (personal == null)

         personal = "";

        else {

         personal = MimeUtility.decodeText(personal);

        }

        String compositeto = personal + "<" + email + ">";

        mailaddr += 

       }

//       mailaddr = mailaddr.substring(1);

      }

     } else {

      throw new Exception("Error emailaddr type!");

     }

     return mailaddr;

 获得邮件主题

     String subject = "";

     try {

      subject = MimeUtility.decodeText(mimeMessage.getSubject());

      if (subject == null)

       subject = "";

     } catch (Exception exce) {

     }

     return subject;

 获得邮件发送日期

     Date sentdate = mimeMessage.getSentDate();

     SimpleDateFormat format = new SimpleDateFormat(dateformat);

     if(sentdate!=null){

     return format.format(sentdate);

     }

     return "";

 获得邮件正文内容

     try {

      getMailContent((Part) message);

     } catch (Exception e) {

      e.printStackTrace();

     }

     return bodytext.toString();

 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析

     String contenttype = part.getContentType();

     int nameindex = contenttype.indexOf("name");

     boolean conname = false;

     if (nameindex != -1)

      conname = true;

     if (part.isMimeType("text/plain") && !conname) {

      bodytext.append((String) part.getContent());

      System.out.println((String) part.getContent());

     } else if (part.isMimeType("text/html") && !conname) {

      bodytext.append((String) part.getContent());

     }

 判断此邮件是否需要回执,如果需要回执返回"true否则返回"false"

     boolean replysign = false;

     String needreply[] = mimeMessage

       .getHeader("Disposition-Notification-To");

     if (needreply != null) {

      replysign = true;

     }

     return replysign;

 获得此邮件的Message-ID

     return mimeMessage.getMessageID();

 【判断此邮件是否已读,如果未读返回返回false,反之返回true】

     boolean isnew = false;

     Flags flags = ((Message) mimeMessage).getFlags();

     Flags.Flag[] flag = flags.getSystemFlags();

     System.out.println("flags's length: " + flag.length);

     for (int i = 0; i < flag.length; i++) {

      if (flag[i] == Flags.Flag.SEEN) {

       isnew = true;

       System.out.println("seen Message.......");

       break;

      }

     }

     return isnew;

 判断此邮件是否包含附件

     boolean attachflag = false;

     if (part.isMimeType("multipart/*")) {

      Multipart mp = (Multipart) part.getContent();

      for (int i = 0; i < mp.getCount(); i++) {

       BodyPart mpart = mp.getBodyPart(i);

       String disposition = mpart.getDisposition();

       if ((disposition != null)

         && ((disposition.equals(Part.ATTACHMENT)) || (disposition

           .equals(Part.INLINE))))

        attachflag = true;

       else if (mpart.isMimeType("multipart/*")) {

        attachflag = isContainAttach((Part) mpart);

       } else {

        String contype = mpart.getContentType();

        if (contype.toLowerCase().indexOf("application") != -1)

         attachflag = true;

        if (contype.toLowerCase().indexOf("name") != -1)

         attachflag = true;

       }

      }

     } else if (part.isMimeType("message/rfc822")) {

      attachflag = isContainAttach((Part) part.getContent());

     }

     return attachflag;

 【保存附件】

     String fileName = "";

     if (part.isMimeType("multipart/*")) {

      Multipart mp = (Multipart) part.getContent();

      for (int i = 0; i < mp.getCount(); i++) {

       BodyPart mpart = mp.getBodyPart(i);

       String disposition = mpart.getDisposition();

       if ((disposition != null)

         && ((disposition.equals(Part.ATTACHMENT)) || (disposition

           .equals(Part.INLINE)))) {

        fileName = mpart.getFileName();

        if (fileName.toLowerCase().indexOf("gb2312") != -1) {

         fileName = MimeUtility.decodeText(fileName);

        }

        saveFile(fileName, mpart.getInputStream());

       } else if (mpart.isMimeType("multipart/*")) {

        saveAttachMent(mpart);

       } else {

        fileName = mpart.getFileName();

        if ((fileName != null)

          && (fileName.toLowerCase().indexOf("GB2312") != -1)) {

         fileName = MimeUtility.decodeText(fileName);

         saveFile(fileName, mpart.getInputStream());

        }

       }

      }

     } else if (part.isMimeType("message/rfc822")) {

      saveAttachMent((Part) part.getContent());

     }

 【设置附件存放路径】

     this.saveAttachPath = attachpath;

 【设置日期显示格式】

     this.dateformat = format;

 【获得附件存放路径】

     return saveAttachPath;

 【真正的保存附件到指定目录里】

     String osName = System.getProperty("os.name");

     String storedir = getAttachPath();

     String separator = "";

     if (osName == null)

      osName = "";

     if (osName.toLowerCase().indexOf("win") != -1) {

      separator = "\\\\";

      if (storedir == null || storedir.equals(""))

       storedir = "c:\\\mp";

     } else {

      separator = "/";

      storedir = "/tmp";

     }

     File storefile = new File(storedir + separator + fileName);

     System.out.println("storefile's path: " + storefile.toString());

     BufferedOutputStream bos = null;

     BufferedInputStream bis = null;

     try {

      bos = new BufferedOutputStream(new FileOutputStream(storefile));

      bis = new BufferedInputStream(in);

      int c;

      while ((c = bis.read()) != -1) {

       bos.write(c);

       bos.flush();

      }

     } catch (Exception exception) {

      exception.printStackTrace();

   文件保存失败!");

     } finally {

      bos.close();

      bis.close();

     }

}

文档

基于Java Mail的电子邮件收发系统毕业设计

第4章详细设计…………………………………………………………………………………..15附件1:开题报告附件2:译文及原文影印件第1章概述随着信息时代的到来,Internet的广泛应用,相信大家对qq邮箱,163邮箱,yahoo邮箱已经并不陌生,这一类邮箱的出现是计算机和网络不断发展的结果,与每个人都密不可分,已经成为网络中最广泛使用的一部分。1.1研究目的和意义从人类发展开始,信息交换一直都是人类的基本需求之一。人们会通过各种途径来实现信息的交换,从而达到一种交流。从以前的快马送信和口耳相传到如
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top