JavaMail发送和接收.docx

上传人:b****8 文档编号:10306958 上传时间:2023-02-10 格式:DOCX 页数:32 大小:31.21KB
下载 相关 举报
JavaMail发送和接收.docx_第1页
第1页 / 共32页
JavaMail发送和接收.docx_第2页
第2页 / 共32页
JavaMail发送和接收.docx_第3页
第3页 / 共32页
JavaMail发送和接收.docx_第4页
第4页 / 共32页
JavaMail发送和接收.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

JavaMail发送和接收.docx

《JavaMail发送和接收.docx》由会员分享,可在线阅读,更多相关《JavaMail发送和接收.docx(32页珍藏版)》请在冰豆网上搜索。

JavaMail发送和接收.docx

JavaMail发送和接收

JavaMail发送和接收

一、JavaMail概述:

       JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。

但它并没有包含在JDK中,而是作为J2EE的一部分。

       厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:

●         SMTP:

简单邮件传输协议,用于发送电子邮件的传输协议;

●         POP3:

用于接收电子邮件的标准协议;

●         IMAP:

互联网消息协议,是POP3的替代协议。

这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。

除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeansActivationFramework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。

下图描述了JavaMail的体系结构。

 

mail.jar:

此JAR文件包含JavaMailAPI和Sun提供的SMTP、IMAP和POP3服务提供程序;

activation.jar:

此JAR文件包含JAFAPI和Sun的实现。

 

二、对相关协议的回顾:

       1、介绍

       在研究 JavaMailAPI 的细则之前,让我们回顾用于 API 的协议。

基本上,您会逐渐熟悉并喜爱的协议有四个:

 

    *SMTP

    *POP

    *IMAP

    *MIME

 

您还将碰到 NNTP 和其它协议。

理解所有协议的基本知识将有助于您理解如何使用 JavaMailAPI。

虽然不了解这些协议您照样可以用这个 API,却不能够克服那些基础协议的局限性。

如果我们精选的协议不能支持某种性能,JavaMailAPI 决不能魔术般的将这种性能添加上去。

(您很快就会看到,在处理 POP 时这将成为一个难题。

      

       2、SMTP

       简单邮件传输协议(SimpleMailTransferProtocol,SMTP)由 RFC821 定义。

它定义了发送电子邮件的机制。

在 JavaMailAPI 环境中,您基于 JavaMail的程序将和您的公司或因特网服务供应商的(InternetServiceProvider's,ISP's)SMTP 服务器通信。

SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用户经由 POP 或 IMAP 获得。

这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP 服务器支持身份验证,不过还是得确保它的配置正确。

像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMailAPI 中并不支持。

 

       3、POP

       POP 代表邮局协议(PostOfficeProtocol)。

目前用的是版本 3,也称 POP3,RFC1939 定义了这个协议。

POP 是一种机制,因特网上大多数人用它得到邮件。

它规定每个用户一个邮箱的支持。

这就是它所能做的,而这也造成了许多混淆。

使用 POP 时,用户熟悉的许多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。

这些性能内建于如 Eudora 或 MicrosoftOutlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。

所以当使用 JavaMailAPI 时,如果您想要这类信息,您就必须自己算。

 

       4、IMAP

       IMAP 是更高级的用于接收消息的协议。

在 RFC2060 中被定义,IMAP 代表因特网消息访问协议(InternetMessageAccessProtocol),目前用的是版本 4,也称 IMAP4。

在用到 IMAP 时,邮件服务器必需支持这个协议。

不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。

假设邮件服务器支持 IMAP,基于 JavaMail的程序可以利用这种情况 — 用户在服务器上有多个文件夹(folder),并且这些文件夹可以被多个用户共享。

       因为有这一更高级的性能,您也许会认为所有用户都会使用 IMAP。

事实并不是这样。

要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。

这样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。

使用 POP,就能卸载邮件服务器上保存的消息了。

      

       5、MIME

       MIME 代表多用途因特网邮件扩展标准(MultipurposeInternetMailExtensions)。

它不是邮件传输协议。

但对传输内容的消息、附件及其它的内容定义了格式。

这里有很多不同的有效文档:

RFC822、RFC2045、RFC2046 和 RFC2047。

作为一个 JavaMailAPI 的用户,您通常不必对这些格式操心。

无论如何,一定存在这些格式而且程序会用到它。

 

       6、NNTP及其他

       因为 JavaMailAPI 将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持。

Sun 保留了一张第三方供应商列表,他们利用了 Sun 不提供超出(out-of-the-box)支持范围的协议。

您会找到 NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途因特网邮件扩展)及其它支持。

 

 

      

      

