文档详情

支持全文检索的邮件代理服务平台 ——用户注册管理及JavaMail的应用与实现

r****d
实名认证
店铺
DOC
867.50KB
约44页
文档ID:155400369
支持全文检索的邮件代理服务平台 ——用户注册管理及JavaMail的应用与实现_第1页
1/44

目 录摘要 1ABSTRACT 2第1章 引言 31.1 选题的背景和意义 31.2 国内外研究现状 31.3 本文结构 4第2章 相关知识介绍 52.1 开发平台 52.2 J2EE 标准概述 52.3 JSP简介及优势 62.4 Servlet概述 62.5 JavaBean概述 72.6 Lucene概述及优点 72.7 JavaMail API简介 7第3章 总体设计 93.1 系统总体框架 93.2 系统功能层次 93.3 数据库结构 10第4章 局部系统模块详细设计与实现 134.1 注册登录模块 134.2 邮件管理模块 154.3 本章小结 18第5章 邮件收发模块设计与实现 195.1 邮件的结构 195.2 邮件的发送 195.3 邮件的接收 215.4 JMS模块 255.5 本章小结 27第6章 总结 286.1 系统总结 286.2 局部效果图 286.3 开展前景 30致谢 31参考文献 32附录 33支持全文检索的邮件代理效劳平台——用户注册管理及JavaMail的应用与实现摘要:电子邮件是在Internet上应用广泛的通信方式,它可以有效地进行电子化的数据异地交换。

支持全文检索的邮件代理效劳平台,是为了解决用户对多个邮箱的管理问题,同时具备全文检索功能该系统是基于J2EE平台开发的,用JavaMail收发邮件,用Lucene实现全文检索在开发过程中使用了JavaBean,JSP,Servlet,Java消息效劳等关键技术实现MVC模式该系统采用B/S运行模式,用户既可以对多个邮箱进行管理,同时还可以摆脱C/S运行模式带来的麻烦关键词:全文检索;J2EE平台;Lucene;JavaMail;Java消息效劳Support Full-text Search Platform for E-mail Proxy Service——Register Management and Application of JavaMailAbstract: E-mail application in a wide range of Internet communications means that it can effectively carry out the electronic exchange of data in different places. Support full-text search platform for e-mail proxy service, users to address the management of multiple mailboxes at the same time have the full-text search function. The system was developed based on the J2EE platform, to achieve full-text search using Lucene. Used in the development of a JavaBean, Java Server Page, Servlet, Java Message Service and other key technologies to achieve MVC model. The system uses B/S mode, the user can manage multiple mailboxes, but also can get rid of C/S mode of operation brought about by the trouble.Key words: Full-text Search; J2EE; Lucene; JavaMail; Java Message Service第1章 引言 选题的背景和意义 选题的背景在Internet飞速开展的今天,电子邮件仍然是Internet主要应用效劳之一。

通过电子邮件,人们可以快捷方便地与世界上任何一个网络用户联络,这些电子邮件可以包含文字、图像、声音、或其他多媒体信息据统计,在全球范围来看,四分之三以上的用户上网的主要目的是收发邮件,每天又数亿封电子邮件在全球传递电子邮件成为了用户不可或缺的通信工具上世纪80年代中期,个人电脑兴起,电子邮件开始在电脑迷以及大学生中广泛传播开来到上世纪90年代中期,互联网浏览器诞生,全球网民人数激增,电子邮件被更为广泛使用,越来越多的用户有多个邮箱用户如果每天都一个一个邮箱的收发邮件,那将非常麻烦,耗时费力,有时甚至由于混淆帐户和密码,不能正常收发邮件对邮件进行有效收发,并能迅速获取有用信息,成为每个邮箱用户所求支持全文检索的邮件代理平台就是为了顺应这种趋势而产生的 选题的意义该选题的实现有以下几个意义:1) 解决用户对多个邮箱的邮件的管理问题,进入该邮件代理效劳平台后,只要用户事先设置好邮箱帐号和密码,一旦联网就可以自动收取邮件,省去单个邮箱收发邮件带来的麻烦;2) 该代理效劳器采用B/S运行模式,用户不需要安装客户端软件,仅需一个浏览器,就可以访问;3) 具备全文检索功能,方便用户快捷、高效获取有用信息。

