基于JavaMail的邮件收发系统

Brokenner

发布日期: 2019-02-18 09:08:05 浏览量: 2375
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

摘 要

电子邮件在当今社会中扮演了一个很重要的角色。越来越多的人在使用它。而且用它的人数势必会继续增加。本文介绍了Javamail邮件收发系统的开发背景,对国内外现有的多种成熟的电子邮件系统进行分析和比较,总结出它们的优缺点,对Javamail技术进行深入研究,提出并设计实现了基于Javamail的邮件收发系统。本系统利用SMTP协议和POP协议从底层进行开发,利用JavaMail API为收发邮件提供与协议无关的访问。SMTP(简单邮件传输协议)是专门用来发送邮件的。POP(邮局协议)是专门用于接收邮件的。JavaMail API是一种可选的、能用于读取、编写和发送电子消息的标准扩展包。

本文主要可分为四个部分。第一部分介绍了Javamail邮件系统的意义和现状。第二部分具体介绍了几种相关协议和Javamail API。第三部分主要介绍了系统的开发工具JAVA语言、Eclipse及其安装过程与配置方法。第四部分详细阐述了Javamail邮件收发系统的实现过程。

关键词:SMTP,POP,JAVAMAIL,邮件收发

ABSTRACT

E-Mail play a very important role in modern times. More and more people are using it, and the number of it will larger and larger. This paper introduced the javamail system’s development background, analyzed and compared some existing maturity Email system at home and abroad , summarized their advantages and disadvantages, studied deeply with the javamail technology , proposed and designed out the mail system based on javamail. This system used POP protocol and SMTP protocol to develop from the bottom, used JavaMail API to provide the visit which has nothing to do with the agreement for send and receive email. SMTP (Simple Mail Transfer Protocol) is designed to send a message. POP (Post Office Protocol) is designed to receive mail. JavaMail API is an standard expansion package which is optional, can be used to read, write and send electronic messages.

This paper can be divided into four parts. The first part introduced javamail email system’s significance and status. The second part introduced several related agreements and JavaMail API. The third part mainly introduced system’s development tools JAVA language , Eclipse and their installation process and configuration method. The fourth part detailed javamail email system’s realization process.

Keywords:SMTP, POP, JAVAMAIL, Email to send and receive

第一章 绪 论

本文是一项基于JavaMail的邮件系统的综合性研究,使用Sun公司提供的JavaMail API实现电子邮件的发送、电子邮件的接收等等功能。

1.1 电子邮件介绍

电子邮件(简称E-mai1)又称电子信箱、电子邮政,它是—种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是—个简易、快速的方法。通过连接全世界的Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。

电子邮件不是一种“终端到终端”的服务,是被称为“存贮转发式”服务。这正是电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式[1]。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件,不受时空限制。在这里,“发送”邮件意味着将邮件放到收件人的信箱中,而“接收”邮件则意味着从自己的信箱中读取信件,信箱实际上是由文件管理系统支持的—个实体。因为电子邮件是通过邮件服务器(mai1 server)来传递档的。通常mail server是执行多任务操作系统UNIX的计算机,它提供24小时的电子邮件服务,用户只要向 mail server管理人员申请—个信箱账号,就可使用这项快速的邮件服务。

电子邮件的工作原理:

  • 电子邮件系统是一种新型的信息系统,是通信技术和计算机技术结合的产物。电子邮件的传输是通过电子邮件简单传输协议(Simple Mail Transfer Protocol,简称SMTP)这一系统软件来完成的,它是Internet下的一种电子邮件通信协议

  • 电子邮件的基本原理,是在通信网上设立“电子信箱系统”,它实际上是一个计算机系统。系统的硬件是一个高性能、大容量的计算机。硬盘作为信箱的存储介质,在硬盘上为用户分一定的存储空间作为用户的“信箱”,每位用户都有属于自己的—个电子信箱。并确定—个用户名和用户可以自己随意修改的口令。存储空间包含存放所收信件、编辑信件以及信件存盘三部分空间,用户使用口令开启自己的信箱,并进行发信、读信、编辑、转发、存档等各种操作,系统功能主要由软件实现

  • 电子邮件的通信是在信箱之间进行的。用户首先开启自己的信箱,然后通过键入命令的方式将需要发送的邮件发到对方的信箱中。邮件在信箱之间进行传递和交换,也可以与另—个邮件系统进行传递和交换。收方在取信时,使用特定账号从信箱提取

1.2 研究意义

随着社会的发展,科技的进步,作为信息载体的计算机日益显露出其举足轻重的地位。当今社

会已步入了信息社会,知识经济将成为新世纪的主导产业。人们传统的联系方式也在不断的被改变。伴随着Internet的发展,电子邮件以其使用简易、投递迅速、收费低廉,易于保存、全球畅通无阻等等优点被广泛地应用,它使人们的交流方式得到了极大的改变。电子邮件已是人们沟通、交流的重要工具。

由于E-mail是当今人们交流的重要工具之一,因而,对E-mail系统的研究也逐渐变的热起来。基于JavaMail邮件系统具有快捷、方便的优点,吸引了众多的网络用户,使其成为E-mail研究方向的热点之一。

最初人们在使用E-mail服务时,必须使用邮件客服端,如:Outlook、Foxmail等软件,去接收邮件服务器上的邮件。由于操作系统的不同,往往需要不同的邮件接收客户端,给人们接收邮件带来很大的不便。但是基于JavaMail的邮件系统只要一个网络浏览器就可以实现E-mail的日常收发功能,而网络浏览器是任何操作系统中都自带的软件,用户在世界任何一个角落任何一台计算机都可以进行E-mail的收发工作。