三、JavaMail的关键对象:

       JavaMail对收发邮件进行了高级的抽象,形成了一些关键的的接口和类,它们构成了程序的基础,下面我们分别来了解一下这些最常见的对象。

Properties:

属性对象

       由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail通过Properties对象封装这些属性西信息。

如下面的代码封装了两个属性信息:

       Propertiesprops= new Properties();

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

    props.put("mail.smtp.auth", "true");

   

    针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,下表是针对SMTP协议的一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):

属性名

属性类型

说明

mail.stmp.host

String

SMTP服务器地址,如

mail.stmp.port

int

SMTP服务器端口号,默认为25

mail.stmp.auth

boolean

SMTP服务器是否需要用户认证,默认为false

mail.stmp.user

String

SMTP默认的登陆用户名

mail.stmp.from

String

默认的邮件发送源地址

mail.stmp.socketFactory.class

String

socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现.SocketFactory接口

mail.stmp.socketFactory.port

int

指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号

mail.smtp.socketFactory.fallback

boolean

设置为true时,当使用指定的socket类创建socket失败后,将使用.Socket创建socket,默认为true

mail.stmp.timeout

int

I/O连接超时时间,单位为毫秒,默认为永不超时

       其他几个协议也有类似的一系列属性,如POP3的mail.pop3.host、mail.pop3.port以及IMAP的mail.imap.host、mail.imap.port等。

更详细的信息请查看com.sun.mail.smtp、com.sun.mail.pop3和com.sun.mail.imap这三个包的Javadoc:

 

Session:

会话对象

       Session是一个很容易被误解的类,这归咎于混淆视听的类名。

千万不要以为这里的Session像HttpSession一样代表真实的交互会话,但创建Session对象时,并没有对应的物理连接,它只不过是一对配置信息的集合。

Session的主要作用包括两个方面:

       1)接收各种配置属性信息:

通过Properties对象设置的属性信息;

       2)初始化JavaMail环境:

根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。

       所以,如果把Session更名为Configure也许更容易理解一些。

JavaMail提供者在Jar包的META-INF目录下,通过以下文件提供了基本配置信息,以便session能够根据这个配置文件加载提供者的实现类:

●         javamail.providers和javamail.default.providers;

●         javamail.address.map和javamail.default.address.map。

       下面是Sun提供者java.mail.default.providers文件的配置信息(位于mail.jar中):

    #JavaMailIMAPproviderSunMicrosystems,Inc

    protocol=imap;type=store;class=com.sun.mail.imap.IMAPStore;vendor=SunMicrosystems,Inc;

    protocol=imaps;type=store;class=com.sun.mail.imap.IMAPSSLStore;vendor=SunMicrosystems,Inc;

    #JavaMailSMTPproviderSunMicrosystems,Inc

    protocol=smtp;type=transport;class=com.sun.mail.smtp.SMTPTransport;vendor=SunMicrosystems,Inc;

    protocol=smtps;type=transport;    class=com.sun.mail.smtp.SMTPSSLTransport;vendor=SunMicrosystems,Inc;

    #JavaMailPOP3providerSunMicrosystems,Inc

    protocol=pop3;type=store;class=com.sun.mail.pop3.POP3Store;vendor=SunMicrosystems,Inc;

    protocol=pop3s;type=store;class=com.sun.mail.pop3.POP3SSLStore;vendor=SunMicrosystems,Inc;

       这个配置文件提供了以下四个方面的信息:

       protocol:

协议名称;

       type:

协议类型;

       class:

对应该操作类型的实现类;

       vendor:

厂商名称。

       Session在加载配置文件时会按照以下优先级顺序进行:

       1)首先使用/lib中的javamail.providers;

       2)如果1)不存在相应的配置文件,使用类路径下mail.jar中META-INF目录下的javamail.providers;

       3)如果2)不存在相应的配置文件,使用类路径下的mail.jar中META-INF目录下的javamail.default.providers;

       所以开发者可以在/lib目录下提供配置文件覆盖mail.jar/META-INF目录中厂商的配置。

但是,一般情况下,我们无须这样做。

       Session通过JavaMail配置文件以及程序中设置的Properties对象构建一个邮件处理环境,后续的处理将在Session基础上进行。

Session拥有多个静态工厂方法用于创建Session实例。

●         staticSessiongetDefaultInstance(Propertiesprops,Authenticatorauthenticator):

当JVM中已经存在默认的Session实例中,直接返回这个实例,否则创建一个新的Session实例,并将其作为JVM中默认Session实例。

这个API很诡异,我们将对它进行详细的讲解。

由于这个默认Session实例可以被同一个JVM所有的代码访问到,而Session中本身又可能包括密码、用户名等敏感信息在内的所有属性信息,所以后续调用也必须传入和第一次相同的Authenticator实例,否则将抛出java.lang.SecurityException异常。

