java mail.docx

上传人:b****6 文档编号:15850642 上传时间:2023-07-08 格式:DOCX 页数:30 大小:82.46KB
下载 相关 举报
java mail.docx_第1页
第1页 / 共30页
java mail.docx_第2页
第2页 / 共30页
java mail.docx_第3页
第3页 / 共30页
java mail.docx_第4页
第4页 / 共30页
java mail.docx_第5页
第5页 / 共30页
java mail.docx_第6页
第6页 / 共30页
java mail.docx_第7页
第7页 / 共30页
java mail.docx_第8页
第8页 / 共30页
java mail.docx_第9页
第9页 / 共30页
java mail.docx_第10页
第10页 / 共30页
java mail.docx_第11页
第11页 / 共30页
java mail.docx_第12页
第12页 / 共30页
java mail.docx_第13页
第13页 / 共30页
java mail.docx_第14页
第14页 / 共30页
java mail.docx_第15页
第15页 / 共30页
java mail.docx_第16页
第16页 / 共30页
java mail.docx_第17页
第17页 / 共30页
java mail.docx_第18页
第18页 / 共30页
java mail.docx_第19页
第19页 / 共30页
java mail.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

java mail.docx

《java mail.docx》由会员分享,可在线阅读,更多相关《java mail.docx(30页珍藏版)》请在冰点文库上搜索。

java mail.docx

javamail

一什么是JavaMail?

JavaMail是Sun发布的用来处理email的API。

它可以方便地执行一些常用的邮件传输。

  虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(JavaDevelopmentKit),这就意味着你在使用前必须另外下载JavaMail文件。

除此以外,你还需要有Sun的JavaBeansActivationFramework(JAF)。

JavaBeansActivationFramework的运行很复杂,在这里简单的说就是JavaMail的运行必须得依赖于它的支持。

在Windows2000下使用需要指定这些文件的路径,在其它的操作系统上也类似。

JavaMailAPI是Java对电子邮件处理的延伸,它提供和通讯协定无关的Java解决方案,可以处理各种email格式,包括IMAP、POP、SMTP,以及MIME,和其他和Internet相关的讯息通讯协定。

JavaMailAPI简介

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环境。

复习核心类

在开始深入研究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字符可以被编码到某些报头字段中。

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