国内外研究现状虽然作为后台的邮件的效劳器种类繁多,但是它们都提供标准的连接端口和协议,方便各种客户端软件或者应用程序收发邮件效劳器上的信件作为一个用户,可能会使用各种客户端软件或者使用各种基于Web的邮件效劳系统来处理自己的信件目前,我们最常用的客户端的用户邮件程序主要有两种:一个是微软公司的Outlook Express,另一个是国内开发的Foxmail,不管是从功能上还是操作方便程度上来讲,两种用户邮件程序都各具特色,足以代表众多的此类软件Outlook Express是由美国微软公司(Microsoft)出0PP的免费软件,与Internet Explorer浏览器软件捆绑发行;Foxmail是由国人张小龙编写的一个功能强大非商业软件,它实现了真正的多用户、多帐户、多POP3支持,自动进行拨号,能设置邮件过滤功能,能阅读和收发Big5码的邮件,可以直接查看HTML格式邮件虽然客户端软件可以提供强大的功能,但是它有比拟大的缺陷用户首先必须知道如何去配置该客户端软件,而这些配置过程也是比拟复杂,不是每一个使用的用户都可以很快就可以学会使用的另外,收发的邮件都必须存放在本地,当用户使用不同的机器的时候,就会带来很多不便。

而具有Web的邮件效劳系统,就非常好的解决了这个问题用户只要可以连接所在邮箱的Web效劳器,就可以在任何时间,任何地点,收发自己的邮件了因此,目前很多效劳提供商(如163,21cn等)对其用户提供的基于Web的电子邮件效劳 本文结构本文共分为七章第一章介绍了支持全文检索的邮件代理效劳平台的开发背景、目的和意义以及国内外研究现状;第二章介绍系统开发平台和以及给出相关技术的简单介绍;第三章介绍本系统的整体设计,功能模块分析,及数据库分析设计;第四章介绍用户注册登录、邮箱管理的详细设计与实现;第五章介绍用JavaMail收发邮件,并给出JMS的工作原理及应用;第六章进行工作总结第2章 相关知识介绍 开发平台本系统是在Windows xp sp2环境下开发的,开发工具是:,,采用的效劳器是Sun Java Application S,所用数据库是Oracle 9i2.2 J2EE 标准概述J2EE(Java 2 Platform,Enterprise Edition〕是SUN公司提出开发、装配和部署的基于Java分布式应用的标准平台,它以Java 2平台标准版(J2SE)为核心,是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构,其应用程序模型起始于Java程序语言和Java虚拟及。

J2EE不仅稳固了标准版中的许多优点,在其之上还增添了大量企业级管理软件根底结构和Web效劳所需要的支持软件工具J2EE是成长很快的技术应用框架,全球很多信的应用是由J2EE分布式应用体系支撑的J2EE还是一种技术标准,它给开发人员提供了一种工作平台,它定义了整个标准的应用开发体系结构和一个部署环境在这个体系结构中,应用程序开发人员可以集中于封装商业逻辑和商业规那么上,一切于根底结构效劳相关的问题已及底层分配问题都由应用程序容器或者效劳器来处理这样J2EE应用程序开发人员可以集中考虑应用程序的逻辑和相关的效劳,而把所有的根底结构相关的效劳交由运行环境实现 J2EE的功能1) 通过Servlet建立与Web效劳器的交互界面,Servlet能够提供 请求的响应元素;2) 支持会话,J2EE许多组件提供会话的内置支持;3) 通过EJB实现自动会话与事务支持,EJB可以映射与用户交互的数据;4) 通过JDBC实现数据库端的事务支持,联合JTA实现分布式事务处理;5) 使用JSP为用户提供灵活、可选择的动态界面;6) 提供基于JMS、JavaMail的消息效劳;7) 提供基于JNDI的目录效劳,为用户查找组件对象提供统一接口;8) 内置对XML的支持,方便建立B2B、B2C电子商务应用。

