版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE40EMAIL客户端(JavaGUI)姓名学号年级专业计算机科学与技术系(院)指导教师
摘要本系统是用java语言实现的一个Email客户端,主要用到javaGUI图形界面设计和javamail工具包,它适用于所有用户,无管理员设置,可以实现网络邮箱的邮件发送和邮件收取的基本功能,还具有通讯录的存储功能,针对用户的需求,本Email客户端具有以下两大模块:1.基本设置模块;此模块主要包括用户设置和邮箱设置两大内容:1.1用户设置:主要设置用户的一些基本信息,如用户名,用户密码等设置1.2邮箱设置:主要设置邮箱服务器,SMTP,POP3等2. Email功能模块;此模块根据大众用户的需求划分了以下三个部分:2.1收取邮件功能;2.2发送邮件功能;2.3通讯录功能;该系统的开发过程为:1.Email客户端的需求分析;2.Email客户端的系统分析;3.Email客户端的功能模块划分划分;4.Email客户端的数据库设计;5.Email客户端的界面设计;6.Email客户端的功能模块设计及代码实现关键字:java,javaGUI,javamailAbstractThisemailclientsystemisdevelopedinjavalanguageusingjavaGUIandjavamailtools.Itcanbeusedbyanyuserswhowanttouseit.Thesystemisnotincludingmanagersettingsanditcanfinishthefunctionofsendingandacceptingmailsinwebmailsystem,itcanstoreuserinformationafunctionlikeaaddressbookintheweb.Thesystemsneedtoachievetheoverallfunctiontoruntwoparts,asfollows1.ThebasicsettingsTwopartsarefollowed:1.1MaintenanceSystemAdministratorsbasicinformation;1.2Studentresponsefunctions;2.EmailfunctionsThreefunctionwillbeavailable2.1Sendingmails2.2Receivingmails2.3AddressbookThesystemdevelopmentprocess:1.Emailclientneedsanalysis;2.Emailclientsystemanalysis;3.Emailclientfunctionmodulespartition;4.Emailclientdesign;5.Emailclientinterfacedesign;6.EmailclientfunctionaldesignandcodemodulestoachieveKeyword:java,javaGUI,javamail目录TOC\o"1-4"\h\z\u前言 7第1章系统概述及系统分析 81.1系统概述 81.1.1基本设置模块 81.1.2Email功能模块 81.2需求分析 91.3可行性分析 91.3.1技术可行性分析 91.3.2环境可行性分析 91.3.3经济可行性分析 9第2章系统开发基本介绍 102.1选题背景与目的 102.2系统开发工具 102.3系统开发环境 102.4开发技术概述 112.4.1J2EE概述 112.4.2JavaGUI 112.4.3Javamail 12第3章系统总体设计 133.1系统功能模块划分 133.2系统具体功能模块基本介绍 143.2.1发件箱 143.2.2收件箱 143.2.3通讯录 15第4章系统详细设计及系统实现 164.1章节内容总体介绍 164.2各模块功能详细设计 164.2.1发送邮件功能的实现 164.2.1.1发送普通邮件功能 174.2.1.2邮件附件的功能实现 224.2.2收取邮件功能的实现 234.2.3通讯录功能的实现 304.2.4其他功能 324.2.4.1其他界面实现与通讯录的连接功能 324.2.4.2邮件未存储对用户提示功能 324.2.4.3复制、删除邮件功能 344.2.4.4用户信息设置功能 35结束语 38谢辞 39参考文献 40前言邮件系统是一套单独的系统,要有自己的服务器,在邮件系统中可以设多个域,每个域中可以设多个用户,比如说我买了anymacro或快客的邮件系统,可以进行多项设置.它的数据是放在自己的服务器上.随着信息技术的提高,网络的普及于发展,越来越多的网络工具随之产生出来,网络邮箱就是其中之一,它可以通过网络来实现人们之间的通信,可以给人们的工作带来极大的方便,同时也缩短了人与人之间的距离,使人们在通信上需要花费的时间更短。该Email客户端不仅仅具有网络邮箱的功能,它可以让用户绑定多个邮箱,可以说是多个网络邮箱的公共接口,不进方便了人们的工作,还做到了有效利用网络的信息资源,极大的提高人们的工作效率,减少了很多的工作量。因此它应该是能够得到用户欢迎的一个系统。第1章系统概述及系统分析1.1系统概述随着信息技术的提高,网络的普及于发展,越来越多的网络工具随之产生出来,网络邮箱就是其中之一,它可以通过网络来实现人们之间的通信,可以给人们的工作带来极大的方便,同时也缩短了人与人之间的距离,使人们在通信上需要花费的时间更短。该Email客户端不仅仅具有网络邮箱的功能,它可以让用户绑定多个邮箱,可以说是多个网络邮箱的公共接口,不进方便了人们的工作,还做到了有效利用网络的信息资源,极大的提高人们的工作效率,减少了很多的工作量。该系统的功能模块主要由以下部分组成:1.1.1基本设置模块该模块可以完成此用户设置和邮箱设置两大内容,其中用户设置可以完成用户的一些基本信息的设置,包括用户名、用户密码、联系方式、邮政编码、通讯地址、邮箱地址,并可以对其进行存储、浏览、查看、删除、修改、打印等操作。邮箱设置可以完成对所使用邮箱的邮箱服务器、SMTP、POP3的一些设置,也可以对这些设置进行存储、浏览、查看、删除、修改等操作。1.1.2Email功能模块该模块可以完成网络邮箱的收取邮件、发送邮件、保存邮件的功能,并可以对这些邮件进行存储、转发、群发、浏览、删除、修改、打印等操作。此模块还具有通讯录的功能,可以存储其他网络邮箱用户的用户名和邮箱地址进行存储、修改等功能。1.2需求分析Email客户端的设计目的是要为了实现网络邮箱的邮件发送和收取的以些功能。为使用邮箱的用户提供便利。系统所面对的用户可以是任何普通用户,系统对于一个用户只允许以一种身份登录。用户登录后可以对系统进行管理,其主要操作是维护个人的基本信息,对其信息进行修改、存储等操作。将系统需求加以总结,得出系统需求如下:系统可以运行任何操作系统平台上,并具有友好的用户界面。系统用户类型为:任何普通用户。1.3可行性分析1.3.1技术可行性分析Java很有雄心的宣言--"write
once,
run
anywhere"许诺:一个具有下拉菜单,命令按钮,滚动条以及其他常见的GUI控件的应用程序将能够在各种操作系统上运行而不必重新编译成针对某一平台的二进制代码,包括Microsoft
Windows,
Sun’s
own
Solaris,
Apple’s
Mac
OS以及Linux。1.3.2环境可行性分析Java很有雄心的宣言--"write
once,
run
anywhere"许诺:一个具有下拉菜单,命令按钮,滚动条以及其他常见的GUI控件的应用程序将能够在各种操作系统上运行而不必重新编译成针对某一平台的二进制代码,包括Microsoft
Windows,
Sun’s
own
Solaris,
Apple’s
Mac
OS以及Linux。也就是说本系统可以跨平台使用.1.3.3经济可行性分析开发此系统所用软件可在网络上下载使用。第2章系统开发基本介绍2.1选题背景与目的随着信息技术的提高,网络的普及于发展,越来越多的网络工具随之产生出来,网络邮箱就是其中之一,它可以通过网络来实现人们之间的通信,可以给人们的工作带来极大的方便,同时也缩短了人与人之间的距离,使人们在通信上需要花费的时间更短。该Email客户端不仅仅具有网络邮箱的功能,它可以让用户绑定多个邮箱,可以说是多个网络邮箱的公共接口,不进方便了人们的工作,还做到了有效利用网络的信息资源,极大的提高人们的工作效率,减少了很多的工作量。正是因为该系统所具有的这些优点才开发了此系统。2.2系统开发工具 本系统在开发过程中使用javaGUI和java中javamail工具包实现了email的收发和一些基本的管理功能。2.3系统开发环境在软件环境方面,系统的开发环境如下:操作系统:SuseLinux;开发平台:java; 2.4开发技术概述2.4.1J2EE J2EE是美国Sun公司刚刚推出的一种全新概念的模型,与传统的互联网应用程序模型相比有着不可比拟的优势。目前,Java2平台有3个版本,它们是适用于小型设备和智能卡的Java2平台Micro版(Java2PlatformMicroEdition,J2ME)、适用于桌面系统的Java2平台标准版(Java2PlatformStandardEdition,J2SE)、适用于创建服务器应用程序和服务的Java2平台企业版(Java2PlatformEnterpriseEdition,J2EE)。J2EE是一种利用Java2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java2平台的标准版,J2EE不仅巩固了标准版中的许多优点,例如"编写一次、随处运行"的特性、方便存取数据库的JDBC(JavaDataBaseConnectivity)应用程序接口(API,ApplicationProgramInterface)技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对EJB(EnterpriseJavaBeans)、JavaServletsAPI、JSP(JavaServerPages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。2.4.2JavaGUI 当Java在1995年的春天第一次发布的时候,它包含了一个叫AWT(Abstract
Windowing
Toolkit)的库,用来构建图形用户界面应用程序。Java很有雄心的宣言--"write
once,
run
anywhere"许诺:一个具有下拉菜单,命令按钮,滚动条以及其他常见的GUI控件的应用程序将能够在各种操作系统上运行而不必重新编译成针对某一平台的二进制代码,包括Microsoft
Windows,
Sun’s
own
Solaris,
Apple’s
Mac
OS以及Linux。 为了方便用Java构建图形用户界面,Sun最初提供了一个在所有平台下具有的独特Java外观的图形界面库。Sun在applet技术策略方面的首要伙伴Netscape提出applets应该维持和运行时平台一样的外观。他们希望applets在某一平台下在显示和行为上能够像其他应用程序一样。为了实现Netscape的"本地外观"的目标,在JDK的第一个发布版中包含了AWT这个库。AWT的缺省实现使用了"对等"机制,即每一个Java
GUI窗口部件都在底层的窗口系统中有一个对应的组件。例如,每一个java.awt.Button对象将在底层窗口系统中创建一个唯一对应的button。当用户点击那个按钮的时候,事件将从本地实现库传送到Java虚拟机里,并且最终传送到与java.awt.Button对象相关联的逻辑。对等系统的实现以及Java组件与对等组件之间的交流的实现都隐藏在底层JVM实现中,Java语言级的代码仍然跨平台。于1997年JavaOne大会上提出并在1998年5月发布的JFC(Java
Foundation
Classes)包含了一个新的使用Java窗口开发包。这个新的GUI组件叫做Swing,感觉到它是对AWT的升级,并且看起来对Java占据计算机世界很有帮助。尽管"Swing"仅仅是这个新组件的指代名称,它一直持续使用到今天。可能是因为这个名称太贴切了,Swing尝试着以以下几种方式改变公认的观点:AWT依赖对等架构,用Java代码包装本地窗口部件,Swing却根本不使用本地代码和本地窗口部件AWT把绘制屏幕交给本地窗口部件,Swing自己的组件绘制自己,因为Swing不依赖本地窗口部件,它可以抛弃AWT的最小公分母的方法并在每个平台下实现每个窗口部件,从而创建一个比AWT更强大的开发工具包从最开始Java就提供了构建跨平台的窗口GUI应用程序库,从AWT,Swing到现在的SWT和JFace。最初的工具包能力微弱,但是后来提供的工具包认识到之前工具包的缺点并取得了巨大的进步。SWT和JFace不仅使Java成为一个构建桌面应用程序的可行的选择,也使之成为一个具有优势的开发平台。尽管过去对得到轻便和强大的Java系统的尝试必然意味着接受它在GUI方面的缺点,如今这个不足已经不存在了,Java终于可以统领它在桌面计算应用方面的位置了。2.4.3Javamail想将邮件工具结合到您独立于平台的Java解决方案中吗?再没有比JavaMailAPI更合适的了,它提供了个独立于协议的模块,能用于IMAP、POP、SMTP、MIME和其它涉及因特网的消息传递协议。现在,有了JavaBeansActivationFramework(JAF)的支持,您的应用程序经由JavaMailAPI就能启用邮件功能啦。第3章系统总体设计3.1系统功能模块划分 模块分析是描述系统需求的一个过程,需要将需求分析中的感性描述进行抽象,提取出要实现的功能,这是整个系统开发的一个关键过程。 模块分析的第一步,是描述Email客户端的功能,以此确定系统的功能需求。本Email客户端对任何一个用户都是普通用户,无管理员设置,对每一个用户都具有普通邮箱所具有的收取、发送邮件的功能,因此根据用户操作需求,将系统划分为如下功能,并对其模块的划分和功能进行描述.整个系统的模块结构如图3.1所示,此图将Email客户端划分为三大模块,这些模块又是由若干个子模块构成的,形成一个结构紧凑功能明确完整,子模块的划分见3.2系统具体功能模块的基本介绍。 Email客户端 Email客户端 收件箱发件箱通讯录 收件箱发件箱通讯录图3.13.2系统具体功能模块基本介绍 本部分主要介绍Email客户端的一些基本功能,主要描述了收件箱、发件箱、和通讯录所具有的功能,详细设计见第4章内容。3.2.1发件箱 发件箱可以通过用户设置发送用户所需要的邮件信息,本页面可以实现查看已保存邮件信息、重发已发邮件、转发所收邮件、邮件标记、编辑邮件、新建邮件、删除邮件和打印邮件、发送,抄送、密送、发送附件、存储邮件、未存储提示等功能,具体功能图如图3.2.1发件箱发件箱发送已存邮件查看保存邮件新建邮件重发邮件打印邮件发送已存邮件查看保存邮件新建邮件重发邮件打印邮件删除邮件存储邮件编辑邮件图3.2.13.2.2收件箱 收件箱可以通过用户设置收取用户所需要的邮件信息,本页面可以实现查看所收取的邮件信息、转发邮件、群发邮件、邮件标记(标记已读和未读)、编辑和存储邮件、删除邮件和打印邮件等功能,具体功能图如图3.2.收收件箱查看邮件转发邮件群转发邮件邮件标记打印邮件删除邮件查看邮件转发邮件群转发邮件邮件标记打印邮件删除邮件存储邮件编辑邮件图3.2.23.2.3通讯录 通讯录可以存储用户的好友信息,可以方便用户完成对邮件信息的发送,尤其是转发和群组发送功能,通讯录的存在在很大程度上方便了使用系统的用户。本通讯录可以实现查看好友、增加好友、删除好友、编辑好友信息、删除好友信息等功能,本系统还可以建立多个通讯录,每个通讯录都可以对所存用户进行分组,以便方便邮件的发送,存储通讯录的文件还可以转存,即修改当前通讯录的存放位置,其基本功能图如图3.2.3通讯录通讯录编辑通讯录文件增加新通讯录编辑好友信息查看好友增加好有删除好友删除编辑通讯录文件增加新通讯录编辑好友信息查看好友增加好有删除好友删除好友删除通讯录图3.2.3第4章系统详细设计及系统实现4.1章节内容总体介绍 系统分析完成后,进入系统的设计阶段这是整个系统实现过程中非常重要的一个阶段。本章节描述了系统设计的详细过程和内容及实现过程。4.2各模块功能详细设计4.2.1发送邮件功能的实现4.2.1.1发送普通邮件功能 实现此功能需要引入javamail工具包中的以下包 importjavax.mail.*; importernet.*; 构造sendMail类的主要代码如下 publicclasssendMail{privateStringSMTP,mailFrom,mailTo,mailCC,mailTitle,mailBody,mailEncode; privateStringuserName,userPass;privateObject[]attachFileList;privatebooleanisAuthentic=false;publicsendMail(){//初始化参数代码段this.SMTP="";this.mailFrom="";this.mailTo="";this.mailCC="";this.mailTitle="";this.mailBody="";this.mailEncode="BIG5";} //为用户提供参数设置接口 //在本系统中通过以下方法实现对用户写入的信息加以传递publicvoidsetFrom(Stringfrom){this.mailFrom=from;}publicvoidsetTo(Stringto){this.mailTo=to;}publicvoidsetCC(Stringcc){this.mailCC=cc;}publicvoidsetBody(Stringbody){this.mailBody=body;}publicvoidsetTitle(Stringtitle){this.mailTitle=title;}publicvoidsetSMTP(Stringsmtp){this.SMTP=smtp;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicvoidsetPassword(Stringpass){this.userPass=pass;}publicvoidsetAttachFile(Object[]fileListAry){ this.attachFileList=fileListAry; }//设置文字编码代码如下publicvoidsetEncode(Stringencode){this.mailEncode=encode;publicintsend(booleanhasSMTPAuth){this.isAuthentic=hasSMTPAuth;//检查参数是否安全if(!checkParameters(isAuthentic)){return1;}else{Propertiesprop=newProperties();//设定SMTPServerprop.put("mail.smtp.host",this.SMTP);SessionmailConn=Session.getDefaultInstance(prop,null);Messagemsg=newMimeMessage(mailConn); try{ msg.setHeader("Content-Transfer-Encoding",this.mailEncode);reEncode();//设置邮件的地址和邮件的编码msg.setFrom(newInternetAddress(this.mailFrom));//Setrecievere-mailaddressandnicknamemsg.setRecipient(Message.RecipientType.TO,newInternetAddress(this.mailTo));if(this.mailCC.trim().length()!=0){msg.setRecipient(Message.RecipientType.CC,newInternetAddress(this.mailCC));} //设定信件标题if(this.mailTitle.trim().length()==0){msg.setSubject("[无标题信件]");}else{msg.setSubject(this.mailTitle);}Multipartmp=newMimeMultipart();MimeBodyPartmbpBody=newMimeBodyPart();mbpBody.setContent(this.mailBody+this.mailEncode);MimeBodyPartmbpFile;for(inti=0;i<attachFileList.length;i++){StringfullPath=this.toBIG5(attachFileList[i].toString());mbpFile=newMimeBodyPart();FileDataSourcefds=newFileDataSource(fullPath);mbpFile.setDataHandler(newDataHandler(fds));mbpFile.setFileName(fds.getName());mp.addBodyPart(mbpFile);}mp.addBodyPart(mbpBody);//將內容加入msg.setContent(mp);if(isAuthentic){//送信prop.put("mail.smtp.auth",isAuthentic);Transporttrans=mailConn.getTransport("smtp");try{trans.connect(this.SMTP,this.userName,this.userPass);trans.sendMessage(msg,msg.getAllRecipients());return0;}catch(Exceptionex){ ex.printStackTrace(); return2; }finally{ trans.close();}}else{try{Transport.send(msg);return0;}catch(SendFailedExceptionex){System.out.println(ex.toString());return3;}}}catch(Exceptionex){ex.printStackTrace();return4;}} } privatebooleancheckParameters(booleanhasSMTPAuth){if(SMTP.trim().length()==0||mailFrom.trim().length()==0||mailTo.trim().length()==0)returnfalse;elseif(hasSMTPAuth){if(this.userName.trim().length()==0)returnfalse;elsereturntrue;}else{returntrue;}}privatevoidreEncode(){if(this.mailEncode.toUpperCase()=="BIG5"){this.mailFrom=toBIG5(mailFrom);this.mailTo=toBIG5(mailTo);this.mailTitle=toBIG5(mailTitle);this.mailBody=toBIG5(mailBody);}elseif(this.mailEncode.toUpperCase()=="UTF8"){this.mailFrom=toUTF8(mailFrom);this.mailTo=toUTF8(mailTo);this.mailTitle=toUTF8(mailTitle);this.mailBody=toUTF8(mailBody);}}privateStringtoUTF8(Stringstr){try{str=MimeUtility.encodeText(str,"UTF-8","B");returnstr;}catch(Exceptionex){returnstr;}} }图新建邮件 要发送邮件之需要使用已经建好的sendMail类即可,功能代码如下: sendMailmail=newsendmail(); mail.setMailTo(****); mail.setMailFrom(****); mailsend();4.2.1.2邮件附件的功能实现 此功能实现代码如下: publicclassAttachExample{publicstaticvoidmain(Stringargs[])throwsException{Stringhost=args[0];Stringfrom=args[1];Stringto=args[2];StringfileAttachment=args[3]; //获得系统参数Propertiesprops=System.getProperties(); //设置邮件的服务器props.put("mail.smtp.host",host); //获得SessionSessionsession=Session.getInstance(props,null);MimeMessagemessage=newMimeMessage(session);//Definemessagemessage.setFrom(newInternetAddress(from));message.addRecipient(Message.RecipientType.TO,newInternetAddress(to));message.setSubject("HelloJavaMailAttachment");MimeBodyPartmessageBodyPart=newMimeBodyPart();//createthemessagepartmessageBodyPart.setText("Hi");//fillmessageMultipartmultipart=newMimeMultipart();multipart.addBodyPart(messageBodyPart);//Parttwoisattachment
messageBodyPart=newMimeBodyPart();DataSourcesource=newFileDataSource(fileAttachment);messageBodyPart.setDataHandler(newDataHandler(source));messageBodyPart.setFileName(fileAttachment);multipart.addBodyPart(messageBodyPart);//将多个附件加入信件中message.setContent(multipart);//发送带附件的邮件,此功能代码结束Transport.send(message);}4.2.2收取邮件功能的实现 邮件的收取可以使用javaMailAPI的方法,主要的操作过程为:获取javax.mail.Session实例,并进而获得javax.mail.Store实例。利用javax.mail.Store实例获得缺省收件箱(INBOX)javax.mail.Folder实例。使用javax.mail.Folder对象提取新邮件,存储为javax.mail.Message对象数组。创建javax.mail.FetchProfile以(潜在地)优化对特定邮件组成成分的提取。这里的javax.mail.FetchProfile类提供邮件协议提供者可选参数,其目的是更有效地实现邮件组成成分的预提取 此功能的主要代码如下: Stringpers=null; Stringaddr=null; if(ainstanceofInternetAddress&&((pers=((InternetAddress)a).getPersonal())!=null))addr=pers+""+"<"+((InternetAddress)a).getAddress()+">"; elseaddr=a.toString(); returnaddr; Sessionmailsession=Session.getInstance(System.getProperties(),null); mailsession.setDebug(false); Storestore=mailsession.getStore(protocol);//protocol为连接协议,IMAP或是POP store.connect(mailhost,-1,user,passwd);//mailhost主机,user为用户名,passwd为密码 Folderfolder=store.getFolder("INBOX");try{ folder.open(Folder.READ_WRITE);}catch(MessagingExceptionex) { folder.open(Folder.READ_ONLY); } Messagemessage[]=folder.getMessages(); FetchProfilefp=newFetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); fp.add(FetchProfile.Item.FLAGS); fp.add("X-Mailer"); folder.fetch(message,fp); intid=0,j=0; for(inti=0;i<request.getParameter("id").length();i++)//假设要阅读第ID个邮件。 id=id*10+(request.getParameter("id").charAt(i)-48); for(j=0;j<id;j++);message[j].setFlag(Flags.Flag.SEEN,true); out.println(“主题:”+message[j].getSubject()); Stringfrom=newString();
Address[]fr=message[j].getFrom();
if(fr!=null)
{ booleantf=true; for(inti=0;i<fr.length;i++) from=from+getDisplayAddress(fr);}out.println(“from”+from+);Objecto=message[j].getContent();if(message[j].isMimeType("text/plain"))//就可直接读出了。 out.println((String)o+""); elseif(message[j].isMimeType("multipart/*")){Multipartmp=(Multipart)o;
Partpart=mp.getBodyPart(0);
Stringmsg=(String)part.getContent();
StringBufferbuf=newStringBuffer(msg.length()+6);
charch='';
for(inti=0;i<msg.length();i++)//若遇到换行就转为<br>{ch=msg.charAt(i);
if(ch=='\n')buf.append("<br>");
elsebuf.append(ch);
}
out.println(buf.toString());}elseout.println("现在还无法显示:"+message[j].getContentType()); folder.close(true); store.close(); Stringpers=null;Stringaddr=null;if(ainstanceofInternetAddress&&((pers=((InternetAddress)a).getPersonal())!=null))addr=pers+""+"<"+((InternetAddress)a).getAddress()+">";elseaddr=a.toString();returnaddr;Sessionmailsession=Session.getInstance(System.getProperties(),null);mailsession.setDebug(false);Storestore=mailsession.getStore(protocol);//protocol为连接协议,IMAP或是POPstore.connect(mailhost,-1,user,passwd);//mailhost主机,user为用户名,passwd为密码Folderfolder=store.getFolder("INBOX");try{ folder.open(Folder.READ_WRITE);}catch(MessagingExceptionex) { folder.open(Folder.READ_ONLY); }Messagemessage[]=folder.getMessages();FetchProfilefp=newFetchProfile();fp.add(FetchProfile.Item.ENVELOPE);fp.add(FetchProfile.Item.FLAGS);fp.add("X-Mailer");folder.fetch(message,fp);intid=0,j=0;for(inti=0;i<request.getParameter("id").length();i++)//假设要阅读第ID个邮件。 id=id*10+(request.getParameter("id").charAt(i)-48);for(j=0;j<id;j++); message[j].setFlag(Flags.Flag.SEEN,true);out.println(“主题:”+message[j].getSubject());Stringfrom=newString();
Address[]fr=message[j].getFrom();
if(fr!=null)
{ booleantf=true; for(inti=0;i<fr.length;i++) from=from+getDisplayAddress(fr);}out.println(“from”+from+);Objecto=message[j].getContent();if(message[j].isMimeType("text/plain"))//就可直接读出了。 out.println((String)o+""); elseif(message[j].isMimeType("multipart/*")){Multipartmp=(Multipart)o;
Partpart=mp.getBodyPart(0);
Stringmsg=(String)part.getContent();
StringBufferbuf=newStringBuffer(msg.length()+6);
charch='';
for(inti=0;i<msg.length();i++)//若遇到换行就转为<br>{ch=msg.charAt(i);
if(ch=='\n')buf.append("<br>");
elsebuf.append(ch);
}
out.println(buf.toString());}elseout.println("现在还无法显示:"+message[j].getContentType()); folder.close(true); store.close(); 在Folder对象中可以用getMessageCount()和getUnreadMessageCount()方法来取得总共有多少封信和共有多少封信未读。 但是如果我们需要在我们的java项目中增加对Hotmail邮箱(此邮箱有一个限制就是它并不提供POP3或者SMTP服务,也就是说一般的邮件客户端工具无法使用这个邮箱)的支持,那往往会不知从什么地方开始入手,因为SUN公司提供的javamail本身并不提供对除了POP3/IMAP以及SMTP外其他协议的支持。如何解决此问题呢?但事实上,Javamail只是定义了一组平台无关、独立于通讯协议的邮件程序框架,或者说是接口,它是作为Java的可选包存在的。因此可以这样说:JavaMail并不关心所使用的协议,不管是POP3、SMTP、IMAP当然还有Hotmail用的HTTP协议。对于JavaMail的客户端而言也是这样的,下图就是一个最简单的JavaMail结构图,通过Transport进行邮件的发送,通过Store实现对邮件的收取,而不同协议的实现,JavaMail里的概念叫做Provider,只需要根据JavaMail定义的接口实现自己的Provider即可。
为了实现通过JavaMail访问Hotmail邮箱,我们就需要架起JavaMail接口与Hotmail服务所提供的访问接口之间的桥梁。在这之前我们必须首先了解Hotmail所使用的接口协议。
Hotmail通过地址/sVCs/hotmail/httpmail.ASP提供基于HTTP协议的服务,它不同于我们通过浏览器访问的这个地址,后面这个地址是提供给用户一个基于浏览器的访问界面以便对邮箱进行操作,你当然可以通过编写HTTP客户端程序来解析页面并获取邮件的信息,但是这样做不仅实现的复杂程度非常高,而且每次页面风格发生变化后程序都要做相应的调整,因此不具备通用性,显然是不可行的。而地址/svcs/hotmail/httpmail.asp则不同,它提供了固定的应用程序接口。当你使用浏览器访问该地址的时候,会弹出下面要求登录的窗体:而当输入正确的用户名和口令后会再弹出一次或两次该提示窗口,但提示信息不同,操作完成后出现页面无法显示的错误,错误码是405(资源不允许)。因此该服务并不允许通过浏览器来访问。事实上Hotmail使用的是WebDAV来提供基于HTTP协议的应用编程接口,WebDAV(Web分布式创作和版本控制)已经成为重要的Web通讯协议。WebDAV所要解决的问题是:1.改写保护:HTTP1.1无法确保客户端可以保护资源,并且可以在其他客户端同时编辑它们的情况下进行更改。使用WebDAV,可以通过多种方式来锁定资源,以便让其他客户端知道您对所讨论的资源感兴趣,或者防止其他客户端访问该资源。2.资源管理:HTTP只能直接访问单个资源。WebDAV提供一种更有效地组织数据的方法。WebDAV引入了可包含资源的集合(类似于文件系统文件夹)概念。通过WebDAV进行的资源管理包括如下功能:创建、移动、复制和删除集合,以及集合中的资源或文件。3.文档属性:不同类型的数据具有唯一的属性,这有助于描述数据。例如,在电子邮件中,这些属性可能是发件人的姓名和接收邮件的时间。在协作文档中,这些属性可能是文档原始作者的姓名和最后一个编辑者的姓名。因为人们使用的文档类型各不相同,所以可能的属性类型列表也变得无限大。XML是WebDAV所需的一种可扩展通讯工具。关于WebDAV的更多资料可以参阅本文最后的参考资料。相对于自行解析Hotmail的浏览器页面而言,基于特定协议WebDAV的接口使Hotmail邮件客户端程序的实现更加稳定和可靠。在了解了JavaMailAPI的基本接口以及Hotmail所提供接口的协议,本文的题目就变得非常具体了,就是如果编写基于WebDAV的JavaMailProvider(JavaMail提供者)并使用这个提供者来实现Hotmail邮件收发功能,但这题目太大而且已经超过了一篇文章所能叙述的范围,因此我们接下来将引入一个开放源码项目JDAVMail,并详细介绍如何通过这个项目实现Hotmail邮件的收发功能。JDAVMail是一个开放源码的JavaMail的提供者项目,可以通过它来访问基于WebDAV协议的邮件服务,有如Hotmail邮箱。你可以到/projects/jdavmail这个网址下载到最新版本的程序。JDAVMail使用了Jakarta上的commonshttpclient作为HTTP客户端组件与服务器进行通讯,同时使用了jdom进行XML数据的解析,另外由于httpclient项目用到了commonslogging进行日记的输出,因此commons-logging也是必须的,这三个组件都可以在JDAVMail的压缩包中的lib目录中找到,压缩包中同时还包括已编译的jar文件以及所有的源码。4.2.3通讯录功能的实现 通讯录功能的实现,在java中主要使对文件的操作图增加记录图增加图4.2.3 保存新记录代码 FileOutputStreamfos=newFileOutputStream("a.txt"); OutputStreamWriterosw=newOutputStreamWriter(fos); BufferedWriterbw=newBufferedWriter(osw); bw.write(“contents”); bw.flush(); bw.close(); osw.close(); fos.close(); 其中a.txt为能够保存通讯录的文件,这里用的使相对路径,这里可以用绝对路径进行存储,bw.write(“contents”)中contents为所要保存的新记录,此处还可以用集合实现,由于所存储的记录包括多个字段,通过对集合对象的存储,能够使存储更加方便。 读取旧记录功能,主要是通过java语言中静态块的使用实现新写内容不覆盖原有文件内容,实现对文件原有内容的进行暂时保存,其主要功能代码如下: FileInputStreamfis=newFileInputStream("a.txt"); InputStreamReaderisr=newInputStreamReader(fis); BufferedReaderbr=newBufferedReader(isr); System.out.println(br.readLine()); br.close(); isr.close(); fis.close(); 将此代码加入所要实现功能所在的页面中代码的静态初始化块中即可实现读取旧记录的功能,这里使用System.out.println(br.readLine())只是作测试,在代码中应将其赋值给一个集合,通过集合实现对其信息的存储。4.2.44.2.4.1 新建邮件界面、发件箱、收件箱都有与通讯录的连接,主要是在实现进行发送、转发、群发、加入新好友的时候和通讯录进行连接,实现此功能主要是在其他页面new出一个AddressBook对象然后通过此类中静态代码块进行完成4.2.4.2 本功能主要是提醒用户有未保存的邮件,功能实现主要是通过new来新建一个窗口,在本系统中是用newInformation(“您的信件还未保存,是否要保存”,3).go();来实现的。 在弹出窗口中按钮的主要点击事件代码如下 … //以下代码都是在实现ActionListener接口中的actionPerformed(ActionEvente)//抽象方法中写的//点击确定按钮事件if(e.getSource()==okBtn){ //进行存储存储代码段如下 FileOutputStreamfos=newFileOutputStream("a.txt"); OutputStreamWriterosw=newOutputStreamWriter(fos); BufferedWriterbw=newBufferedWriter(osw); bw.write(“contents”); bw.flush(); bw.close(); osw.close(); fos.close();}图未存邮件提示框//点击否按钮事件 if(e.getSource()==canBtn){ //退出本系统 System.exit(0); } //点击撤销按钮事件 if(e.getSource()==cancelBtn){ frame.setVisible(false); } …4.2.4.3 由于本系统中存储邮件都是以文件的形式存储的,因此对邮件的所有操作都是利用javaio包中的工具实现的。 复制邮件的功能实现 复制邮件的执行过程即先读取源文件的内容,然后再新建一个相同名字的文件到所要复制到的路径,然后再写入所读取的内容 复制流程图如图磁盘文件1磁盘文件1 磁盘文件2Javai/o磁盘文件2Javai/o图复制流程 读取文件代码 FileInputStreamfis=newFileInputStream("源文件路径"); InputStreamReaderisr=newInputStreamReader(fis); BufferedReaderbr=newBufferedReader(isr); Stringcontents=br.readLine(); br.close(); isr.close(); fis.close(); 创建名字相同的文件夹到目标文件夹 FileOutputStreamfos=newFileOutputStream("目标文件"); 将读取的内容写入到文件中 OutputStreamWriterosw=newOutputStreamWriter(fos); BufferedWriterbw=newBufferedWriter(osw); bw.write(“contents”); bw.flush(); bw.close(); osw.close(); fos.close();4.2.4.4用户信息设置功能 用户信息设置的功能主要通过javai/o和Java中集合的联合运用,完成此功能所涉及的类如图USERSERVICE…USERSERVICE…各属性的set和get方法….USER…listList<User>idint(20)nameString()passwordString()enameString()epasswordString()….图User类和UserService类 修改用户信息功能 本系统中所存用户信息中key键为用户的id,因此可以根据用户id进行修改用户的信息主要功能代码如下 首先找到该id所对应的存储位置 Interatoriter=user.getList().iterator(); for(inti=0;i<id;i++){ iter.next(); } 然后取出此User通过set方法修改其信息 Useruser=iter.next(); user.setName(“…”); …图用户设置 删除用户信息功能实现 该功能主要通过集合中的remove方法删除记录 首先找到该id所对应的存储位置 Interatoriter=user.getList().iterator(); for(inti=0;i<id;i++){ iter.next(); } 然后利用remove方法删除其信息 list.remove(iter.next());结束语 本文用当前比较成熟的java语言实现了一个比较实用的Email客户端的设计与开发。实现时主要用到了javaGUI和javamail工具包。 本系统作为web邮箱的公共接口,具有相当的实用性。由于使用了MVC开发模型,使得各模块具有相当的独立性,因此系统的可重用性也比较高。使用Java语言作为开发语言,使得程序具有很强的可移植性。程序中注释写得尽量规范,因此可读性与可维护性也比较好。 在本系统开发过程中不可避免地遇到不少困难,加之作者水平有限并对webmail的应用开发还不是太熟练,系统的一些功能做得还是很完善,但通过本次毕业设计我学到了不少新东西,更进一步熟悉了利用java进行开发的过程。但是也发现了自身的诸多不足,相信通过以后的不断学习与实践,一定会有更多的收获的。谢辞在本系统的制作过程中得到了许多老师和同学的大力相助,借此机会向他们表示诚挚的谢意!感谢我的指导老师老师!我的整个设计的过程中张老师对我热心指导、严格要求,及时的解决了各种在我看来相当困难的问题。在系统的选题、系统的总体设计与技术解决方案、系统功能的完善、系统的调试和修改等方面都给予了宝贵的建议,帮助我建立了正确的设计思想,树立了科学的学习方法,从而保证了设计的顺利完成。在张老师那里学到的不仅仅是学术方面的知识,更为重要的是为张老师严谨的治学态度、高效的工作效率感染,是我大学阶段的宝贵的精神财富。认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅感谢信息学院的各位老师和各位领导!正是信息学院的各位老师任劳任怨的教学,一丝不苟的教学才让我学到了扎实的基本知识来完成设计。感谢一同做设计过程中的同学!许多设计的思想来源于和同学的交流过程当中,在不知不觉的讨论过程中扑朔迷离的问题变得清晰了,感谢同学们的帮助。最后,再次对在系统设计过程中给予我帮助的老师和同学表示诚挚的感谢!参考文献[1]ArnoldDoray,铁手,程小东,靖松译.Struts基础教程[M].人民邮电出版社.2007.[2]孙卫琴.精通Hibernate:对象持久化技术详解[M].电子工业出版社.2005[3]王少锋.面向对象技术UML教程[M].清华大学出版社.2004[4]阎宏.Java与模式[M].电子工业出版社.2002[5]计磊,李里,周伟.精通J2EE—EclipseStrutsHibernateSpring整合应用案例[M].人民邮电出版社.2007.[6]张桂元,贾燕枫.Struts开发入门与项目实践[M].人民邮电出版基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Sm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年就餐实施方案
- 美甲店临时涨价方案
- 期中测试提升卷-2024-2025学年人教PEP版英语六年级上册(含答案含听力原文无音频)
- 山西公务员面试模拟46
- 小学语文学习任务单的设计与实施
- 江苏行政职业能力C类模拟12
- 浙江公务员面试模拟78
- 2015年6月28日上午陕西公务员面试真题
- 地方公务员广东申论40
- 河北省公务员面试模拟202
- PPT模板:严谨实用国奖答辩国家奖学金申请课件
- 小学五年级下册科学课件-4.3《火山》1人教版(28张)ppt课件
- 中小学生心理健康量表(共9页)
- 预制盖板工程施工组织设计方案
- 变形美术字设计
- 汽车灯光系统--ppt课件
- 配合比调整权限
- 小学语言文字工作计划例文
- 标准气体的配制课件
- 外伤性颅底脑脊液漏的处理策略
- 平菇栽培技术ppt
评论
0/150
提交评论