




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计(论文)-中国论文教育学院 毕 业 设 计(论 文)题目 基于JavaMail的电子邮件系统的设计与实现第1章 前 言1.1 概述电子邮件(简称E-mail)又称电子信箱、电子邮政,它是一种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是一个简易、快速的方法。通过连接全世界的Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mail不止局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。电子邮件不是一种“终端到终端”的服务,是被称为“存贮转发式”服务。这正是电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,扔可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件,不受时空限制。1.2 国内现状电子邮件E-mail是Internet最基本的和最重要的服务之一。据统计,Internet上百分之三十以上的业务量是电子邮件。由于我国的通讯基础设施较差,网络速度较慢,因而,与Internet其它功能如WWW、FTP、NEWS等相比,电子邮件服务具有更大的实用性。CINNIC中国互联网络发展状况统计报告中指出。71.65%的中国用户最常使用的网络服务就是电子邮件,这个比例远远高于搜索引(50.40%)和软件上传或下载服务(44.16%)等其他服务。1.3 系统特点本系统分析中给出了电子邮件服务器和电子邮件客户端的简介,同时给出了本次试验中客户端的主要功能和总体框图。邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器;接收邮件服务器使用接收邮件协议,常用的有POP3协议和IMAP协议,所以通常接收邮件服务器也称为POP3服务器或IMAP服务器。SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,是Internet传送E-mail的基本协议,也是TCP/IP协议组的成员。SMTP协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。SMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。SMTP协议由于非常简单,使得它得到了广泛的运用,在Internet上能够发送邮件的服务器几乎都支持SMTP协议。POP3(Post Office Protocol 3),即邮局协议第3版,是 Internet接收邮件的基本协议,也是TCP/IP协议组的成员。RFC1939描述了POP3协议,网址为“/rfc/rfc1939.txt”。POP3既允许接收服务器向邮件用户发送邮件,也可以接收来自SMTP服务器的邮件。邮件客户端软件会与POP3服务器交互,下载由POP3服务器接收到的邮件。基于POP3协议的邮件系统能提供快速、经济和方便的邮件接收服务,深受用户的青睐。IMAP(Internet Message Access Protocol),即互联网消息访问协议,是一种功能比POP3更强大的新的接收邮件协议。目前最新的IMAP协议版本为IMAP4,RFC2060描述了IMAP4,网址为“/rfc/rfc2060.txt”。IMAP4与POP3协议一样提供了方便的下载邮件服务,允许用户在脱机状态下阅读已经下载到本地硬盘的邮件。但IMAP4的功能远远不只这些,它还具有以下功能: 摘要浏览邮件的功能。选择性下载附件的功能。鼓励用户把邮件一直存储在邮件服务器上。允许用户把远程邮件服务器上的邮箱作为信息存储工具。MIME(Multipurpose Internet Mail Extensions,多用途Internet邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。RFC2045、RFC2046和RFC2047对MIME作了描述。MIME是对RFC822的扩充,RFC822规定了内容只包括采用ASCII编码的纯文本的邮件的格式,而MIME允许在邮件中包含附件。第2章 需求分析2.1 产品可行性分析整个电子邮件系统的工作过程及一些涉及到的协议如下图所示:图2.1 电子邮件系统工作过程图电子邮件系统包含:电子邮件服务器端和电子邮件客户端。SUN公司制定了JavaMail API,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP,与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,参见下图:图2.2 收发邮件的接口图JavaMail API主要位于javax.mail包和ernet中,下图为其中主要类的类框图。图2.3 程序中主要类的类框图1. javax.mail.Session类:表示邮件会话,是JavaMail API的最高层入口类。2javax.mail.Store类:表示接收邮件服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。 3. javax.mail.Folder类:代表邮件夹。4. javax.mail.Message类:代表电子邮件。5. javax.mail.Address类:代表邮件地址。6. javax.mail.Transport类:根据指定的邮件发送协议(通常是 SMTP),通过指定的邮件发送服务器来发送邮件。2.2 产品功能需求分析2.2.1 系统总体功能图2.4 系统总体功能图2.2.2电子邮件系统收发邮件的过程图2.5 收发邮件过程图(1) 发信人调用用户代理来编辑要发送的邮件。用户代理用 SMTP 把邮件传送给发送端邮件服务器。(2) 发送端邮件服务器将邮件放入邮件缓存队列中,等待发送。(3) 运行在发送端邮件服务器的 SMTP 客户进程,发现在邮件缓存中有待发送的邮件,就向运行在接收端邮件服务器的 SMTP 服务器进程发起 TCP 连接的建立。(4) TCP 连接建立后,SMTP 客户进程开始向远程的 SMTP 服务器进程发送邮件。当所有的待发送邮件发完了,SMTP 就关闭所建立的 TCP 连接。(5) 运行在接收端邮件服务器中的 SMTP 服务器进程收到邮件后,将邮件放入收信人的用户邮箱中,等待收信人在方便时进行读取。收信人在打算收信时,调用用户代理,使用 POP3(或 IMAP)协议将自己的邮件从接收端邮件服务器的用户邮箱中的取回(如果邮箱中有来信的话)。 第3章 总体设计3.1 本系统的总体分析模型(类图):图3.1 系统的总体分析模型图该类图中包含了两个类:PMessage和MailUserData。其中PMessage类对Message类的重新封装,提供更方便的读取邮件信息的方法。例如,在Message类中读取邮件地址的方法,如getTo()方法返回Address类型,如果要把它显示到网页上,必须把Address数组转化为对应的字符串。PMessage的构造方法PMessage对Message数据重新封装。JSP网页调用PMessage的getTo方法可以直接获得字符串类型的地址。MailUserData类用来存放用户的相关信息,还有对邮件文件夹操作的一些方法的定义,还有邮件管理的一些操作的定义,例如:发送邮件,删除邮件等。3.2 系统模块的划分按照本系统的总体功能划分,可以将这个电子邮件系统分成5大模块,首先是登录模块,作为验证需要;其次是接收邮件和附件模块,该模块负责邮件的接收,有的是以附件形式接收的,再次是发送和回复模块,该模块负责该对方发送邮件,有的还是以附件形式发送的;接着是邮件处理模块,该模块负责邮件的阅读、保存和删除等操作;然后是邮件文件夹的管理,该操作负责邮件文件夹的新建、重命名和删除等操作。下面累出了本系统的模块体系,如图:图3.2 系统模块体系图第4章 详细设计4.1 登录模块登录模块主要有login.jsp完成,其中包括下图中的几部分。(1) 选择登录服务器,本系统采用了MerakMailSErvler公司提供的Mail服务器使用版本。(2) 选择指定邮件地址和密码。在本系统中有所提供的Mail服务器创建了2个账户进行登录。必须选用正确的邮件地址和密码才可以登录,不然会报错。登录模块的图示:图4.1 登录模块图4.2 接收邮件和附件模块接收邮件和附件模块主要由showmessage.jsp文件完成,包括下图中的几个部分。(1) 接收邮件。一个邮件系统最基本的功能是能够接受发送的邮件。(2) 保存附件。如果对方是以附件的形式发送邮件给用户,那么用户在 接收邮件时,必须先下载邮件,将其保存到本地机之后,才能阅读。接收邮件和附件模块的图示:图4.2 接收邮件和附件模块图4.3 发送和回复邮件模块发送和回复邮件模块主要由compose.jsp文件完成,包括图中的几个部分。(1) 编写新邮件。该部分也是电子邮件系统中最基本的功能。(2) 上传附件。在编写邮件时,邮件内容可以以附件的形式发送,这样就需要先将附件上传到服务器,然后在发送给对方。 发送和回复邮件模块的图示:图4.3 发送和回复邮件模块图4.4 邮件处理模块邮件处理模块主要由listonefoldr.jsp文件完成,包括图中的几个部分。(1) 显示邮件列表。在登录后的首页中就以分页显示的形式列出了所有的邮件,便于管理。(2) 删除选中邮件。在选中删除的邮件后,可以单击该命令删除邮件。(3) 显示错误信息。在出现一些登录错误,删除错误,下载错误是,将显示不同的错误信息提示用户。邮件处理模块的图示:图4.4 邮件处理模块图4.5 邮件文件夹管理模块邮件文件夹管理模块主要是由listallfolders.jsp文件完成,包括图中的几个部分。(1) 创建新的邮件文件夹。用户可以根据自己的需要创建新的邮件文件夹,便于管理用户的邮件。(2) 重命名邮件文件夹。用户可以重新命名自己创建的邮件文件夹。(3) 删除邮件文件夹。用户可以删除自己创建的邮件文件夹。图4.5 邮件夹管理模块图第5章 系统功能编码的实现5.1 服务器的安装和配置在做本次系统之前,必须配置JSP的服务器和电子邮件的服务器。(1)JSP的服务器,主要使用的是Tomcat,同时在安装Tomcat服务器之前,必需已经安装了SUN公司的JDK,在安装Tomcat的时候主要是注意电脑环境变量的更改。安装完成后,只要在浏览器中输入http:/localhost:8080/看是否能打开Tomcat的网页,如果能,则表示安装成功,8080端口是Tomcat的默认端口,如果电脑上有服务已经把端口占用了,可以把占用该端口的服务关掉,如果该服务关不掉或者比较重要,可以再Tomcat的安装目录中找到server.xml文件,将其中port=8080改成没有被占用的端口号。(2)电子邮件服务器的配置:在本系统中我们采用了MerakMailServler公司的Mail服务器,安装完成后,在配置中输入本次实验所需要的域名和用户等信息。然后保存,配置完成。5.2 客户端的实现给出本系统中包含的两个类:由于代码比较多,所以只给出了核心代码。首先要加入一个中文字符串处理函数用于是邮件能发送中文:public String codeToString(String str)/处理中文字符串的函数 String s=str; try byte tempB=s.getBytes(ISO-8859-1); s=new String(tempB); return s; catch(Exception e) return s; 1. PMessage类重新封装了Message类。(1) 重新封装Message类获得邮件的时间、主题、大小、内容还有地址等; public PMessage(Message msg)throws Exception if(msg!=null) SimpleDateFormat df = new SimpleDateFormat(yy.MM.dd at HH:mm:ss ); trydate=df.format(msg.getSentDate()!=null) ? msg.getSentDate() : msg.getReceivedDate(); catch(Exception e)date=new Date().toString(); subject=msg.getSubject(); size=msg.getSize(); Object content=; try content=msg.getContent(); catch(Exception e) if(msg.isMimeType(text/plain) & content!=null) text=(String)content; from=assembleAddress(msg.getFrom(); to=assembleAddress(msg.getRecipients(Message.RecipientType.TO); cc=assembleAddress(msg.getRecipients(Message.RecipientType.CC); bcc=assembleAddress(msg.getRecipients(Message.RecipientType.BCC); (2)构造函数PMessage(String to,String cc,String bcc,String subj,String text); public PMessage(String to,String cc,String bcc,String subj,String text) to.replace(;,); cc.replace(;,); bcc.replace(;,); this.to=to; this.cc=cc; this.bcc=bcc; this.subject=subj; this.text=text; (3)将Address数组转化为对应的字符串,用于在页面上显示; private String assembleAddress(Address addr) if(addr=null)return ; String addrString=; boolean tf = true; for (int i = 0; i addr.length; i+) addrString=addrString+(tf) ? : , ) + getDisplayAddress(addri); tf = false; return addrString; (4)返回一个适合msg头的字符串。 private String getDisplayAddress(Address a) String pers = null; String addr = null; if (a instanceof InternetAddress & (pers = (InternetAddress)a).getPersonal() != null) addr = pers + +<+(InternetAddress)a).getAddress()+> else addr = a.toString(); return addr; ;2.MailUserData类 (1)删除用户自己创建的邮件夹,但不允许删除Web应用指定的系统邮件夹; public void doDeleteFolder(String foldername )throws Exception /cant delete reserved folder if(foldername.equalsIgnoreCase(inbox)| foldername.equalsIgnoreCase(trash)| foldername.equalsIgnoreCase(draft)| foldername.equalsIgnoreCase(sendbox) throw new Exception(Cannt delete reserved folder); Folder folder=store.getFolder(foldername); if(!folder.exists()throw new Exception(This folder does not exists); if(folder.isOpen()folder.close(true); folder.delete(true); (2)修改用户自己创建的邮件夹的名字,但不允许修改Web应用指定的系统邮件夹得名字; public void doRenameFolder(String fromname,String toname)throws Exception if(toname=null | toname.equals() throw new Exception(You do not input new folder name when renaming folder); /cant rename reserved folder if(fromname.equalsIgnoreCase(inbox)| fromname.equalsIgnoreCase(trash)| fromname.equalsIgnoreCase(draft)| fromname.equalsIgnoreCase(sendbox)| toname.equalsIgnoreCase(inbox)| toname.equalsIgnoreCase(trash)| toname.equalsIgnoreCase(draft)| toname.equalsIgnoreCase(sendbox) throw new Exception(Cannt rename reserved folder); Folder folderFrom=store.getFolder(fromname); Folder folderTo=store.getFolder(toname); if(!folderFrom.exists()throw new Exception(This folder does not exists); if(folderFrom.isOpen()folderFrom.close(true); folderFrom.renameTo(folderTo); (3) 创建用户自己的邮件夹; public void doCreateFolder(String foldername)throws Exception if(foldername=null | foldername.equals() throw new Exception(You do not input new folder name when creating folder); Folder folder=store.getFolder(foldername); if(folder.exists()throw new Exception(This folder already exists); folder.create(Folder.HOLDS_MESSAGES); (4) 把邮件添加到参数指定的邮件夹中; public void doAppendMessage(Message msg, Folder f)throws Exception Message m=new Message1; m0=msg; f.appendMessages(m); (5) 根据参数指定的邮件信息,如标题,收发地址和邮件内容,来构建Message对象; public Message doAssembleMessage(String to,String cc,String bcc,String subj,String text)throws Exception Message msg = new MimeMessage(session); InternetAddress toAddrs = null, ccAddrs = null, bccAddrs=null; if (to != null) toAddrs = InternetAddress.parse(to, false); msg.setRecipients(Message.RecipientType.TO, toAddrs); else throw new MessagingException(No To address specified); if (cc != null) ccAddrs = InternetAddress.parse(cc, false); msg.setRecipients(Message.RecipientType.CC, ccAddrs); if (bcc != null) bccAddrs = InternetAddress.parse(bcc, false); msg.setRecipients(Message.RecipientType.BCC, bccAddrs); if (subj != null) msg.setSubject(subj); msg.setFrom(new InternetAddress(urlName.getUsername() + + urlName.getHost(); if (text != null) msg.setText(text); return msg; (6) 如果该邮件在Trash邮件夹中,就永久删除该邮件,否则把这封邮件移到Trash邮件夹中; public void doDeleteMessage(int arrayOpt,Folder f)throws Exception for(int i=0;iarrayOpt.length;i+) if(arrayOpti=0)continue; Message msg=f.getMessage(i+1); if(!f.getName().equals(Trash) Message m=new Message1; m0=msg; Folder Trash=store.getFolder(Trash); f.copyMessages(m,Trash); msg.setFlag(Flags.Flag.DELETED, true); else msg.setFlag(Flags.Flag.DELETED, true); f.expunge(); (7) 从用户当前邮件夹中,把用户当前访问的邮件移到参数指定的邮件中; public void doMoveMessage(String toFolderName)throws Exception Folder folderFrom=currFolder; Folder folderTo=store.getFolder(toFolderName); if(!folderTo.exists()throw new Exception(Folder does not exist); Message m=new Message1; m0=currMsg; folderFrom.copyMessages(m,folderTo); currMsg.setFlag(Flags.Flag.DELETED, true); folderFrom.expunge(); (8) 把用户编辑的邮件保存到Draft邮件夹中; public void doSaveMessage(PMessage pmsg)throws Exception Message msg=doAssembleMessage(pmsg); /save message in draft folder Folder f=store.getFolder(Draft); if(!f.isOpen()f.open(Folder.READ_WRITE); doAppendMessage(msg,f); (9) 发送邮件,并把邮件保存到SendBox邮件夹中。 public void doSendMessage(PMessage pmsg)throws Exception Message msg=doAssembleMessage(pmsg); /send message Transport.send(msg); /save message in sendbox folder Folder f=store.getFolder(SendBox); if(!f.isOpen()f.open(Folder.READ_WRITE); doAppendMessage(msg,f); 第6章 系统功能测试6.1 登录和注销模块的测试: 图6.1 邮件登录的初始界面图6.2 邮件登录成功后进入的界面 图6.3 邮件登录失败后显示的信息图6.4 系统注销后界面6.2 邮件发送模块的测试: a.一般的发送测试: 图6.5 用户发送邮件时的界面图6.6 用户admin发送成功时提示的信息 图6.7 用户weina登陆后查看的邮件内容表示已经发送成功b.抄送和暗送测试:抄送就是 你写的这封邮件除了传送给收件人,还会传送给你在抄送一栏里写的邮箱地址,并且收件人知道你把这封邮件发给了他和抄送一栏里输入的邮件地址的人 暗送就是 你写的这封邮件除了传送给收件人,还会传送给你在暗送一栏里写的邮箱地址,但是收件人不知道你把这封邮件发给了暗送一栏里输入的邮件地址的人.图6.8 抄送测试图6.9 暗送测试图6.10 登录admin的邮箱会查收到发送的邮件图6.11 登录weina将查收到暗送测试的邮件c.存草稿箱测试图6.12 存入草稿箱测试图6.13 此时草稿箱的情况图6.14 在草稿箱中查看存入信件的内容6.3 邮件接收模块的测试:图6.15 邮件接收模块的测试6.4 邮件管理模块的测试:此模块主要是如何删除用户接收到的邮件。图6.16 删除邮件的操作界
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中化学 第2章 化学反应的方向、限度与速率 第4节 化学反应条件的优化说课稿 鲁科版选修4
- Unit1 Reading 1 说课稿 2024-2025学年译林版(2024)七年级英语下册
- 2.1两条直线的位置关系(一)说课稿 2025-2026学年北师大版七年级数学上册
- 蔬菜合作社专业知识培训课件
- 2025年中考数学总复习《角、相交线和平行线》专项检测卷(附答案)
- 地产公司工业化建造体系薄砌薄抹应用技术指引
- 综合复习与测试教学设计-2025-2026学年高中数学人教B版2019必修第一册-人教B版2019
- 2025年中考化学试题分类汇编:化学与社会(第2期)原卷版
- 蓄禽养殖小知识培训总结课件
- 13.2画轴对称图形 说课稿 2024-2025学年人教版数学八年级上册
- 学校校园膳食监督家长委员会工作制度
- 工作证明(常见模板10套)
- 考研英语单词的前缀后缀
- 2025年度古董古玩展览策划与买卖合同
- 牢记教师初心不忘育人使命作新时代合格人民教师课件
- 勾股定理的实际应用课件
- 急性上呼吸道感染的护理
- 二年级体育上册 体育与健康室内课教案
- GB 44263-2024电动汽车传导充电系统安全要求
- 项目资金融资合同范本
- YDT 4484-2023物联网云平台技术要求
评论
0/150
提交评论