MimeMessagemessage=newMimeMessage(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类的构造器:

Addressaddress=newInternetAddress("president@whitehouse.gov");

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

Addressaddress=newInternetAddress("president@whitehouse.gov","GeorgeBush");

您要为消息的from(发送者)字段和to(接收者)字段创建地址对象。

除非您的邮件服务器阻止这样做,否则要在发送的消息中注明该消息的发送者。

一旦创建好了地址,有两种方法可让您将地址与消息连接起来。

为了鉴别发送者,您可以使用setFrom()和setReplyTo()方法。

message.setFrom(address)

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

Addressaddress[]=...;

message.addFrom(address);

为了鉴别消息接收者,您可以使用addRecipient()方法。

该方法除了需要一个地址参数外,还需要一个Message.RecipientType属性(消息的接收类型)。

message.addRecipient(type,address)

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

·Message.RecipientType.TO

·Message.RecipientType.CC

·Message.RecipientType.BCC

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

AddresstoAddress=newInternetAddress("vice.president@whitehouse.gov");

AddressccAddress=newInternetAddress("first.lady@whitehouse.gov");

message.addRecipient(Message.RecipientType.TO,toAddress);

message.addRecipient(Message.RecipientType.CC,ccAddress);

JavaMailAPI没有提供检查电子邮件地址有效性的机制。

您可以自己编写支持扫描有效字符(在RFC822文档中所定义的)的程序或检验MX(邮件交换)记录,这些都超越了JavaMailAPI的范围。

Authenticator类

与类一样,JavaMailAPI可以利用Authenticator(验证程序)类通过用户名和密码来访问受保护的资源。

对于JavaMailAPI来说,这种受保护的资源是指邮件服务器。

JavaMail的Authenticator类可以在javax.mail包中找到,并有别于同名的类。

当JavaMailAPI在Java1.1下工作时,JavaMail和不会共享同一个Authenticator类名称,这是因为Java1.1中不含有。

要使用Authenticator类,您可以使用该抽象类的子类,并通过getPasswordAuthentication()方法返回一个PasswordAuthentication实例。

在创建时,您必须用会话记录Authentication类。

其后,当需要进行身份验证时,会通知您的Authenticator。

会弹出一个窗口,或从一个配置文件(尽管不加密就不安全)中读取用户名和密码,并把它们作为一个PasswordAuthentication对象返回给调用程序。

Propertiesprops=newProperties();

//fillpropswithanyinformation

Authenticatorauth=newMyAuthenticator();

Sessionsession=Session.getDefaultInstance(props,auth);

Transport类

发送消息的最后一步操作是使用Transport类。

该类使用特定于协议(通常是SMTP)的语言来发送消息。

它是一个抽象类,其操作与Session类有些相似。

您可以通过只调用静态的send()方法来使用该类的默认版本:

Transport.send(message);

或者,您可以从用于您的协议的会话中获取一个特定的实例,然后传递用户名和密码(不必要时可以为空)并发送消息,最后关闭连接:

message.saveChanges();//implicitwithsend()

Transporttransport=session.getTransport("smtp");

transport.connect(host,username,password);

transport.sendMessage(message,message.getAllRecipients());

transport.close();

当您需要发送多个消息时,建议采用后一种方法,因为它将保持消息间活动服务器的连接。

而基本的send()机制会为每一个方法调用都建立一条独立的连接。

注意:

要查看经过邮件服务器邮件命令,可以用session.setDebug(true)方法设置调试标志。

Store和Folder类

使用Session类来获取消息,开始时与发送消息很相似。

但是,在获取会话后,很有可能使用用户名和密码或Authenticator类来连接Store类。

与Transport类一样,您要告诉Store类将使用什么协议:

//Storestore=session.getStore("imap");

Storestore=session.getStore("pop3");

store.connect(host,username,password);

在连接Store类后,就可以获取一个Folder类,在读取其中的消息前必须先打开该类。

Folderfolder=store.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

Messagemessage[]=folder.getMessages();

对于POP3协议,惟一可用的文件夹是INBOX。

如果使用的是IMAP协议,则可以使用其他的文件夹。

注意:

Sun公司的提供程序本来想提供方便。

而Messagemessage[]=folder.getMessages();这条语句却是一种从服务器逐条读取消息的缓慢操作,所以仅当您确实需要获取消息部分(该内容是所检索消息的内容)时可以使用这条语句。

一旦读取消息,就可以使用getContent()方法获取其内容,或使用writeTo()方法将其内容写到一个流中。

getContent()方法只获取消息内容,而writeTo()方法则还会输出报头。

System.out.println(((MimeMessage)message).getContent());

一旦您阅读完邮件,就可以关闭对文件夹和存储的连接。

folder.close(aBoolean);

store.close();

传递给文件夹的close()方法的布尔变量指定了是否通过清除已删除的消息来更新文件夹。

继续前进

实际上,理解使用这7个类的方式,是使用JavaMailAPI处理几乎所有事情所需要的全部内容。

用这7个类以外的方式构建的JavaMailAPI,其大多数功能都是以几乎完全相同或特定的方式来执行任务的,就好像内容是附件。

特定的任务,如:

搜索、隔离等将在后面进行介绍。

使用JavaMailAPI

您已经看到了如何操作JavaMailAPI的核心部分。

在下面几节中,您将学习如何连接几个部分以执行特定的任务。

发送消息

发送电子邮件消息涉及到获取会话、创建和填充消息并发送消息这些操作。

您可以在获取Session时,通过为要传递的Properties对象设置mail.smtp.host属性来指定您的SMTP服务器。

Stringhost=...;

Stringfrom=...;

Stringto=...;

//Getsystemproperties

Propertiesprops=System.getProperties();

//Setupmailserver

props.put("mail.smtp.host",host);

//Getsession

Sessionsession=Session.getDefaultInstance(props,null);

//Definemessage

MimeMessagemessage=newMimeMessage(session);

message.setFrom(newInternetAddress(from));

message.addRecipient(Message.RecipientType.TO,

newInternetAddress(to));

message.setSubject("HelloJavaMail");

message.setText("WelcometoJavaMail");

//Sendmessage

Transport.send(message);

您应该在try-catch块中编写代码,以在创建消息并发送它时可以抛出一个异常。

练习

发送您的第一个消息

获取消息

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2