JMAIL API 完全理解

  • 格式:pdf
  • 大小:183.72 KB
  • 文档页数:18

JMAILAPI完全理解

JavaMailAPI是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。您可使

用这种包创建邮件用户代理(MailUserAgent,MUA)类型的程序,它类似于Eudora、Pine及MicrosoftOutlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代

理(MailTransferAgent,MTA)类型的程序那样用于传输、发送和转发消息。换句话说,

用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发

送任务。JavaMailAPI的设计是,为收发信息提供与协议无关的访问。方式是把该API划分成

两个部分:•该API的第一个部分是本课程的重点。基本上是如何发送和接收独立于提供程序/协

议的消息。•第二个部分则使用特定的协议语言,如:SMTP、POP、IMAP和NNTP。如果要让

JavaMailAPI与服务器通信,就需要为之提供协议。由于Sun公司对特定协议提供程序有

充分的介绍,用户可以免费获取,所以本课程没有介绍创建特定协议提供程序的内容。

复习相关协议

在学习JavaMailAPI的深层知识之前,让我们回过头来看一看在该API中使用的协议,

本质上有4种人们常用的协议:•SMTP

•POP

•IMAP

•MIME

您还需要了解NNTP及其他一些协议。理解这些协议的基本原理有助于您理解如何使用JavaMailAPI。而该API的设计要与协议无关,所以不能克服这些基础协议的限制。如果

选用的协议不支持某种功能,那么JavaMailAPI也无法在其上添加这种功能。(正如您一

会儿就会看到的,在操作POP协议时,常常会碰到这种问题)。SMTP

简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMailAPI环境中,

您的基于JavaMail的程序将与您公司或Internet服务提供商(ISP)的SMTP服务器通

信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP

或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转

发器,但需要确保SMTP服务器配置正确。JavaMailAPI中没有集成用于处理诸如配置服

务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。

POP

POP的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC1939中

定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定

义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉

的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到

诸如Eudora或MicrosoftOutlook之类的邮件程序中,能为您记住接收的上一封邮件,

以及计算有多少新邮件这类信息。因此,使用JavaMailAPI时,如果想获取这类信息,将

需要由自己进行计算。IMAP

IMAP是用于接收消息的更加高级的协议,它是在RFC2060中定义的。IMAP的含义

是“Internet消息访问协议”,当前版本是第4版,也称作IMAP4。使用IMAP时,您的邮

件服务器必须支持该协议。您不能只是简单地把程序转变为支持IMAP,而不是支持POP,

就指望能支持IMAP中的一切。假定您的邮件服务器支持IMAP,那么基于JavaMail的程

序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功

能。

由于IMAP协议具有更高级的功能,您也许会想IMAP应该被每一个人使用,但事实不

是这样。因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求

的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户

的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。而使用POP协议

时,已保存消息可以解除服务器的重负。

MIME

MIME的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定

义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC822、RFC2045、RFC2046和RFC2047。作为JavaMailAPI的用户,一般不需要担心这些

格式。但是,这些格式确实存在,并为您的程序所用。

NNP和其他协议

由于JavaMailAPI分开了提供程序和其他部分,所以您可以轻松地为附加协议添加支

持。Sun公司提供第3方提供程序清单,这些提供程序要利用Sun公司不支持的少见的协

议。在这份清单中,您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全

多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。

安装

目前有两种版本的JavaMailAPI最常用:1.2和1.1.3。本课程中的所有例子都适用

于这两种版本。其中JavaMailAPI1.2是最新的,而JavaMailAPI1.1.3中包含了Java2企业版(J2EE)平台1.2.1版,所以它仍然很常用。使用JavaMailAPI的版本会对您

的下载和安装产生一些影响。这两种版本的JavaMailAPI都能与JDK1.1.6、Java2标

准版(J2SE)平台1.2.x和1.3.x协同工作。

注意:在安装了Sun公司的JavaMail工具后,会在演示目录下看到许多示例程序。

安装JavaMail1.2

要使用JavaMail1.2API,可以下载JavaMail1.2工具,然后解压缩javamail-1_2.zip文件,并把mail.jar文件添加到典型安装路径下。JavaMail1.2工具

