JavaMail基础知识

1.       电子邮件相关协议:

(1).SMTP

简单邮件传输协议,定义了递送邮件的机制。我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。这个SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。这并不需要SMTP服务器使用支持授权的邮件转发,但是却的确要注意SMTP服务器的正确设置(SMTP服务器的设置与JavaMail API无关)。

(2).POP

POP是一种邮局协议,目前为第3个版本,即众所周知的POP3。POP定义了一种用户如何获得邮件的机制。它规定了每个用户使用一个单独的邮箱。大多数人在使用POP时所熟悉的功能并非都被支持,例如查看邮箱中的新邮件数量。而这个功能是微软的Outlook内建的,那么就说明微软Outlook之类的邮件客户端软件是通过查询最近收到的邮件来计算新邮件的数量来实现前面所说的功能。因此在我们使用JavaMail API时需要注意,当需要获得如前面所讲的新邮件数量之类的信息时,我们不得不自己进行计算。

(3).IMAP

IMAP使用在接收信息的高级协议,目前版本为第4版,所以也被称为IMAP4。需要注意的是在使用IMAP时,邮件服务器必须支持该协议。从这个方面讲,我们并不能完全使用IMAP来替代POP,不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP,那么我们的邮件程序将能够具有以下被IMAP所支持的特性:每个用户在服务器上可具有多个目录,这些目录能在多个用户之间共享。IMAP协议是对POP3 协议的一种扩展,定义了邮件客户端软件与邮件服务器的通信规则。

其与POP相比高级之处显而易见,但是在尝试采取IMAP时,我们认识到它并不是十分完美的:由于IMAP需要从其它服务器上接收新信息,将这些信息递送给用户,维护每个用户的多个目录,这都为邮件服务器带来了高负载。

IMAP与POP的一个不同之处是:POP用户在接收邮件时将从邮件服务器上下载邮件,而IMAP允许用户直接访问邮件目录,所以在邮件服务器进行备份作业时,由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间,这将直接导致邮件服务器上磁盘空间暴涨。

(4).MIME

因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式。可以理解成一个定义合适的标准.它作为多用途邮件的扩展定义了邮件内容的格式:信息格式、附件格式等等。一些RFC标准都涉及了MIME:RFC 822, RFC 2045, RFC 2046, RFC 2047,有兴趣的Matrixer可以阅读一下。而作为JavaMail API的开发者,我们并不需关心这些格式定义,但是这些格式被用在了程序中。是 (5).NNTP和其它的第三方协议

正因为JavaMail API在设计时考虑到与第三方协议实现提供商之间的分离,故我们可以很容易的添加一些第三方协议。SUN维护着一个第三方协议实现提供商的列表:http://java.sun.com/products/javamail/Third_Party.html,通过此列表我们可以找到所需要的而又不被SUN提供支持的第三方协议:比如NNTP这个新闻组协议和S/MIME这个安全的MIME协议。

注意:邮件的接收和读取是两个不同的概念,分别使用两种不同的协议。

2.       电子邮件的工作过程:

电子邮件工作原理图:

JavaMail基础知识_第1张图片



3.       JavaMail的体系结构:

JavaMail基础知识_第2张图片

4.JavaMail的核心类介绍:

(1).Message:javax.mail.Message是创建和解析邮件的核心类,他的实例代表一封电子邮件。客户端程序发送邮件时,首先使用创建邮件JavaMail API创建出封装了邮件数据的Message对象,然后把这个对象传送给发送API发送。客户端接收邮件时,邮件接收API把收到的邮件数据封装在Message类的实例对象中,客户端程序再使用邮件分析API从这个对象中介析出接收到的邮件数据。

(2). Transport:javax.mail.Transport类是发送邮件的核心API,他的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP,客户端程序创建好Message对象后,只需要使用邮件发送API得到Transport对象,然后把Message对象传递给Transport对象,并调用它的发送方法,就可以把邮件发送给指定了SMTP服务器。

(3). Session:javax.mail.Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络联接的会话信息,如邮件服务器的主机名,端口号,采用的邮件发送和接收协议等。Session对象根据信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象是提供信息支持。

(4). InternetAddress:javax.mail.internet.InternetAddress。它继承自抽象类javax.mail.Address。InternetAddress类。用于表示邮件发送地址的类,其构造方法需要传递一个字符串类型的参数,如果是单个邮件地址,只需将邮件地址作为字符串参数传递即可,如果是群发邮件,则将所有的邮件地址拼接成一个字符串,中间有逗号“,”分隔即可,然后使用 InternetAddress.parse(以逗号分隔的多个邮件地址字符串)方法可以将群邮件地址解析为邮件地址数组。

