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字符可以被编码到某些报头字段中。