javamail api简介
javamail api是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。您可使用这种包创建邮件用户代理(mail user agent ,mua) 类型的程序,它类似于eudora、pine及microsoft outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(mail transfer agent,mta)类型的程序那样用于传输、发送和转发消息。换句话说,用户可以与mua类型的程序交互,以阅读和撰写电子邮件。mua依靠mta处理实际的发送任务。
javamail api的设计是,为收发信息提供与协议无关的访问。方式是把该api划分成两个部分:
• 该api的第一个部分是本课程的重点。基本上是如何发送和接收独立于提供程序/协议的消息。
• 第二个部分则使用特定的协议语言,如:smtp、pop、imap和nntp。如果要让javamail api与服务器通信,就需要为之提供协议。由于sun公司对特定协议提供程序有充分的介绍,用户可以免费获取,所以本课程没有介绍创建特定协议提供程序的内容。
复习相关协议
在学习javamail api的深层知识之前,让我们回过头来看一看在该api中使用的协议,本质上有4种人们常用的协议:
• smtp
• pop
• imap
• mime
您还需要了解nntp及其他一些协议。理解这些协议的基本原理有助于您理解如何使用javamail api。而该api的设计要与协议无关,所以不能克服这些基础协议的限制。如果选用的协议不支持某种功能,那么javamail api也无法在其上添加这种功能。(正如您一会儿就会看到的,在操作pop协议时,常常会碰到这种问题)。
smtp
简单邮件传输协议(smtp)是用于传送电子邮件的机制。在javamail api环境中,您的基于javamail的程序将与您公司或internet服务提供商(isp)的smtp服务器通信。该smtp服务器将会把消息转发给用作接收消息的smtp服务器,最后用户可通过pop或imap协议获取该消息。由于支持身份验证,所以不需要smtp服务器是一种开放的转发器,但需要确保smtp服务器配置正确。javamail api中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。
pop
pop的含义是邮局协议,当前的版本为3,也称作pop3,该协议是在rfc 1939中定义的。pop是internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用pop协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,pop根本不支持。这些功能都内置到诸如eudora或microsoft outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用javamail api时,如果想获取这类信息,将需要由自己进行计算。
imap
imap是用于接收消息的更加高级的协议,它是在rfc 2060中定义的。imap的含义是“internet消息访问协议”,当前版本是第4版,也称作imap4。使用imap时,您的邮件服务器必须支持该协议。您不能只是简单地把程序转变为支持imap,而不是支持pop,就指望能支持imap中的一切。假定您的邮件服务器支持imap,那么基于javamail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功能。
由于imap协议具有更高级的功能,您也许会想imap应该被每一个人使用,但事实不是这样。因为imap会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。而使用pop协议时,已保存消息可以解除服务器的重负。
mime
mime的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了mime协议,包含:rfc 822、rfc 2045、rfc 2046和rfc 2047。作为javamail api的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。
nnp和其他协议
由于javamail api分开了提供程序和其他部分,所以您可以轻松地为附加协议添加支持。sun公司提供第3方提供程序清单,这些提供程序要利用 sun公司不支持的少见的协议。在这份清单中,您将会看到对nntp(网络新闻传输协议)[新闻组]、s/mime(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。
安装
目前有两种版本的javamail api最常用:1.2和1.1.3。本课程中的所有例子都适用于这两种版本。其中javamail api 1.2是最新的,而javamail api 1.1.3中包含了java 2企业版(j2ee)平台1.2.1版,所以它仍然很常用。使用javamail api的版本会对您的下载和安装产生一些影响。这两种版本的javamail api都能与jdk 1.1.6、java 2标准版(j2se)平台1.2.x和1.3.x
协同工作。
注意:在安装了sun公司的javamail工具后,会在演示目录下看到许多示例程序。
安装javamail 1.2
要使用javamail 1.2 api,可以下载javamail 1.2工具,然后解压缩javamail-1_2.zip文件,并把mail.jar文件添加到典型安装路径下。javamail 1.2工具带有smtp、imap4和pop3提供程序以及核心类。
安装完javamail 1.2后,再安装javabeans activation framework。
安装javamail 1.1.3
要使用javamail 1.1.3 api,可以下载javamail 1.1.3工具,然后解压缩javamail1_1_3.zip文件,并把mail.jar文件添加到典型安装路径下。javamail 1.1.3工具带有smtp和imap4提供程序以及核心类。
如果您想用javamail 1.1.3访问pop服务器,需要下载并安装pop3提供程序。sun公司拥有一个独立于 javamail 工具的提供程序。在下载并解压缩pop31_1_1.zip文件后,也还需要把pop3.jar添加到典型安装路径下。
安装完javamail 1.1.3后,再安装javabeans activation framework。
安装javabeans activation framework
javamail api的所有版本都需要javabeans activation framework(javabeans激活框架),这种框架提供了对输入任意数据块的支持,并能相应地对其进行处理。看上去效果好像不太好,但该框架是在当今的许多浏览器和邮件工具中可以找到的基本mime类型支持。下载该框架后,解压缩jaf1_0_1.zip文件,并将activation.jar文件添加到典型安装路径下。
对于javamail 1.2用户,现在应该把mail.jar和activation.jar文件添加到典型安装路径下。
对于javamail 1.1.3用户,现在应该把mail.jar、pop3.jar和activation.jar添加到典型安装路径下。如果您不打算使用pop3,就不需要把pop3.jar文件添加到典型安装路径下。
如果您不想更改安装路径环境变量,可以把jar文件复制到java运行时环境(jre)目录下的lib/ext目录下。例如,对于j2se 1.3版本,windows平台上的默认目录应该是c:/jdk1.3/jre/lib/ext。
使用java 2企业版
如果您使用的是j2ee,则在使用基本javamail api时,不需要做什么特殊的工作;javamail api带有j2ee类。只要确保j2ee.jar文件位于典型安装路径下,并完成了所有的设置工作。
对于j2ee 1.2.1,pop3提供程序是单独提供的,因此需要下载该提供程序,并按安装javamail 1.1.3的步骤,在j2ee 1.2.1中包含pop3提供程序。j2ee 1.3的用户会获得j2ee和pop3提供程序,因而不需要对pop3提供程序执行独立安装。使用这两种版本的j2ee用户,都不需要安装javabeans activation framework。
练习
设置您的 javamail 环境。
复习核心类
在开始深入研究javamail类之前,首先让用户浏览一下构成api的核心类:会话、消息、地址、验证程序、传输,存储和文件夹。所有这些类都可以在javamail api即javax.mail的顶层包中找到,尽管您将频繁地发现您自己使用的子类是在javax.mail.internet包中找到的。
session类
session类定义了一个基本的邮件会话。通过该会话可让别的工作顺利执行。session对象利用java.util.properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。
session类的构造器是私有的。您可以获得一个可被getdefaultinstance()方法共享的单一的默认会话:
properties props = new properties();
// fill props with any information
session session = session.getdefaultinstance(props, null);
或者,您可以用getinstance()方法创建一个独特的会话:
properties props = new properties();
// fill props with any information
session session = session.getinstance(props, null);
这两种情形下的null参数都是一种authenticator对象,它不是在此时使用的。详细信息请参阅其后的“autherticator”一节。
在大多数情况下,使用共享会话就足够了,即使为多个用户邮箱处理邮件会话也是如此。您可以在通信过程的后面一步添加上用户名和密码的组合,并保持所有的一切是独立的。
message类
一旦创建了自己的session对象,就是该去创建要发送的消息的时候了。这时就要用到消息类型。作为一个抽象类,您必须操作一个子类,在大多数情况下,该子类是javax.mail.internet.mimemessage。一个mimemessage是一种理解mime类型和报头(在不同的rfc文档中均有定义)的消息。消息的报头被严格限制成只能使用us-ascii字符,尽管非ascii字符可以被编码到某些报头字段中。
闽公网安备 35060202000074号