此外,由于最初用户接收邮件的设置信息均保存在客服端,当用户重新安装操作系统或者更换计算机还要重新设置,而基于JavaMail的邮件收发系统的设置保存在邮件服务器上,不论你更换电脑还是系统,收发邮件的方式都是按照以前的设置进行的,使邮件的收发更合你的口味。

基于JavaMail的邮件系统让你不在为机器配置担忧,而且还为用户的邮件安全分担忧愁。

由于最初需要使用客服端软件收发软件,硬件配置低的计算机就显得“爱莫能助”了。虽然计算机的发展使得硬件问题不再是个问题,但是不强调硬件的配置也是基于JavaMail邮件系统的一个优点之一。此外,由于客户端软件维护和升级困难,网络浏览器的更新速度要远远大于邮件客户端软件的更新速度,这就给用户一个更安全的环境。

日前,基于JavaMail邮件系统的发展越来越成熟。多线程的设计方法,大大的提高了系统的通信效率和成本;采用MVC设计模式的邮件系统还大大的减少了系统的维护量。

当然,基于JavaMail的邮件系统缺乏对动态页面的支持能力,没有集成有效地数据库处理功能,也存在系统扩展性差、数据处理速度稍慢等缺点。但是,这些问题已经有了很好的起步,将不再是大的问题。

电子邮件系统经过几十年的发展,已经形成了完善的技术体系。邮件服务器系统在保留了电子邮件系统最初的收发邮件、邮件存储等基本功能的同时,融入了最新的计算机与网络技术,使电子邮件系统有了全新的改观 。邮件技术的发展趋势如下:

Web邮件技术

随着中国Internet应用的日益普及和逐步深入,这些数字仍在不断增长。但是对于电子邮件系统来说,单纯使用邮件客户端程序进行邮件的收发已经不能满足用户移动办公的需要。Web邮件技术的出现,彻底解决了用户办公的需要,使得邮件用户可以在任何地方使用浏览器登录邮件服务器收发邮件,而不用配置邮件客户端程序。

多域邮件服务

所谓多域邮件服务,即是一台物理服务器为多个独立注册Internet域名的企业或单位提供电子邮件的服务,在逻辑上,这些企业和单位拥有自己独立的邮件服务器,也可以称为虚拟邮件服务器技术。对于ISP提供商和企业集团公司来说,多域邮件服务器的支持能力是选择邮件服务器的一个重要考虑因素。它可以方便地扩展其横向邮件服务能力。

Linux邮件服务器

Linux操作系统作为目前应用最为广泛的开源操作系统,具有性能稳定、可靠性高和价格低廉的特点。使用Linux作为邮件服务器,主要是可以与Sendmail、MySQL等开源软件共同使用,在满足用户需求的基础上降低了系统价格。

安全防护

现在的邮件服务器在安全防护技术上有了较大的提高,包括数据身份认证、传输加密、垃圾邮件过滤、邮件病毒过滤、安全审计等的多项安全技术在邮件服务器中都得到了很好的应用。

多语言

目前光中文就有若干字符集,如GB-18030、GB-2312、Big5等等,虽然我们可以统一标准,但是,在实际的过程中,我们不可能统一所有的邮件客户端,因此我们只能要求邮件服务器支持多语言的环境,使“我们的沟通无障碍”。

远程监控和性能调整

由于目前许多邮件服务器处于电信托管等方式,不可能经常进行本地操作,因此目前邮件服务器均提供了远程邮件监控的功能。我们可以通过Web方式,监控邮件服务器的工作状态,包括在线用户数、邮件处理数量和速度、存储空间使用率等,并且可以随时对出现的发信高峰和网络攻击进行远程处理[2]。

总之,计算机的广泛应用,Internet的不断发展,E-mail在日常通讯中的地位越来越重要。虽然传统的C/S模式的邮件系统仍占有重要地位,但基于JavaMail的邮件收发系统会以其快捷、方便的等等优点为越来越多的人所接收,广泛的应用到各个领域,成为一名后起之秀。

1.3 研究现状

E-mail是信息化时代最重要的联系工具之一,在日常的工作学习中具有非常重要作用。对E-mail的研究也层出不穷,基于JavaMail邮件系统的设计与实现大多数都是研究和使用Sun公司提供的JavaMail API去实现其邮件发送和接收功能。
电子邮件的研究也存在着以下的问题:

Unix式的平台

在Unix平台下以Sendmail的资格最老,但是由于Unix系统是开发源代码的,所以导致Sendmail有不少代码缺陷和漏洞,如有些代码缺陷可以让攻击者远程地利用红帽子或SlackwareLinux软件的计算机,APP漏洞,即用sendmail系统的APP漏洞能够取得root权限。

Winodws式的平台