JSP简介及优势JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp) JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑网页还能通过tags和scriptlets访问存在于效劳端的资源的应用逻辑JSP将网页逻辑与网页设计和显示别离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易Web效劳器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能JSP与Java Servlet一样,是在效劳器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览JSP具备以下强势:1) 一次编写,到处运行。

在这一点上Java比PHP表更出色,除了系统之外,代码不用做任何更改;2) 系统的多平台支持根本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展相比ASP/PHP的局限性是显而易见的;3) 强大的可伸缩性从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台效劳器进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台效劳器到无数台效劳器,Java显示了一个巨大的生命力;4) 多样化和功能强大的开发工具支持这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下 Servlet概述一个servlet就是Java编程语言中的一个类,它被用来扩展效劳器的性能,效劳器上驻留着可以通过“请求-响应〞编程模型来访问的应用程序虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web效劳器的应用程序Java Servlet技术为这些应用程序定义了一个特定于 的servlet类和包为编写servlet提供了接口和类所有的servlet都必须实现Servlet接口,该接口定义了生命周期方法。

当实现一个通用的效劳时,您可以使用或扩展由Java Servlet API提供的GenericServlet类 Servlet类提供了一些方法,诸如doGet和doPost,以用于处理特定于 的效劳 JavaBean概述JavaBean是一种JAVA语言写成的可重用组件为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露称为属性众所周知,属性名称符合这种模式,其他Java类可以通过自省机制发现和操作这些JavaBean属性用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变 Lucene概述及优点Lucene是apache软件基金会jakarta工程组的一个子工程,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,局部文本分析引擎。

Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为根底建立起完整的全文检索引擎Lucene作为一个全文检索引擎,其具有如下突出的优点:1) 索引文件格式独立于应用平台Lucene定义了一套以8位字节为根底的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件;2) 在传统全文检索引擎的倒排索引的根底上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度然后通过与原有索引的合并,到达优化的目的;3) 优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能;4) 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口;5) 已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询、分组查询等等2.7 JavaMail API简介JavaMail API[1]是一种可选的、能用于读取、编写和发送电子消息的包可使用这种包创立邮件用户代理类型的程序,它类似于Eudora、Pine及Microsoft Outlook这些邮件程序。

其主要目的不是像发送邮件或其他邮件传输代理类型的程序那样用于传输、发送和转发消息JavaMail API具有会话、消息、地址、验证程序、传输、存储和文件夹1) Session:Session类定义了一个根本邮件会话,是JavaMail API最高层入口类所有其它类都是经由这个session才得以生效Session对象用对象获取信息,如邮件效劳器、用户名、密码及整个应用程序中共享的其它信息2) Message:一旦获得Session对象,就可以继续创立要发送的消息这由Message 类来完成因为Message是个抽象类,必需用一个子类,多数情况下为MimeMessage是个能理解MIME类型和头的电子邮件消息,正如不同RFC中所定义的虽然在某些头部域非ASCII字符也能被译码,但Message头只能被限制为用US-ASCII字符3) Address:一旦您创立了Session和Message,并将内容填入消息后,就可以用Address确定信件地址了和Message一样,Address也是个抽象类您用的是 Java类4) Authenticator:与类一样,JavaMail API也可以利用Authenticator通过用户名和密码访问受保护的资源。

对于JavaMail API来说,这些资源就是邮件效劳器JavaMail Authenticator在包中,而且它和中同名的类Authenticator不同两者并不共享同一个Authenticator,因为JavaMail API用于,它没有类别要使用Authenticator,先创立一个抽象类的子类,并从getPasswordAuthentication()方法中返回PasswordAuthentication实例创立完成后,您必需向session注册Authenticator然后,在需要认证的时候,就会通知Authenticator您可以弹出窗口,也可以从配置文件中〔虽然没有加密是不平安的〕读取用户名和密码,将它们作为PasswordAuthentication对象返回给调用程序5) Transport:消息发送的最后一局部是使用Transport类这个类用协议指定的语言发送消息〔通常是SMTP〕它是抽象类,它的工作方式与Session有些类似仅调用静态send()方法,就能使用类的缺省版本:Transport.send(message);或者,读者也可以从针对自己的协议的会话中获得一个特定的实例,传递用户名和密码〔如果不必要就不传〕,发送消息,然后关闭连接。