带有SMTP、IMAP4和POP3提供程序以及核心类。安装完JavaMail1.2后,再安装JavaBeansActivationFramework。

安装JavaMail1.1.3

要使用JavaMail1.1.3API,可以下载JavaMail1.1.3工具,然后解压缩javamail1_1_3.zip文件,并把mail.jar文件添加到典型安装路径下。JavaMail1.1.3

工具带有SMTP和IMAP4提供程序以及核心类。

如果您想用JavaMail1.1.3访问POP服务器,需要下载并安装POP3提供程序。Sun

公司拥有一个独立于JavaMail工具的提供程序。在下载并解压缩pop31_1_1.zip文件

后,也还需要把pop3.jar添加到典型安装路径下。

安装完JavaMail1.1.3后,再安装JavaBeansActivationFramework。

安装JavaBeansActivationFramework

JavaMailAPI的所有版本都需要JavaBeansActivationFramework(JavaBeans

激活框架),这种框架提供了对输入任意数据块的支持,并能相应地对其进行处理。看上去

效果好像不太好,但该框架是在当今的许多浏览器和邮件工具中可以找到的基本MIME类

型支持。下载该框架后,解压缩jaf1_0_1.zip文件,并将activation.jar文件添加到典

型安装路径下。

对于JavaMail1.2用户,现在应该把mail.jar和activation.jar文件添加到典型安装

路径下。

对于JavaMail1.1.3用户,现在应该把mail.jar、pop3.jar和activation.jar添加到

典型安装路径下。如果您不打算使用POP3,就不需要把pop3.jar文件添加到典型安装路

径下。

如果您不想更改安装路径环境变量,可以把JAR文件复制到Java运行时环境(JRE)

目录下的lib/ext目录下。例如,对于J2SE1.3版本,Windows平台上的默认目录应该

是C:\jdk1.3\jre\lib\ext。

使用Java2企业版

如果您使用的是J2EE,则在使用基本JavaMailAPI时,不需要做什么特殊的工作;JavaMailAPI带有J2EE类。只要确保j2ee.jar文件位于典型安装路径下,并完成了所有

的设置工作。

对于J2EE1.2.1,POP3提供程序是单独提供的,因此需要下载该提供程序,并按安装JavaMail1.1.3的步骤,在J2EE1.2.1中包含POP3提供程序。J2EE1.3的用户会获得

J2EE和POP3提供程序,因而不需要对POP3提供程序执行独立安装。使用这两种版本的

J2EE用户,都不需要安装JavaBeansActivationFramework。复习核心类

在开始深入研究JavaMail类之前,首先让用户浏览一下构成API的核心类:会话、消

息、地址、验证程序、传输,存储和文件夹。所有这些类都可以在JavaMailAPI即javax.mail的顶层包中找到,尽管您将频繁地发现您自己使用的子类是在

javax.mail.internet包中找到的。

Session类

Session类定义了一个基本的邮件会话。通过该会话可让别的工作顺利执行。Session

对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他

可在整个应用程序中共享的信息。

Session类的构造器是私有的。您可以获得一个可被getDefaultInstance()方法共享

的单一的默认会话:

Propertiesprops=newProperties();

//fillpropswithanyinformation

Sessionsession=Session.getDefaultInstance(props,null);

或者,您可以用getInstance()方法创建一个独特的会话:

Propertiesprops=newProperties();

//fillpropswithanyinformation

Sessionsession=Session.getInstance(props,null);

这两种情形下的null参数都是一种Authenticator对象,它不是在此时使用的。详细

信息请参阅其后的“Autherticator”一节。

在大多数情况下,使用共享会话就足够了,即使为多个用户邮箱处理邮件会话也是如此。

您可以在通信过程的后面一步添加上用户名和密码的组合,并保持所有的一切是独立的。

Message类

一旦创建了自己的Session对象,就是该去创建要发送的消息的时候了。这时就要用到

消息类型。作为一个抽象类,您必须操作一个子类,在大多数情况下,该子类是javax.mail.internet.MimeMessage。一个MimeMessage是一种理解MIME类型和报

头(在不同的RFC文档中均有定义)的消息。消息的报头被严格限制成只能使用US-ASCII

字符,尽管非ASCII字符可以被编码到某些报头字段中。