在windows领域种类繁多的邮件服务器中,微软的Exchange排在首位,但是它存在着以下问题:

  • 该系统只能运行在Windows NT上,而WinNT本身的不可靠、不稳定决定了Exchange Server的不稳定、不可靠

  • Exchange Server具有严重的内存泄漏问题,随着系统运行时间的增加会越来越慢,平均至少要一周重启一次

  • Windows NT系统面临着巨大的病毒感染隐患,一旦Exchange Server感染病毒,会造成Exchange Server本身的瘫痪,感染速度惊人。杀毒软件只会“亡羊补牢”

  • Exchange Server对邮件账户的支持是非常有限的,一般超过200个用户是系统就会效率低下,提升性能只能依靠昂贵的硬件

  • Exchange Server自身安全防范较弱,容易被外界利用来转发邮件,甚至冒充内部人员发送垃圾邮件

  • Exchange Server维护困难,拥有成本高,每个用户需交纳10美元许可费。
    除了Exchange外,Lotus Notes基本上还是一套OA和工作流系统,其邮件功能十分有限。国内用户反映的问题[3]主要有:

    • 邮件系统经常不能正常收发,需频繁的重启动服务器或清理邮件系统
    • 经常被外界利用来转发邮件
    • 不能和部分邮件系统很好兼容,系统收到的263和163信箱的邮件显示为乱码,收不到hotmail的邮件
    • OA功能丰富,但是邮件系统不够可靠,效率低,超过300人时,收信速度明显变慢
    • 拥有成本高,每个用户的成本是21美元,比Exchange Server还贵

邮件系统市场是个刚刚形成的市场,格局还有很大的变数。同时企业用户对邮件系统产品的各项性能不太熟悉,在对邮件系统的好坏没有很清晰的评判标准时,往往很注重系统提供商的成功案例,也就是系统提供商的业界背景。企业购买邮件系统主要是为了提高办公效率,所以力图控制成本。用户需要更标准的产品以减小整体拥有成本。产品整体化可为企业维护降低成本,但需要更容易定制化来满足用户个性化需求。另外,不同的ISP[4]需要个性化的标志以区别同类产品,价格和产品性能同为企业用户购买时的重要参照。

电子邮件系统应该具备无限的扩展能力,Internet网络的一个特性是变化无常,我们需要应对随时而来的应用尖峰。因此,我们需要电子邮件系统具有无限的可扩展能力,这个能力主要体现在邮件的处理能力和邮件的存储能力上。为了能够使邮件的处理能力可以无限扩展,就需要引入集群和负载均衡技术,使应用平台可以在需要的时候无限扩充,满足长期或临时的业务需要。为了便于邮件存储,需要高性能的邮件存储解决方案,最为理想的应该是SAN技术在邮件服务器领域的应用。

总之,电子邮件是一项系统工程,需要网络、数据存储、数据库、操作系统等技术的支持。因此电子邮件系统的每一次技术革新都是在其他技术发展的基础之上的。

第二章 相关邮件协议和JavaMail API

2.1 相关邮件协议

邮件的传送要依赖于具体的传输协议,主要有:SMTP、POP3、MIME。

  • SMTP:简单邮件传输协议,它是一组用于由源地址到目的地传送邮件的规则,或者说是由它来控制信件传输的一种中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转邮件时找到下一个目的地。通过SMTP协议所指定的服务器,我们就可以把Email寄到收信人的服务器上了,整个过程只需要几分钟。SMTP的开发最初是为了在封闭的网络中传送相对来说不太重要的简短信件,而不是为了在互联网中传送重要而敏感的信息,因此最初通过SMTP传输信件时 ,安全性不高

  • POP:邮局协议[5],当前的版本为3,也称作POP3。POP是一种允许用户从邮件服务器收发邮件的协议,它有两种版本,即POP2和POP3,都具有简单的电子邮件存储转发功能。POP2和POP3本质上类似,都属于离线式工作协议,但是由于使用了不通的协议端口,两者并不兼容。与SMTP协议相结合,POP3是目前最常用的电子邮件服务协议。在离线工作方式下,用户收发邮件时,首先通过POP3客户程序登录到支持POP3协议的邮件服务器,然后发送邮件及附件;接着,邮件服务器为该用户收存的邮件传送给POP3客户程序,并将这些邮件从服务器上删除;最后,邮件服务器将用户提交的发送邮件,转发到运行SMTP协议的计算机中,通过它实现邮件的最终发送。在为用户从邮件服务器收取邮件时,POP3是以该用户当前存储在服务器上全部邮件为对象进行操作的,并一次性将它们下载到用户端计算机中。一旦客户的邮件下载完毕,邮件服务器对这些邮件的暂存托管即告完毕。使用POP3,用户不能对他们贮存在邮件服务器上的邮件进行部分传输,离线工作方式适合那些从固定计算机上收发邮件的用户使用

  • MIME: 多用途网际邮件扩充协议,是最初的互联网电子邮件协议的一个扩展,说明了如何安排消息格式使消息在不同的邮件系统内进行交换。 MIME 的格式灵活,使人们能使用这一协议在互联网上交换不同类型的数据文件:音频,视频,图像,应用软件和其他类型的文件,也包括在最初的协议—简单邮件传送协议(SMTP)中的ASCII文本

  • IMAP:IMAP使用在接收信息的高级协议,目前版本为第4版,所以也被称为IMAP4。需要注意的是在使用IMAP时,邮件服务器必须支持该协议。从这个方面讲,我们并不能完全使用IMAP来替代POP,不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP,那么我们的邮件程序将能够具有以下被IMAP所支持的特性[6]:每个用户在服务器上可具有多个目录,这些目录能在多个用户之间共享。其与POP相比高级之处显而易见,但是在尝试采取IMAP时,我们认识到它并不是十分完美的。由于IMAP需要从其它服务器上接收新信息,将这些信息递送给用户,维护每个用户的多个目录,这都为邮件服务器带来了高负载。并且IMAP与POP的一个不同之处是POP用户在接收邮件时将从邮件服务器上下载邮件,而IMAP允许用户直接访问邮件目录,所以在邮件服务器进行备份作业时,由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间,这将直接导致邮件服务器上磁盘空间暴涨。

  • NNTP和其它的第三方协议:正因为JavaMail API在设计时考虑到与第三方协议实现提供商之间的分离,故我们可以很容易的添加一些第三方协议。SUN维护着一个第三方协议实现提供商的列表:http://java.sun.com/products/javamail/Third_Party.html ,通过此列表我们可以找到所需要的而又不被SUN提供支持的第三方协议:比如NNTP这个新闻组协议和S/MIME这个安全的MIME协议。