6) Store:Store类实现特定邮件协议上的读、写、监视、查找等操作通过类可以访问类7) Folder:Folder类用于分级组织邮件,并提供照格式访问email的能力第3章 总体设计 系统总体框架框架图能形象描绘一个事物结构组成、功能和大概的实现方法该系统总体框架图如图3-1所示图3-1 系统框架图3.2 系统功能层次该系统按照实现的功能来分,可分为六个功能模块:1) 注册登录:所有用户在登录之前必需先注册;2) 邮件管理:用户查看或删除收件箱邮件和已发邮件;3) 邮件收发:用户可以接收邮件,也可编辑邮件,并发送邮件;4) 邮箱管理:用户可以添加新邮箱,修改邮箱,删除邮箱;5) 用户管理:用户可以修改密码等个人资料;6) 邮件检索:用户可按照自己的意愿索引和搜索邮件功能层次图用来直观地描述系统的功能层次,本系统的功能层次图如图3-2所示支持全文检索的邮件代理效劳平台注册登录邮件管理邮件收发邮件检索邮箱管理用户管理注册登录查看邮件删除邮件发送邮件修改邮箱删除邮箱修改密码索引邮件搜索邮件添加邮箱接收邮件图3-2 功能层次图3.3 数据库结构 关系数据库设计计算机处理的大多数是数据,因而数据的组织是关键,也是使用计算机处理事半功倍的根底,而该系统在处理邮件时,涉及大量数据,采用E-R图方法(Entity-Relationship Approach)将现实数据转化为计算机信息。

根据前面分析的系统的各种功能要求,得到该系统所需的数据实体共有四个,采用E-R图分析得到以下主要数据对象及其关系如图3-3所示,用户信息包括用户名和密码这两个信息用户信息用户名密码图3-3 用户信息E-R图如图3-4所示,一个邮箱包括三个根本信息,帐户名和密码是由用户所申请的邮箱决定的,ID即为邮箱添加到数据库中的编号邮箱帐户名密码ID图3-4 邮箱E-R图如图3-5所示,一个邮件往往包括7个属性信息统的各种功能要求,得到该系统所需的数据实体共有四个,采用E-R图分析得到以下主要数据对象及其关系邮件sid收件人你人发件人人标题内容ID时间状态图3-5 邮件E-R图 数据库信息表由.1节中的E-R图,可以创立以下四个信息表,各字段的具体设置如表3-1到表3-4所示表3-1用户信息表users字段名数据类型能否为空备注USERNAMEVARCHAR2(50)No用户名PASSWORDVARCHAR2(50)No密码说明:当用户注册成功时,就会用执行insert into users(username,password) values(?,?),插入用户信息当插入成功时,就会创立三个数据库表,说明分别为username+〞MAIL〞,username+〞MAILTO〞,username+〞MAILBOX〞。

表3-2用户收到的邮件username+〞MAIL〞字段名数据类型能否为空备注SIDNUMBERNO邮件编号IDVARCHAR2(100)NOID序列MAILFROMVARCHAR2(100)NO收件人MAILTOVARCHAR2(100)NO发件人SUBJECTVARCHAR2(200)NO标题CONTENTCLOBYes内容TIMEVARCHAR2(30)NO时间STATEVARCHAR2(2)Yes状态说明:State字段标记邮件是否被删除;当State设置为’0’时,表示收件箱的邮件已被删除表3-3用户发送的邮件username+〞MAILTO〞字段名数据类型能否为空备注SIDNUMBERNO邮件编号IDVARCHAR2(100)NOID序列MAILFROMVARCHAR2(100)NO收件人MAILTOVARCHAR2(100)NO发件人SUBJECTVARCHAR2(200)NO标题CONTENTCLOBYes内容TIMEVARCHAR2(30)NO时间STATEVARCHAR2(2)Yes状态说明:删除该表中的邮件时是直接采用delete删除表3-4邮箱的信息表username+〞MAILBOX〞字段名数据类型能否为空备注IDNUMBERYESIDEMAILVARCHAR(50)YESEmail地址PASSWORDVARCHAR(50)YESEmail密码 说明:用户添加、删除、更新邮箱时,就是对该表进行add,delete,update操作。