如果第一次调用时Authenticator入参为null,则后续调用通过null的Authenticator入参或直接使用getDefaultInstance(Propertiesprops)即可返回这个默认的Session实例。

值得一提的是,虽然后续调用也会传入Properties,但新属性并不会起作用,如果希望采用新的属性值,则可以通过getDefaultInstance(Propertiesprops)创建一个新的Session实例达到目的。

Authenticator在这里承当了两个功能:

首先,对JVM中默认Session实例进行认证保护,后续调用执行getDefaultInstance(Propertiesprops,Authenticatorauthenticator)方法时必须和第一次一样;其次,在具体和邮件服务器交互时,又作为认证的信息;

●         staticSessiongetDefaultInstance(Propertiesprops):

返回JVM中默认的Session实例,如果第一次创建Session未指定Authenticator入参,后续调用可以使用该访问获取Session;

●         staticSessiongetInstance(Propertiesprops,Authenticatorauthenticator):

创建一个新的Session实例,它不会在JVM中被作为默认实例共享;

●         staticSessiongetInstance(Propertiesprops):

根据相关属性创建一个新的Session实例,未使用安全认证信息;

       Session是JavaMail提供者配置文件以及设置属性信息的“容器”,Session本身不会和邮件服务器进行任何的通信。

所以在一般情况下,我们仅需要通过getDefaultInstance()获取一个共享的Session实例就可以了,下面的代码创建了一个Session实例:

       Propertiesprops=System.getProperties();

    props.setProperty("mail.transport.protocol","smtp");              …

    Sessionsession=Session.getDefaultInstance(props);

 

Transport和Store:

传输和存储

       邮件操作只有发送或接收两种处理方式,JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。

       Session提供了几个用于创建Transport和Store实例的方法,在具体讲解这些方法之前,我们事先了解一下Session创建Transport和Store的内部机制。

我们知道提供者在javamail.providers配置文件中为每一种支持的邮件协议定义了实现类,Session根据协议类型(stmp、pop3等)和邮件操作方式(传输和存储)这两个信息就可以定位到一个实例类上。

比如,指定stmp协议和transport类型后,Session就会使用com.sun.mail.smtp.SMTPTransport实现类创建一个Transport实例,而指定pop3协议和store类型时,则会使用com.sun.mail.pop3.POP3Store实例类创建一个Store实例。

Session提供了多个重载的getTransport()和getStore()方法,这些方法将根据Session中Properties属性设置情况进行工作,影响这两套方法工作的属性包括:

属性名

说明

mail.transport.protocol

默认的邮件传输协议,例如,smtp

mail.store.protocol

默认的存储邮件协议,例如:

pop3

mail.host

默认的邮件服务地址,例如:

192.168.67.1

mail.user

默认的登陆用户名,例如:

zapldy

下面,我们再回头来了解Session的getTransport()和getStore()的重载方法。

●         TransportgetTransport():

当Session实例设置了mail.transport.protocol属性时,该方法返回对应的Transport实例,否则抛出javax.mail.NoSuchProviderException。

●         TransportgetTransport(Stringprotocol):

如果Session没有设置mail.transport.protocol属性,可以通过该方法返回指定类型的Transport,如transport=session.getTransport(“smtp”)。

如果Session中未包含Authenticator,以上两方法创建的Transport实例和邮件服务器交互时必须显示提供用户名/密码的认证信息。

如果Authenticator非空,则可以在和邮件服务器交互时被作为认证信息使用。

除了以上两种提供认证信息的方式外,Session还可以使用以下的方法为Transport提供认证信息。

TransportgetTransport(URLNameurl):

用户可以通过URLName入参指定邮件协议、邮件服务器、端口、用户名和密码信息,请看下面的代码:

       URLNameurln=newURLName(“smtp”,“”,25,null,“masterspring2”,“spring”);

       Transporttransport=session.getTransport(urln);

       这里,指定了邮件协议为smtp,邮件服务器是,端口为25,用户名/密码为masterspring2/spring。

      

       消息发送的最后一部分是使用  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) 设置调试标志。

 

       用 Session 获取消息与发送消息开始很相似。

但是,在 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(); 看上去是个很慢的操作,它从服务器上读取每一条消息,但仅在你实际需要消息的一部分时,消息的内容才会被检索。

一旦有了要读的 Message,您可以用 getContent() 来获取其内容,或者用 writeTo() 将内容写入流。

getContent() 方法只能得到消息内容,而 writeTo() 的输出却包含消息头。

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

一旦读完邮件,要关闭与 folder 和 store 的连接。

f

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1