2.2 JavaMail API

2.2.1 JavaMail API简介

JavaMail API是SUN为Java开发者提供对电子邮件处理的延伸,能用于读取、编写和发送电子消息的包(标准扩展)。为管理电子邮件提供了统一的应用编程接口,它可以处理各种e-mail格式(包括IMAP、POP、SMTP以及MIME)和其他Internet相关的讯息通信协定。

用户可使用这种包创建邮件用户代理(Mail User Agent,MUA)类型的程序,它类似于Foxmail、Eudora以及Miceosoft Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail Transfer Agent,MTA)类型的程序那样用于传输、发送和转发消息[7]。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。

2.2.2 JavaMail API核心类

Session:Session类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。

Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象:

  1. Properties props = new Properties();
  2. // fill props with any information
  3. Session session = Session.getDefaultInstance(props, null);

或者使用getInstance()这个静态工厂方法[8]获得自定义的Session:

  1. Properties props = new Properties();
  2. // fill props with any information
  3. Session session = Session.getInstance(props, null);

从上面的两个例子中不难发现,getDefaultInstance()和getInstance()方法的第二个参数都是null,这是因为在上面的例子中并没有使用到邮件授权。在对mail server进行访问的过程中使用共享的Session是足够的,即使是工作在多个用户邮箱的模式下也不例外。

Message :一旦获得Session对象,就可以继续创建要发送的信息,在这里SUN提供了Message类型来帮助开发者完成这项工作。由于Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型和头的电子邮件信息。

信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入:

  1. MimeMessage message = new MimeMessage(session);

注意:对于MimeMessage类来讲存在着多种构造方法,比如使用输入流作为参数的构造方法。

在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。最基本的信息内容设置方法就是通过表示信息内容和MIME类型的参数调用setContent()方法:

  1. message.setContent("Hello", "text/plain");

然而,如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容。message.setText(“Hello”);前面所讲的两种方法,对于文本信息,后者更为合适。而对于其它的一些信息类型,比如HTML信息,则要使用前者。使用setSubject()方法对邮件设置邮件主题:message.setSubject(“First”);

Address:到这里,我们已经建立了Session和Message,像Message一样,Address类也是一个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。

通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类:

  1. Address address = new InternetAddress("president@whitehouse.gov");

如果要在邮件地址后面增加名字的话,可以通过传递两个参数:代表邮件地址和名字的字符串来建立一个具有邮件地址和名字的邮件地址类:

  1. Address address = new InternetAddress("president@whitehouse.gov", "George Bush");

本文在这里所讲的邮件地址类是为了设置邮件信息的发信人和收信人而准备的,在建立了邮件地址类后,我们通过message的setFrom()和setReplyTo()两种方法设置邮件的发信人:

  1. message.setFrom(address);
  2. message.setReplyTo(address);

若在邮件中存在多个发信人地址,我们可用addForm()方法增加发信人:

  1. Address address[] = ...;
  2. message.addFrom(address);

为了设置收信人,我们使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量来区分收信人的类型:

  1. message.addRecipient(type, address);

下面是Message.RecipientType的三个常量:

  1. Message.RecipientType.TO
  2. Message.RecipientType.CC
  3. Message.RecipientType.BCC

因此,如果我们要发送邮件给总统,并发用一个副本给第一夫人的话,下面的方法[10]将被用到:

  1. Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
  2. Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
  3. message.addRecipient(Message.RecipientType.TO, toAddress);
  4. message.addRecipient(Message.RecipientType.CC, ccAddress);

JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能:验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器上的MX记录验证等。

Authenticator: JavaMail API也可以利用Authenticator通过用户名和密码访问受保护的资源。对于JavaMail API来说,这些资源就是邮件服务器。JavaMail Authenticator在javax.mail包中,要使用Authenticator,先创建一个抽象类的子类,并从getPasswordAuthentication()方法中返回PassaordAuthentication实例。创建完成后,必须向Session注册Authenticator。然后,在需要认证的时候,就会通知Authenticator。

Transport:像java.net类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。在javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。

在使用Authenticator这个抽象类时,我们必须采用继承该抽象类的方式,并且该继承类必须具有返回PasswordAuthentication对象(用于存储认证时要用到的用户名、密码)getPasswordAuthentication()方法。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。

下面代码片断中的MyAuthenticator就是一个Authenticator的子类。

  1. Properties props = new Properties();
  2. // fill props with any information
  3. Authenticator auth = new MyAuthenticator();
  4. Session session = Session.getDefaultInstance(props, auth);

Folder和Store :Store类实现特定邮件协议上的读、写、监视、查找等操作。通过javax.mail.Store类可以访问javax.mail.Folder类。

Folder类用于分级组织邮件,并提供javax.mail.Message格式访问e-mail的能力。

2.3.3 JavaMail API的应用

阅读电子邮件

对于阅读邮件来说,首先要获取一个会话,然后获取并连接到一个相应的用于您的收件箱的存储上,接着打开相应的文件夹,再获取消息。同时,不要忘记了操作完成后关闭连接。