第4章 局部系统模块详细设计与实现 注册登录模块 注册任何使用该邮件效劳平台的用户,必须先注册,方可登录其操作的流程图如图4-1所示 用户输入用户名是否是合法的用户名用户输入密码两次输入的密码是否一致将用户名和密码存入数据库并建表是否成功注册成功图4-1 用户注册流程图开始结束否是否是否是注册时,系统在后台的操作是,先创立一个用户u,并根据用户输入的合法用户名设置u的用户名,设置u的密码(经过DES加密了的密码),然后往数据库users中添加用户u,如果添加成功,那么根据u的用户名创立三个表,这三个表的命名机制在第三章中的.2.数据库信息表已给出如果三个表创立成功,那么系统输出“恭喜您!注册成功〞并进入登录界面;否那么输出“用户名已被用!〞,并返回注册页面数据库的操作是:1) 将新注册的用户保存到数据库users中"insert into users(username,password) values(?,?)";2) 根据用户名创立用于保存邮箱的数据表"create table "+ username+ "mailbox(id number not null, email varchar2(50) not null, password varchar2(50) not null)"; 3) 根据用户名创立用于保存邮件的数据表"create table "+ username+ "MAIL(SID NUMBER not null, ID VARCHAR2(100) not null, MAILFROM VARCHAR2(100) not null, MAILTO VARCHAR2(100) not null, SUBJECT VARCHAR2(200) not null, CONTENT VARCHAR2(4000),TIME VARCHAR2(30) not null, STATE VARCHAR2(2))";4) 根据用户名创立用于保存已发送的邮件的数据表"create table "+ currentUser+ "MAILTO(SID NUMBER not null, ID VARCHAR2(100) not null, MAILFROM VARCHAR2(100) not null, MAILTO VARCHAR2(100) not null, SUBJECT VARCHAR2(200) not null, CONTENT VARCHAR2(4000),TIME VARCHAR2(30) not null, STATE VARCHAR2(2))"; 登录已经注册的用户可以登录邮件效劳代理平台。

登录操作过程如图4-2所示系统在后台进行的主要处理为:1) 由request对象获取用户名和密码String username=request.getParameter("username");String password=DES.encrypt(request.getParameter("password"));2) 根据用户名username,在数据库中查找用户名为username的用户并获取用户的密码,并进行密码核对UserDAOJdbc udj=new UserDAOJdbc();User u=udj.getUser(username);执行的数据库操作是:"select * from users where username=?";用户输入用户名和密码根据用户名从数据库中读取密码两个密码进行比拟是否相同登录成功图4-2 用户登录流程图是否开始结束 邮件管理模块邮件管理模块就是对收件箱和已发邮件进行查看或删除邮件的操作 邮件的查看邮件的查看就是为了方便用户清楚收件箱和已发邮件中的邮件信息用户点击【收件箱】或【已发邮件】后,可以阅读邮件这时,系统将邮件的收件人、邮件主题、收件人以及邮件日期信息以列表形式显示出来,每十封邮件组成一页,设置序列号为奇数的邮件背景色为灰色。

