第12章邮件客户端第12章邮件客户端在日常的生活中,我们都使用到许多的邮件客户端,例如Foxmail、Outlook等,这些邮件客户给我们收发邮件带来了方便,不必再去打开网页去查看邮件,只打开这些客户端,就可以轻松的收发邮件。本章我们将介绍如何使用Java去开发一款自己的邮件客户端,功能并不需要太复杂,可以收发邮件,管理邮件即可,从这些功能中体会这些客户端的原理。12.1本章涉及的技术使用Java开发邮件客户端,首先想到的就是JavaMailAPI,另外,我们还需要对邮件进行保存,例如像Foxmail一样将邮件下载到本地的系统中,使用一些文件来对这些邮件进行保存,这些做可以提高邮件客户端的性能,不必每次都上互联网上去下载这些邮件,只需要通过操作本地系统中的文件就可以达到操作邮件的目的,为了满足这个要求,我们还会使用XStream这个项目,下面先对JavaMail进行简单的描述。12.1.1JavaMail简介JavaMailAPI是Sun提供的处理电子邮件的API,可以方便的使用它来进行一些常用的邮件操作,它提供了独立于各个平台和独立于各种协议的框架,可以让我们去构建一些邮件和消息的应用。我们可以从以下网址得到JavaMail的包:本章中所使用的JavaMail版本为1.4.2,下载了JavaMail后,将mail.jar加入项目的CLASS_PATH中,就可以使用JavaMailAPI。本章中使用了SMTP协议和POP3协议来进行发送邮件和接收邮件,下面介绍这两种协议。12.1.2SMTP协议简介SMTP是SimpleMailTransferProtocol的缩写,译为简单邮件传输协议,SMTP被用来在互联网上传递各种电子邮件的协议,可以将邮件从本客户端传送到邮件服务器,简单的说,我们可以使用这个协议发送邮件。在一般的情况下,SMTP使用25作监听端口。大部分的邮箱都支持这SMTP协议,例如Gmail的邮箱提供的SMTP服务器地址是:smtp.gmail.com,如果我们需要使用我们的Gmail来发送邮件,就需要使用到这一个SMTP服务器地址。12.1.3POP3协议简介POP3是PostOfficeProtocol的缩写,即邮局协议,用于电子邮件的接收,一般情况下,它使用TCP的110端口,由于现在最常用的是第三版,因此称为POP3。简单的说,这个协议用于接收电子邮件,因此我们在本章的邮件客户端中,将会使用这个协议来接收邮件。第12章邮件客户端·2·12.1.4XStream简介XStream是一个简单的Java库,它可以将Java对象转换成XML,也可以将XML转换成Java对象。在本章中,我们从远程的邮件服务器得到邮件后,需要下载到本地进行保存,再将远程邮件服务器中的邮件删除,这样当我们浏览邮件的时候,可以不必再从远程的邮件服务器下载,提高了邮件客户端的性能。由于本章中不涉及数据库应用,因此可以将邮件转换成一些XML格式的文件,保存在本地系统中,每次操作邮件的时候,都可以对这些XML文件进行操作,提高了邮件客户端的性能。我们可以从下面的网址得到XStream:本章中所使用的版本为1.3.1,下载后将lib下的xstream-1.3.1.jar包与xpp3_min-1.1.4c.jar的包加到项目的CLASS_PATH中即可使用XStream的API。JavaMail和XStream的使用将在以下章节介绍如何使用。12.2建立界面在开发邮件的主要功能前,我们先建立相关的界面。我们需要先确定要些什么界面,首先,当然是需要一个进入系统的界面(登录),让用户去输入用户名,根据用户名去建立与这个用户名相关的用户信息。接下来,需要建立一个主界面,用来进行查看邮件、发送邮件、接收邮件和处理邮件等操作,然后,还需要有一个配置界面,让用户去配置邮箱(用户名和密码)、SMTP协议和POP3协议等信息,最后,需要提供一个写邮件的界面,让用户去输入邮件信息,并发送到具体的地址。12.2.1登录界面我们需要提供一个登录界面,让用户确定用户名,我们这里并不需要进行密码验证,因为用户能否连入他的邮件,取决于对邮箱的配置。登录界面如图12.1所示。图12.1登录界面登录界面十分简单,一个输入框和两个按钮就构成了登录界面,点击取消就退出客户端。该界面对应的Java类为项目中的LoginFrame。12.2.2客户端主界面客户端的主界面需要进行各种的邮件处理,因此界面相对较为复杂,主界面的最终效果如图12.2所示。第12章邮件客户端·3·图12.2客户端主界面图12.2中客户端的主界面中结构较为复杂,图12.2中的①区域,是一棵导航树,点击不同的链接,可以进入到收件箱、发件箱、已发送、草稿箱和垃圾箱中,当我们点击导航树上的各个节点时,②区域的列表就显示不同类型的邮件,当我们点击了②区域列表中的某一封邮件时,邮件的主要信息就会显示在④区域,该邮件的附件就会显示在③区域,⑤区域是一个工具条,存放对邮件的各个操作,该工具条所定义操作分别有(图12.2的区域⑤由左往右):收取邮件:到远程的邮件服务器中收取新收的邮件。发送邮件:当用户选择了某一份在发件箱、已发送、草稿箱和垃圾箱的邮件时,就弹出写邮件的界面,将选择的邮件信息显示到写邮件的界面。写邮件:弹出写邮件的界面,让用户编写邮件。回复邮件:当用户选择了某一份邮件点击回复时,弹出写邮件的界面。转发邮件:与回复邮件一样,但是转发时收信人为空。删除邮件:将所选择的邮件放到垃圾箱中。彻底删除邮件:在本系统中彻底删除该邮件,一旦删除,将不可被还原。还原邮件:将在垃圾箱中的邮件还原到原来的目录。设置:配置用户邮箱相关的信息,包括账号、密码、SMTP协议与POP3协议等。客户端主界面对应的类为MainFrame。实现图12.2的界面,需要注意的是导航树的实现,由于在外观上这并不是一棵树,但在本章中使用了树,以下是导航树的实现代码,MainFrame的createTree方法。代码清单:code\foxmail\src\org\crazyit\foxmail\ui\MainFrame.java第12章邮件客户端·4·//创建导航的树privateJTreecreateTree(){//创建根节点DefaultMutableTreeNoderoot=newDefaultMutableTreeNode();//加入各个子节点root.add(newDefaultMutableTreeNode(newInBox()));root.add(newDefaultMutableTreeNode(newOutBox()));root.add(newDefaultMutableTreeNode(newSentBox()));root.add(newDefaultMutableTreeNode(newDraftBox()));root.add(newDefaultMutableTreeNode(newDeletedBox()));//创建树JTreetree=newJTree(root);//加入鼠标监听器tree.addMouseListener(newSailTreeListener(this));//隐藏根节点tree.setRootVisible(false);//设置节点处理类SailTreeCellRenderercellRenderer=newSailTreeCellRenderer();tree.setCellRenderer(cellRenderer);returntree;}以上的代码中,使用了五个Box的类:InBox、OutBox、SentBox、DraftBox和DeletedBox,这五个类分别代码着导航树中的五个不同链接。另外还有一个鼠标监听器类和节点处理类,以下为五个Box类的实现。代码清单:code\foxmail\src\org\crazyit\foxmail\box\MailBox.javapublicinterfaceMailBox{//获得box名字StringgetText();//返回对应图标ImageIcongetImageIcon();}再新建一个接象类,给五个Box类去继承。代码清单:code\foxmail\src\org\crazyit\foxmail\box\AbstractBox.javapublicabstractclassAbstractBoximplementsMailBox{//该box所对应的图片(显示在树上的图片)privateImageIconicon;//实现接口的方法publicImageIcongetImageIcon(StringimagePath){if(this.icon==null){this.icon=newImageIcon(imagePath);}returnthis.icon;}//重写toString方法,调用接口的getText方法,getText方法由子类去实现publicStringtoString(){returngetText();}}五个Box类只需要去继承AbstractBox并实现getText方法即可,以下为InBox类的实现。代码清单:code\foxmail\src\org\crazyit\foxmail\box\InBox.java第12章邮件客户端·5·publicclassInBoxextendsAbstractBox{publicStringgetText(){return收件箱;}publicImageIcongetImageIcon(){returnsuper.getImageIcon(images/in-tree.gif);}}InBox类代表树中的收件箱节点,只需要返回文字与图片即可。其他的四个Box类与InBox实现一样,这里不贴出代码,具体可看本书所附的代码。实现了五个Box后,我们可以在树中使用这五个Box,以下是导航树的鼠标事件监听器类。代码清单:code\foxmail\src\org\crazyit\foxmail\ui\SailTreeListener.javapublicclassSailTreeListenerextendsMouseAdapter{privateMainFramemainFrame;publicSailTreeListener(MainFramemainFrame){this.mainFrame=mainFrame;}publicvoidmousePressed(MouseEvente){//暂时提供空实现}}一个简单的监听器类,鼠标的点击方法没有实现,我们在下面章节会提供实现。以下代码是树的节点处理类SailTreeCellRenderer。代码清单:code\foxmail\src\org\crazyit\foxmail\ui\SailTreeCellRenderer.javapublicclassSailTreeCellRendererextendsDefaultTreeCellRenderer{//树节点被选中时的字体privateFontselectFont;publicSailTreeCellRenderer(){this.selectFont=newFont(null,Font.BOLD,12);}publicComponentgetTreeCellRendererComponent(JTreetree,Objectvalue,booleansel,booleanexpanded,booleanleaf,introw,booleanhasFocus){DefaultMutableTreeNodenode=(DefaultMutabl