步骤如下:

  • 创建一个Properties 对象,Session 对象通过Properties 对象来接受选项,在这种情况下,没有选项,但仍然需要Properties 对象

  • 创建Session 对象,并不直接对Session 实例化,而是通过调用getDefaultInstance

  • 使用Session.getStore 来获取服务器的POP3存取,也可以指定IMAP

  • 使用store.connect 来创建一个从store 对象到实际服务器上的活连接

  • 用store.getFolder 找到INBOX(收件箱)文件夹(POP3 存储里唯一的文件夹),对IMAP 服务器而言,可以访问不同的文件夹。用folder.open 以只读方式打开文件夹

  • folder.getMessages 获得一组消息,这个数组效率高,因此它仅当需要结果传输数据。使用JavaMail 获取邮件,部分关键代码如下:

  1. public void sendMessage( String host,String from,String to,String content)
  2. throws IOException{
  3. try{
  4. // Get system properties
  5. Properties props = System.getProperties();
  6. // Setup mail server
  7. props.put("mail.smtp.host", host);
  8. // Get session
  9. Session session = Session.getDefaultInstance (props,null);
  10. // Define message
  11. MimeMessage message = new MimeMessage(session);
  12. message.setFrom(new InternetAddress(from));
  13. message.addRecipient(Message.RecipientType.TO,
  14. new InternetAddress(to));
  15. message.setSubject("Hello JavaMail");
  16. message.setText(content);
  17. // Send message
  18. Transport.send(message);
  19. }
  20. catch(IOException e)
  21. {
  22. e.printStackTrace();
  23. }
  24. }

发送电子邮件

发送电子邮件消息涉及到获取会话、创建和填充消息并发送消息这些操作。在获取Session 时,通过为要传递的Properties 对象设置mail.smtp.host属性来指定所用的SMTP 服务器。

转发电子邮件

转发消息涉及的内容要稍微多一点,没有一个专门用于转发消息的方法,可以通过处理组成消息的各个部分来创建要转发的消息。一条邮件消息可由多个部分组成,每一部分是一个BodyPart(报文部分),或更特殊一点,在操作MIME 消息时则是MimeBodyPart [11]。不同的报文部分组合到一个称为Multipart 的容器中,或者更特殊一点,是一个MimeMultipart 容器。要转发消息,用户需要创建一个用于消息文本的部分,和用于要转发的消息的第二个部分,并将这两个部分组合成一个Multipart(多个部分)。然后, 可以把这个Multipart添加到一个合适的注明地址的消息中并发送它。

这就是转发消息的过程。要把一条消息的内容复制给另一条消息,只需通过它的ataHandler 类复制即可,它是出自于JavaBeans Activation Framework的一个类。

上面着重分析和探讨基于JavaMail API 的邮件服务系统的设计和实现的相关技术。为系统实际开发过程中充分利用Java 编程语言的开放性、平台无关性等优点,极大地提高了系统的效率和性能。

第三章 应用系统开发工具

本次程序设计所采用的开发环境为:

  • AMD Athlon(TM),512M内存,80G硬盘

  • Microsoft® Windows™ XP Professional

  • The Eclipse Foundation®Eclipse3.4(Java)

  • Sun® JDK1.5或以上

运行环境为:

  • Intel® Pentium® 2及以上处理器,32M以上内存,4G以上硬盘

  • Microsoft® Windows™ 9X/NT操作系统

  • 800*600或以上的屏幕分辨率

  • 确保机器上安装有JDK 1.5或者以上版本

3.1 Java开发语言简介

Java 2是SUN公司推出的新一代面向对象的程序设计语言,它是一种简单的面向对象的分布式可移植性能优异的多线程的动态语言。它具有以下的特点:

简单

Java最初是为了对家用电器进行智能化控制而设计的一种语言,因此它特别的简单明了。它的简单性体现在以下三个方面[12]:

  • Java的编程风格类似于C++的风格,因此大家都比较熟悉

  • Java中没有C++中的指针和内存管理的概念,可以避免犯C++中的常见错误

  • 在Java中有丰富的类库,大大方便了编程工作

面向对象的特性

面向对象性可以说是Java最重要的特性。Java语言的设计完全是面向对象的,它不支持类似于C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及重用。

分布性

Java有很强的网络特性。通过它特有的类,可以方便地处理TCP/IP协议和访问网络资源。它的分布计算的特性正是它得以在网络时代风靡的重要原因。

鲁棒性

Java中对应不同的类具有的Exception,正是这些不同的Exception可以防止因为程序员的错误而造成系统的崩溃。

安全性

Java不支持指针,因此一切对内存的访问都必须通过对象的实例变量来进行,因此可以有效的防范病毒的入侵。

体系结构中立

Java的解释器可以生成与系统体系结构无关的字节码指令,一个系统只要安装了Java虚拟机就可以执行Java程序了。

多线程性

Java的多线程能够保证程序的并行执行。而且同步机制保证了对共享数据的正确操作,方便用户在网络上的实时交互操作,提高系统的处理能力。

动态性

Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行,并且Java通过接口来支持多重继承,使之比严格的继承类具有更灵活的方式和扩展性。同时用户也可以创建自己的特有的类,以方便操作和提高编程能力。

3.2 开发工具Eclipse

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。

Eclipse是一种通用工具平台——普遍适用的开放式扩展IDE,它提供了功能丰富的开发环境,允许开发者高效地创建一些能够无缝集成到Eclipse平台中的工具。Eclipse的体系结构[13]为: 底层为JAVA开发环境插件(JDT),插件开发环境(PDE),其他的第三方插件。中层为Eclipse的图形界面(包括——工作台,Jface,SWT),核心为工作空间(workspace)和运行时内核(runtime)。