在该邮件列表中选中某封邮件并单击【查看】按钮后,就可以看到当前邮件的详细信息,包含发件人,收件人,主题和内容等查看邮件的具体实现是:1) 判断用户是否已登录,要求用户先登录邮件代理平台;2) 由request获取所点击邮件对应的id;3) 根据所获id跳转到显示id邮件的页面,显示邮件具体信息主要执行的数据库操作是:"select * from " + currentUser + "mail where id='"+ id+"'";"select * from " + currentUser + "mailto where id='"+ id+"'";实现的主要代码如下:String id="";if(!currentUser.equals("")){mail.MailMessage msg=new mail.MailMessage();if(request.getParameter("id")!=null){ id=request.getParameter("id").toString(); if(id.charAt(0)!='<') response.sendRedirect("mailToDisplay.jsp?id="+id); else msg=new MessageDAOJdbc().getMessage(currentUser,id);} 邮件的存储邮件的存储分为收件箱中的邮件存储和已发邮件的存储。

1) 收件箱中的邮件存储由于收件箱中的邮件是来自于用户已经设置好的邮箱,而这是通过利用JavaMail编写的邮件接收程序来收的这邮件接收程序并不是与我们一般所想象的那样,当接收到邮件时,即将邮件存入数据库,而是当接收到一封邮件时,接收程序将一封邮件封装成一个JMS的对象型消息,并将消息发送到效劳器配置好的消息队列中去此时,EJB容器将通过消息驱动Bean来处理消息,即解析收到的消息,并进行相应的处理在这个处理当中,就将原来收到的邮件存入了数据库,这是异步的消息处理机制系统采用这种处理方式,大大地增加了系统的吞吐量具体实现步骤如下:a) 当邮件接收程序接收到邮件时,将邮件封装成一个本地的邮件对象MailMessageb) 通过JNDI查找JMS队列的连接工厂和消息的目的地,得到一个连接目的地c) 通过连接创立一个会话,并通过会话创立一个消息生产者和一个对象型的消息d) 将本地的邮件对象放入对象型的消息中e) 消息生产者将对象型的消息发送到消息队列中f) 消息驱动Bean处理消息核心代码是:InitialContext ctx;QueueConnection conn = null;ObjectMessage omsg = null;javax.jms.Session s = null;MessageProducer p = null;ctx = new InitialContext();//上下文QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("jms/QueueConnectionFactory");//查找队列连接工厂conn = factory.createQueueConnection();//通过连接工厂得到一个连接s = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);//创立一个会话Destination des = (Destination) ctx.lookup("jms/mailQueue");//通过上下文得到发送的目的地p = s.createProducer(des);//根据会话和目的地创立发送消息的生产者omsg = s.createObjectMessage();//根据会话创立消息对象JMSMessage jmsg = new JMSMessage();//创立一个对象性的消息jmsg.setUsername((path + u.getCurrentUser()));//设置用户名jmsg.setMsg(msg);//设置消息omsg.setObject(jmsg);//将产生的消息内容放到Object类型的消息中p.send(omsg);//发送消息s.close();//关闭会话conn.close();//关闭连接2) 已发邮件的存储已发邮件的存储处理与收件箱中的邮件存储处理是完全不同的。

已发邮件的存储是在邮件发送之前就处理了的,是直接存入数据库,执行的数据库操作是:“insert into〞 + currentUser+"mailto(sid,id,mailfrom,mailto,subject,content,time,state) values(" + currentUser+ "_seq.nextval,?,?,?,?,?,?,1)";4.2.3 邮件的删除在邮件管理中删除一些无关紧要的邮件对用户来说非常重要邮件的删除分为对收件箱中邮件的删除和已发邮件的删除对收件箱的邮件的删除,并没有真正把它从数据库中删除,只是将它的状态设置为0,即不活泼状态,这主要是为了预防系统屡次从邮箱效劳器上面接收并保存用户要删除的邮件对已发邮件的删除,那么是彻底的将邮件从数据库中删除,以释放更多的存储空间当用户选择某邮件并点击【删除】按钮时,系统将弹出【您真的要删除吗?】提示框,只有用户点击【确认】后才能删除邮件,这是为了防止用户的失误所带来的严重后果删除收件箱的邮件时执行的操作是:"update " + currentUser+ "mail set state='0' where id='" + id+"'";而删除已发邮件的操作是:"delete from " + currentUser+ "mailto where id='" + id+"'"; 本章小结本章主要是讲解邮件效劳平台在后台的数据库操作。