注意:java的RFC822规范中规定多个邮件分隔符是逗号",",outlook的分号";"不是规范的多邮件地址分隔符。

(5). MimeMessage:javax.mail.internet.MimeMessage。它继承自抽象类javax.mail.Message,表示一封MIME邮件。MimeMessage有一个内部类Recipient类,即javax.mail.internet.MimeMessage.Recipient,表示邮件消息的接收者。这个类有一个属性to表示接收者,即接收邮件的邮箱地址。

MimeMessage内部类Recipient类还有一个Message.RecipientType内部类:

表示收件人的类型,它是Message中的一个静态类。该类中有如下三个常量:

a.TO:代表有健的主要接收者。

b.CC:代表有健的抄送接收者。

c.BCC:代表邮件的暗送接收者。

(6). Store:javax.mail.Store类是接收邮件的核心,他的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3。客户端程序接收到邮件时,只需要有事邮件接收API得到Store对象的接收方法,就可以从制定的POP3服务器获得邮件数据,并把这些数据封装到表示邮件的Message的对象中。Store类最常用的方法就是getFolder(),此方法得到指定名称的邮件服务器文件夹中的邮件。

(7). Folder:javax.mail.Folder,它是一个邮件文件夹类。Folder类有两个常见的属性,READ_ONLY表示只读,READ_WRITE表示其内容可读可写。

5. MIME邮件的组织结构:

MIME协议用于定义复杂邮件的格式,它可以表达多段平行的文本内容和非文本内容。例如,在邮件中插入附件。

MIME最主要的一个头字段是Content-Type,即内容类型,它用于指定具体资源的数据类型和组合消息的组合关系,都是通过消息头中的Content-Type头字段来指定的。其内容以“主类型/子类型”的形式出现,主类型有:text,image,audio,video,application,multipart,message等。每个主类型下面都有很多个子类型,比如text下面就有plain,htmlm,xml,css等子类型。Multipart主类型用于表示MIME组合关系,它是MIME协议中最重要的一种类型。

一封MIME邮件中的MIME消息可以有三种组合关系:混合,关联,选择。对应的MIMe类型如下:

Multipart/mixed:表示消息体中的内容是混合组合类型,可以是文本,声音和附件等不同邮件内容的混合体。

Multipart/related:表示消息体中的内容是关联(依赖)组合类型,表示消息体中的某些内容,依赖另外的资源。

Multipart/alternative:选择组合类型。

6.MIME邮件三种组合关系之间的关系:

JavaMail基础知识_第3张图片

7.MIME邮件组织结构相关的API:

MimeMessage类:表示整封MIME邮件。

MimeBody类:表示邮件的一个MIME消息。

MimeMultipart类:表示一个有多个MIME消息组成的MIME消息。

8.MIME邮件的组织形式:

JavaMail基础知识_第4张图片

9. JAF简介:

在使用JavaMail API进行邮件发送接收时,除了JavaMail相关的类以外,还需要使用JAF相关的类,JAF(JavaBeans Activation Framework,JavaBeans激活框架)是一个专用的数据处理框架,用于封装数据,并为应用程序提供访问和操作数据的接口。JavaMail API可以利用JAF从某种数据源中读取数据和获知数据的MIMe类型,并用这些数据生成MIME消息中的消息体和消息类型。

JAF的主要作用在于让Java应用程序知道如何对一个数据源进行察看,编辑和打印等操作。大家知道,在MSWord程序中可以打开一片Word文档中嵌套的Visio图片,JAF就是要让Java程序能够完成类似的技术应用,让应用程序知道数据源支持哪些操作,每个操作分别调用哪个处理模块。对于通过JAF封装的数据,应用程序通过JAF提供的接口可以完成以下操作:

(1)访问数据源中的数据;

(2)获知数据源的数据类型;

(3)获知可对数据进行的各种操作;

(4)用户对数据执行某种操作时,自动创建执行该操作的软件部件的实例对象。

例如,如果要使用JAF处理一个图片文件,那么应用程序通过JAF提供的接口就可以得到队图片文件进行操作的输入输出流,图片文件的MIME类型,JAF为图片文件提供的操作方法(如查看,毕激活打印图片等等),应用程序调用这些操作时,JAF就会调用相应的处理模块对数据进行处理。

你可能感兴趣的:(javamail)