Eclipse的设计思想是:一切皆为插件。Eclipse的核心是非常小的,其他所有的功能都是以插件的形式附加到这个Eclipse核心之上。这样的功能插件包括他的图形API(称为SWT/JFace)、JAVA开发环境插件(JDT)、插件开发环境(PDE)等。Eclipse还对这些插件的协同工作提供了良好的支持,不仅安装简单,而且还可以无缝结合。

Eclipse对这些插件是动态载入动态调用的。所谓动态就是指,Eclipse启动后要真正用到这个插件时,它才会被调入内存,当插件不再被使用时,它就会被在适当的时候清除出去。因此即使装了一大堆插件在Eclipse里,也不必担心某些不常用的插件白白占着内存。

3.3 开发软件的安装

3.3.1 JAVA环境的安装与配置

在安装Eclipse之前,需要先安装JDK(Java Development Kits)。

在JDK安装完成之后,一般需要设置计算机系统的环境变量,以便于其它软件确定JDK的安装位置。在WindowsXP操作系统环境,具体操作步骤如下:

  • 选择“开始”菜单中的“控制面板”命令,打开控制面板窗口,双击选择“系统”,打开如图3-1所示的“系统属性”对话框

  • 单击“系统属性”对话框中的“环境变量”按钮,进入图3-2所示的“环境变量”对话框。在该对话框中可以设置只有当前用户登录时才有效的用户变量,也可以设置该系统的所有用户登录时都有效的系统变量

  • 在“环境变量”对话框中单击“新建”按钮,在打开图3-3所示的新建系统变量对话框输入变量名为JAVA_HOME,其环境变量的值应该设置为JDK的安装位置

  • 然后在如图3-2所示的“环境变量”对话框中再次选择Path环境变量,将%JAVA_HOME%\bin;添加到对应的变量值后面,注意和前面的值用“;”隔开。单击“确定”按钮即可完成JDK相关环境变量的设置

  • 在“环境变量”对话框中单击“新建”按钮,在打开图3-5所示的新建系统变量对话框中输入变量名为CLASSPATH,其环境变量的值设置为dt.jar和tools.jar的安装位置

系统属性对话框

环境变量对话框

新建系统变量对话框

系统变量对话框

新建系统变量对话框

3.3.2 Eclipse的安装

Eclipse是开放源代码的项目,可以到 www.eclipse.org 去免费下载Eclipse的最新版本。其中可以选择下载Eclipse SDK,它包括了Eclipse开发环境、Java开发环境、Plug-in开发环境以及所有源代码和文档。

Eclipse在下载完成后,只需要将对应的压缩包文件Eclipse—SDK-3.4.2-win32.zip解压缩到指定位置,即可完成安装。

3.3.3 javamail的安装

下载javamail.rar后解压得到两个包:mail.jar和activation.jar,把它导入到所建工程的lib目录下即可。

第四章 JavaMail系统的实现

Javamail API使邮件的发送与接收得到大大的简化。本文所开发的邮件客户端程序是在Eclipse环境下实现的。其主要实现如下基本功能:

  • 收取并显示POP3邮件服务器上指定邮箱的邮件

  • 使用SMTP邮件服务器发送邮件

  • 邮件附件的发送与接受

  • 删除邮件

邮件客户端的功能界面如下图所示:

4.1 环境配置与界面搭建

在Eclipse中创建工程后,首先为工程添加javamail和javabeansActivationFrame Work开发包,然后使用swing图形工具包搭建各个程序界面,并在使用Javamail API的类文件中导入相关的API包,即在程序的开头添加下面的语句:

  1. import javax.mail.*;
  2. import javax.internet.*;
  3. import javax.activation.*;

4.2 设置邮件服务器参数的实现

用户在收发邮件时,需要设置邮件服务器主机、收发邮件帐户及密码等信息。因此系统提供对上述信息的设置与存储的功能,这里,我们采用属性文件的形式存储SMTP 和POP3 邮件服务器属性设置。其文件名为smtpPop3.properties,位于工程的根目录下,可使用java.uitl. Properties 类的setProperty()方法和getProperty() 方法[14]对属性文件中的属性内容进行存取。本系统smtp Pop3.properties文件的内容格式如下:

  1. smtpPop3.pop3host=pop3 邮件服务器地址(如pop3.sina.com.cn )
  2. smtpPop3.smtphost=smtp 邮件服务器地址(如smtp.sina.com.cn)
  3. smtpPop3.address=收发邮件帐户(如xyz@sina.com)
  4. smtpPop3.username=用户名(如xyz)
  5. smtpPop3.password=密码(如654321)

POP3与SMTP服务器属性设置如下:

4.3 创建与发送邮件功能的实现

发送邮件的基本过程为:点击主界面中的“创建邮件”按钮后,弹出新邮件编辑窗体,在该窗体中编辑新邮件,选择邮件附件后,点击“发送”按钮,程序根据输入的邮件信息构造邮件,并将其发送。其具体实现步骤和关键代码为:

4.3.1 装载邮件服务器属性, 并与其建立连接