用户注册时,使用insert将新用户插入到数据表users中,并用create创立与注册用户名相关的三个数据表;用户登录时,select提取数据库信息,并进行信息核对;用户查看邮件时,用到了select选择指定邮件的操作;用户存储时用到了Insert操作,将邮件保存到数据库;邮件的删除分为两种情况,当删除收件箱的邮件时,将要删除邮件的状态设置为0就好,进行update操作,当删除已发邮件时,直接执行delete操作第5章 邮件收发模块设计与实现5.1 邮件的结构一封标准的电子邮件主要由邮件头和邮件体两大局部组成它们之间以一个空白行进行分隔当邮件体被分为多个段时,每个段又包含段头和段体两局部这两局部之间也以空行分隔邮件头包括发件人、收件人、主题、日期、邮件内容的类型等重要信息邮件头的结构较为复杂,通常由多个头字段和字段内容组成,如from、to、date、subject邮件体,即为我们所说的邮件内容邮件的结构组成如图5-1所示图5-1 邮件组成结构5.2 邮件的发送SMTP〔Simple Mail Transfer Protocol〕即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规那么,由它来控制信件的中转方式。

SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地通过SMTP协议所指定的效劳器,我们就可以把E-mail寄到收信人的效劳器上了,整个过程只要几分钟SMTP效劳器那么是遵循SMTP协议的发送邮件效劳器,用来发送或中转你发出的电子邮件1 SMTP协议获取邮箱地址的组成形式是:登录名@主机名.域名根据邮箱地址的主机名.域名得到smtp协议的主机字符串,其对应关系如表5-1所示表5-1 smtp协议对应表trSmtp协议的主机字符串EGSmtp.gmail :465YSmtp.mail.yahoo :465其他“smtp.〞+str5.2.2 邮件发送的详细过程邮件的发送即是信息的封装,然后经过网络发送的过程其信息的封装与信息的解析(图5-2所示)刚好是互逆的封装消息的具体实现是:mm.setId(String.valueOf(new java.util.Date().hashCode()));//设置idmm.setMailfrom(from);//设置发件人mm.setMailto(to);//设置收件人mm.setSubject(subject);//设置主题mm.setContent(content);//设置内容mm.setTime(new java.util.Date().toLocaleString());//设置时间消息封装之后就可以发送邮件。

邮件发送的具体步骤是:1) New一个Properties对象,设置和属性;2) 同过Session的静态方法,获取一个Session实例;3) 根据Session创立一个MimeMessage实例message;4) 设置message对象属性;5) 创立MimeBodyPart实例和Mulipart(MimeMulpart)实例;6) 设置BodyPart邮件文本内容;7) 将MimeBodyPart实例添加到Mulipart实例中;8) 使用Transport发送邮件实现的具体代码是:Properties props = new Properties();props.put("mail.smtp.host", host);props.put("mail.smtp.auth", "true");Session s=Session.getInstance(props);s.setDebug(true);MimeMessage message = new MimeMessage(s);message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));message.setSubject(subject);Multipart multipart = new MimeMultipart();BodyPart contentPart = new MimeBodyPart();contentPart.setText(content);multipart.addBodyPart(contentPart);message.setContent(multipart);message.saveChanges();Transport transport = s.getTransport("smtp");try{ transport.connect(host, username,password); transport.sendMessage(message, message.getAllRecipients()); transport.close();}catch(Exception e){ out.println("有可能您的邮箱不支持SMTP和POP3协议,邮件发送失败! ");}5.3 邮件的接收POP3(Post Office Protocol 3)即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件效劳器和下载电子邮件的电子协议。

