今天是:
首 页电子商务研究报告PR查询域名WHOIS查询CSS编辑器建站素材
网海拾贝,电脑资讯,电脑快报,it资讯,网站建设资讯,教程基地
首页 操作系统 工具软件 网络应用 办公应用 软件开发 数据库 平面设计 网站运营
  当前位置:首 页 >> 软件开发 >> java教程 >> JavaMail API完全理解

JavaMail API完全理解

  发布于2006-03-26 09:38 来源:csdn 作者:zhoujian2003

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.3jrelibext。

    使用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类之前,首先让用户浏览一下构成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字符可以被编码到某些报头字段中。

    可以通过将Session对象传递给MimeMessage构造器的方法来创建消息:

    MimeMessage message = new MimeMessage(session);
    注意:还有其他的构造器,像用于创建消息的源于RFC822格式化的输入流的构造器。

    一旦创建了消息,就可以设置其各个部分,如Message(消息)实现Part(部分)接口(以MimeMessage实现MimePart)。设置内容的基本机制是setContent()方法,它带有表示内容和MIME类型的参数:

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

    但是,如果正在使用 MimeMessage,并且您的消息是纯文本,那么您就可以使用setText()方法。该方法只需要一个表示实际内容的参数,默认的MIME类型为纯文本:

    message.setText("Hello");

    对于纯文本消息,setText()方法更常常被用来设置内容。要发送其他类型的消息,如HTML消息,就要使用setContent方法()。现在用的更多的是HTML消息。

    要设置主题,可以使用setSubject()方法:

    message.setSubject("First");

    Address类

    一旦创建了会话和消息,并为消息填充了内容,就需要用Address类为您的信件标上地址了。同Message类一样,Address类也是一种抽象类。您可以使用javax.mail.internet.InternetAddress类。

    要创建只带有电子邮件地址的地址,可以把电子邮件地址传递给Address类的构造器:

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

    如果想让一个名字出现在电子邮件地址后,也可以将其传递给构造器:

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

    您要为消息的from(发送者)字段和to(接收者)字段创建地址对象。除非您的邮件服务器阻止这样做,否则要在发送的消息中注明该消息的发送者。

    一旦创建好了地址,有两种方法可让您将地址与消息连接起来。为了鉴别发送者,您可以使用setFrom()和setReplyTo()方法。

    message.setFrom(address)

    如果您的消息需要显示多个地址来源,则可以使用addFrom()方法:

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

    为了鉴别消息接收者,您可以使用addRecipient()方法。该方法除了需要一个地址参数外,还需要一个Message.RecipientType属性(消息的接收类型)。

    message.addRecipient(type, address)

    地址的3种预定义类型如下:

    · Message.RecipientType.TO
    · Message.RecipientType.CC
    · Message.RecipientType.BCC

    因此,如果一条消息将发送给副总统,同时还将发送该消息的副本给第一夫人,则采用下面的代码:

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

    JavaMail API没有提供检查电子邮件地址有效性的机制。您可以自己编写支持扫描有效字符(在RFC 822文档中所定义的)的程序或检验MX(邮件交换)记录,这些都超越了JavaMail API的范围。



中查找“JavaMail API完全理解”更多相关内容

中查找“JavaMail API完全理解”更多相关内容



上一篇:用Java实现几种常见的排序算法
下一篇:J2EE中使用Display标记库来展示表格
最近更新 赞助商
·JAVA实现网页快照,存为图片格式11-04
·实例说明如何集成Spring和Struts03-26
·详解Java多线程开发中的数据同步03-25
·Java多线程初学者指南(7):向线程传递..03-18
·J2ME中实现多线程技术总结03-18
·Java进阶:Java编写通过代理访问的应用程序03-16
·Java进行并发多连接socket编程03-16
·Struts核心标签03-16
·Java多线程初学者指南(6):慎重使用vol..03-16
·Java操作Microsoft Word之jacob03-16
·JAVA里面方法调用时传对象参数的陷阱03-16
热门排行 最新推荐
·什么是线程,如何创建线程
·java读取纯真IP数据库QQwry.dat的源..
·什么是同步,如何在多线程间保持同步
·分享版:JBOSS 工作流与JBPM开发实例..
·Java多线程初学者指南(7):向线程..
·如何结合使用EJB 3和Ajax
·JavaMail API完全理解
·Eclipse RCP技术简介
· 如何合理地调度多线程程序,常用的..
·Java学习从入门到精通
·如何结合使用EJB 3和Ajax
·关于Java23种设计模式的有趣见解

共有评论 0 条 网友评分 0分 查看所有评论


发表评论→ 学而不思则罔,思而不学则殆,请大胆发表你的见解。

输验证码:

您对此篇文章的评分:1分 2分 3分 4分 5分

  • 站内搜索
关键词

搜索方式

搜索范围

精确匹配
Baidu
网站首页 - 关于本站 - 网站地图 - 广告合作 - 站点声明 - RSS订阅 - 联系我们
Copyright © 2005 网海拾贝.[京ICP备11020891号-2 公安备案:110105007363]. All Rights Reserved .