用java.uitl.Properties类的getProperty () 方法从属性文件smtpPop3.properties中取得smtp 邮件服务器的地址、用户帐号、用户邮箱地址、密码信息,创建与SMTP 服务器连接的Session 会话。

  1. //装载服务器属性,并与服务器建立连接
  2. String smtpHost=null,sendAddress=null,userName=null,password=null;
  3. Properties p = new Properties();
  4. try {
  5. //从文件中读入相关的服务器属性设置
  6. FileInputStream fileIn = new FileInputStream("smtp.properties");
  7. p.load(fileIn);
  8. smtpHost=p.getProperty("smtp.host");
  9. sendAddress=p.getProperty("smtp.address");
  10. userName=p.getProperty("smtp.username");
  11. password=p.getProperty("smtp.password");
  12. fileIn.close();
  13. //创建与服务器的对话
  14. p=new Properties();
  15. p.put("mail.smtp,host",smtpHost);
  16. p.put("mail.smtp.auth","true");//设置身份验证为真,如果发邮件时需要身份验证必须设为真
  17. session=Session.getInstance(p,null);
  18. session.setDebug(true);
  19. }
  20. catch (Exception ex) {
  21. System.out.println("装载服务器属性出错!");
  22. ex.printStackTrace();
  23. }

4.3.2 构建邮件

获取收件人地址、抄送人地址、邮件主题、附件等信息构建邮件。包括设置邮件标题&发送时间,处理邮件正文和附件文件。这里,在构建邮件时,对含有中文字符的附件文件名,进行BASE64 编码,否则,收邮件时附件名将为乱码。程序中使用类sun.mism.BASE64Encoder实现BASE64 编码。

  1. //建构邮件信息
  2. try{
  3. msg=new MimeMessage(session);
  4. //处理邮件头部
  5. if(!to.equals(""))
  6. msg.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
  7. if(!cc.equals(""))
  8. msg.addRecipient(Message.RecipientType.BCC,new InternetAddress(cc));
  9. msg.setSubject(subject);//设置邮件主题
  10. msg.setFrom(new InternetAddress(sendAddress));
  11. msg.setSentDate(new Date());//设置邮件发送日期
  12. Multipart mp=new MimeMultipart();//创建用于封装邮件的Multipart对象
  13. //处理邮件正文
  14. MimeBodyPart mbp1=new MimeBodyPart();
  15. mbp1.setText(contentArea.getText());
  16. mp.addBodyPart(mbp1);
  17. //处理邮件附件
  18. MimeBodyPart mbpAttatch;
  19. FileDataSource fds;
  20. BASE64Encoder enco=new BASE64Encoder();
  21. String sendFileName="";
  22. if(attatchFiles.size()!=0){
  23. for (int i = 0; i < attatchFiles.size(); i++) {
  24. mbpAttatch = new MimeBodyPart();
  25. fds = new FileDataSource(attatchFiles.get(i).toString());
  26. mbpAttatch.setDataHandler(new DataHandler(fds));
  27. //将文件名进行BASE64编码
  28. sendFileName="=?GB2312?B?"+enco.encode(new String(fds.getName().getBytes(),"gb2312").getBytes("gb2312"))+"?=";
  29. mbpAttatch.setFileName(sendFileName);
  30. mp.addBodyPart(mbpAttatch);
  31. }
  32. }
  33. //封装并保存邮件信息
  34. msg.setContent(mp);
  35. msg.saveChanges();
  36. }catch(Exception ex){
  37. System.out.println("构建邮件出错!");
  38. ex.printStackTrace();
  39. }

4.3.3 创建Transport对象发送邮件

  1. try{
  2. Transport transport=session.getTransport(“smtp”);
  3. transport.connect(smtpHost,userName,password);
  4. transport.sendMessage(msg,msg.getAlRecipients());
  5. transport.close();
  6. System.ou.t.println(“发送邮件成功!”);
  7. }
  8. catch(Exception ex){
  9. System.out.println(“发送邮件失败!”);
  10. }

4.4 接收邮件功能的实现

在点击“接收邮件”按钮后,用户可以收取并阅读邮件。这时,系统首先从指定接收邮件的服务器中收取邮件,并将邮件的发件人、邮件主题以及邮件日期信息以列表形式显示出来;其次是在该邮件列表中点击某封邮件时, 可以显示该邮件的详细信息,包括邮件内容、附件列表等。其具体实现步骤和关键代码如下:

4.4.1 获取服务器信息

与发送邮件时获取SMTP 服务器属性一样,接收邮件时要从smtpPop3.properties文件中取得Pop3 服务器信息, 并建立Session 会话。

4.4.2 建立通信连接

获取邮件服务器上的邮件夹,并将其以列表形式显示,代码如下:

  1. try{
  2. Store store =session.getStore(“pop3”);
  3. Store.connect(opoHost,userName,password);
  4. Folder folder=store.getFolder(“Inbox”);//取得store中的Folder邮件夹
  5. mailListPanei.model.setFolder(folder);//将邮箱中的邮件显示在表格中
  6. }catch(Exception ex){
  7. System.out.println(“服务器连接失败!”);
  8. Return;
  9. }

4.4.3显示邮件