它是因特网电子邮件的第一个离线协议标准,POP3允许用户从效劳器上把邮件存储到本地主机〔即自己的计算机〕上,同时删除保存在邮件效劳器上的邮件,而POP3效劳器那么是遵循POP3协议的接收邮件效劳器,用来接收电子邮件的5.3.1 POP3协议获取与SMTP协议获取相似,由用户邮箱地址的主机名.域名得到POP3协议的主机字符串,其对应关系如表5-2所示表5-2 pop3对应协议表POP3协议的主机字符串sohu popeyou Pop3YPop.mail.yahoo :995其他的str“Pop.〞+str5.3.2 邮件接收的详细过程邮件的接收即是从邮件效劳器上获取邮件并对邮件的进行解析,然后保存到收件箱的过程其邮件的解析过程如图5-2所示图5-2 邮件解析解析的步骤:1) 通过邮件接收程序得到一封邮件;2) 用JavaMail包中提供的方法来解析邮件,包括邮件ID、发件人、收件人、主题和时间;3) 通过getContent()方法来得到邮件的内容,这是一个递归的过程,直到得到邮件的文本内容为止邮件message解析的实现的核心代码是:public void getMailContent(Part part) throws Exception { String contenttype = part.getContentType(); int nameindex = contenttype.indexOf("name"); boolean conname = false; if (nameindex != -1) conname = true; if (part.isMimeType("text/html") && !conname) { bodytext.append((String) part.getContent()); } else if (part.isMimeType("text/plain") && !conname) { bodytext.append((String) part.getContent()); } else if (part.isMimeType("multipart/*")) { Multipart multipart = (Multipart) part.getContent(); int counts = multipart.getCount(); for (int i = 0; i < counts; i++) { getHtmlContent(multipart.getBodyPart(i)); } } } public void getHtmlContent(Part part) throws Exception { String contenttype = part.getContentType(); int nameindex = contenttype.indexOf("name"); boolean conname = false; if (nameindex != -1) conname = true; if (part.isMimeType("text/html") && !conname) { bodytext.append((String) part.getContent()); } else if (part.isMimeType("multipart/*")) { Multipart multipart = (Multipart) part.getContent(); int counts = multipart.getCount(); for (int i = 0; i < counts; i++) { getHtmlContent(multipart.getBodyPart(i)); } } }具体的操作是:1) 连接数据库,获取当前用户的所有邮箱信息;2) 根据属性创立会话session实例;3) 根据邮箱帐户名、密码和POP3协议的主机字符串,会话session通过pop3连接到邮箱效劳器的收件箱,读取邮件;4) 由邮件头获取发信人、主题、时间、内容类型等信息;5) 采用递归方法解析邮件体,直至得到纯文本文件“text/plain〞;6) 将解析后的邮件组装成JMS的对象型消息;7) 将消息发送到效劳器提供的消息队列中。

实现的核心代码如下:Properties props = new Properties();javax.mail.Session session = javax.mail.Session.getDefaultInstance(props, null);Store store; try { store = session.getStore("pop3"); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); MailMessageUtil pmm = null; for (int i = 0; i < message.length; i++) { try { pmm = new MailMessageUtil((MimeMessage) message[i]); mail.MailMessage msg = new mail.MailMessage(); msg.setId(pmm.getId()); msg.setMailfrom(pmm.getFrom()); msg.setMailto(pmm.getTO("to")); msg.setSubject(pmm.getSubject()); pmm.getMailContent((Part) message[i]); msg.setContent(pmm.getContent()); pmm.setDateFormat("yyyy-MM-dd HH:mm:ss"); msg.setTime(pmm.getTime()); msg.setState("1"); InitialContext ctx; QueueConnection conn = null; ObjectMessage omsg = null; javax.jms.Session s = null; MessageProducer p = null; ctx = new InitialContext();QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("jms/QueueConnectionFactory"); conn = factory.createQueueConnection(); s = conn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE); Destination des = (Destination) ctx.lookup("jms/mailQueue"); p = s.createProducer(des); omsg = s.createObjectMessage(); JMSMessage jmsg = new JMSMessage(); jmsg.setUsername((path + u.getCurrentUser())); jmsg.setMsg(msg); omsg.setObject(jmsg); p.send(omsg); s.close(。

下载提示
相关文档
正为您匹配相似的精品文档