在邮件显示列表中点击某封邮件,根据该邮件的编号获得该邮件并存放在一个Message 对象message 中,然后使用Message类所提供的方法将邮件的主题、发件人、收件人、邮件体、附件信息解析并显示出来。如果将这个邮件显示在一个面板viewPanel中,则ViewPanel 类的主要代码如下。

  1. Class ViewPanel extends Jpanel{
  2. Message message = null;// 用来存放显示的邮件
  3. Vector attachmentFiles = new Vector();//用来存放邮件所带的附件列表
  4. Vector attachmentInutStream = new Vector();//用来存放与附件列表对应的附件数据流
  5. void setMessage(Message message){
  6. this.message = message;
  7. mailContentArea.setText(“”);//清空邮件内容显示区域
  8. if(message!= null){
  9. loadHeader();//本类中的方法,用来显示有关邮件头信息
  10. attachmentFiles.clear();//清空邮件附件列表向量,用来存放新邮件的附件列表
  11. attchmentInputStream.clear();//清空,用来存放新邮件的所带附件的数据流
  12. loadBody(message);//本类中的方法,用来解释并显示邮件内容与附件
  13. }
  14. }

loadHeader()方法用来显示邮件头信息,包括邮件的主题、收件人、发件人。使用Message类getForm()方法、getRecipients()方法和getSubject()方法获取后并将其显示出来。关键代码如下:

  1. String form = message.getForm().toString();//获取邮件发件人
  2. String subject = message.getSubject();//获取邮件主题
  3. String to = message.getRecipients(Message.RecipentType.TO)[0].toString();//获取收件人

LoadBody(Part part)方法用来解释并显示邮件内容与附件。方法的入口参数是一个Part 类型的参数, Part 为一个接口, Message 类、BodyPart 类等都实现该方法。调用方法时传入的参数为一个Message 对象。解释邮件的基本思路为:当邮件为Multipart 类型时, 依次取出邮件的各个部分;如果邮件的某个部分不为Multipart 类型, 则该部分应为正文或附件;此时再使用getDisposition()方法进一步判断该部分为正文还是附件, 方法返回值为null 时为正文, 方法返回值为Part.ATTACHMENT 或为Part.INLINE 时为附件。loadBody (Part part) 方法需要用到的类为:javax.mail.internet.MimeBodyPart、javax.activation.FileDataSource、javax.mail.Multipart、javax.mail.MimeMultipart、javax.mail.BodyPart[17]。其中Multipart 类和BodyPart 类是抽象类,MimeMultipart 类和MimeBodyPart 类分别是继承于Multipart 类和BodyPart 类并支持MIME 的实现类, 而FileDataSource 是用来处理附件的类。

4.5 删除邮件功能的实现

用户点击系统主窗体的,删除邮件-按钮后,系统将邮件的表格中当前被选中的邮件删除,并刷新邮件显示表格。其实现代码如下:

  1. message[deleIndex].setFlag(Flags.Flag.DELETED,true);
  2. folder.close(true);
  3. folder.open(Folder.READ_WRITE);
  4. message = folder.getMessage();
  5. fireTableDataChanged();//刷新邮件显示表格数据

其中deleteIndex为被选中邮件在邮件列表中的序号,由邮件显示表格的时间程序获得。

上面使用javamailAPI所实现的邮件客户端程序具备了一个Email收发系统的基本功能,在此基础上,可以进一步添加其它的功能,比如转发邮件、回复邮件等,使其成为一个功能完善的邮件客户端系统。

第五章 结语

本文首先介绍了电子邮件的工作原理,开发背景以及研究现状,然后介绍了JavaMail邮件系统的开发过程中所涉及的协议,并简单的介绍了JavaMail API中重要的类和JavaMail开发环境以及开发语言Java的特点。在系统的设计过程中,由浅入深的实现了E-mail收发系统的发送、接收功能,等基本功能,并最终实现了各个子模块的整合,形成了简单的基于JavaMail的邮件收发系统。在此基础上,可以进一步添加其它的功能,比如转发邮件、回复邮件等,使其成为一个功能完善的邮件客户系统。

参考文献

[1]贺文,顾训穰。基于Web的客户端电子邮件系统的实现[J]。计算机工程与应用,2001,(8):56—58

[2] Java程序设计与应用开发。於东军等编著。清华大学出版社, 2005

[3]姚伏天,金连甫,潘敏。基于服务器端安全电子邮件系统的设计与实现[J]。计算机科学,2004,31(8):35—38

[4] Java邮件开发详解。张孝祥。电子工业出版社,2007

[5]卢秉亮,王玉湘,许莉。基于WINDOWS环境POP3协议邮件接收客户端的实现[J]。沈阳航空工业学院学报,2006,23(3):27—30

[6]廖丽嵘。基于VB6.0有安全认证的Email客户端软件[J]。中山大学学报论丛,2004,24(3):259—261

[7] Learning Java。Niemeyer, Patrick., Knudsen, Jonathan。O’Reilly, 2000

[8] Java program design。Cohoon, James P.,Davidson, Jack W。McGraw-Hill Higher Education, 2004

[9] Thinking in Java。Eckel, Bruce。Prentice Hall, c2000

[10] Java高级程序设计。王路群主编。中国水利水电出版社, 2006

[11] Java课程设计。黄明, 梁旭, 周绍斌编著。电子工业出版社, 2006

[12] Java开发与应用教程。王吴迪, 赵枫朝等编著。电子工业出版社, 2006

[13] Java程序设计大学教程。刘艺等编著。机械工业出版社, 2006

[14]杨宁。使用Java Mail API实现电子邮件客户端[J]。晋东南师范专科学校学报,2004,21(2):38—40

[15] Java数据库高级编程宝典。陈天河编著。电子工业出版社, 2005

[16] Java语言程序设计实训。赵海廷主编。武汉大学出版社, 2005

[17] 网络编程技术及应用。谭献海等编著。清华大学出版社, 2006

上传的附件 cloud_download 基于JavaMail的邮件收发系统.7z ( 17.54mb, 243次下载 )
error_outline 下载需要12点积分

发送私信

时间能冲淡一切,但却冲不掉一切

9
文章数
6
评论数
最近文章
eject