JavaMail详解(二)——API简介 - 高飞网
359 人阅读

JavaMail详解(二)——API简介

2016-11-04 17:49:54

官网:https://java.net/projects/javamail/pages/Home

1. API简介

    JavaMail API提供了一个独立于平台和协议的框架,用来构建邮件和消息应用。JavaMail API提供了一个包含邮件系统的抽象定义的类集。它是个用来阅读、组建和发送电子邮件的可选包(标准扩展)。

    JavaMail提供了用于构建消息系统的接口的元素,包含了系统组件和接口。然而规范没有定义任何具体的实现,JavaMail不包含实现RFC822标准和MIME网络消息标准的类。这些类作为JavaMail类包的一部分。

下面是JavaMail API支持的一些协议:

  1. SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议的简称,提供了发送邮件的机制。
  2. POP:Post Office Protocol,即邮局协议的简称。POP协议是互联网上多数用户用来获取邮件的一种机制。它规定,每个用户只能使用单一的邮箱。PFC1939定义了该协议。
  3. IMAP:Internet Message Access Protocol。这是一个获取邮件的高级协议。提供了每个用户多个邮箱的能力,另外,一个邮箱可以被多个用户共享,RFC2060定义了该协议。
  4. MIME:Multipurpose Internet Mail Extensions。值得注意的是,它并不是一个邮件传输协议。它定义了传输的内容:即消息的格式,附件等。它有多个规格说明书,如RFC822,RFC2045,RFC 2046和RFC2047。作为一个JavaMail的用户,你一般情况下不需要考虑这些格式,然而,这些格式确实在你的程序中存在着,并在程序中使用着。
  5. NNTP和其他的:有许多第三方厂商提供的协议。这些中有Network News Transfer Protocol (NNTP), Secure Multipurpose Internet Mail Extensions (S/MIME)等。

2. 架构

    如前所述,Java应用使用JavaMail API去组建发送或接收邮件,下图指示了JavaMail的基础架构:

JavaMail API Architecture

    JavaMail的抽象机制与JavaEE、JDBC、JNDI或JMS很类似,像上图说明的,JavaMail API被分为以下两个部分:

  1. 应用独立部分:应用程序接口(API)被应用组件用来发送和接收邮件消息,独立于底层提供商和所使用的协议
  2. 服务独立部分:服务提供商接口(SPI)指定一种协议房产证,如SMTP、POP、IMAP或NNTP。它是用来插入电子邮件服务的提供者到J2EE平台

3. 核心类库

    JavaMail API包含了许多接口和类,用以发送、读取和删除电子邮件消息。即使在JavaMail API中有非常多的包,但基本上经常使用的都包含两个主要的包里面,分别是javax.mailjavax.mail.internet包。这些包包含了所有的核心类,如下:

描述
javax.mail.SessionAPI的关键类,代表连接工厂的多线程对象。
javax.mail.Message电子邮件消息的抽象类,其子类提供确切的实现
javax.mail.Address邮件地址的抽象类,子类提供了特定的实现
javax.mail.Authenticator用以保护邮件服务端的邮件资源的抽象类
javax.mail.Transport发送电子邮件消息的一种传输机制的抽象类
javax.mail.Store邮件消息存储和访问协议的抽象类,用以保存和查询消息,仓库会被分为多个文件夹
javax.mail.Folder代表电子邮件文件夹的抽象类。它还可以包含子文件夹
javax.mail.internet.MimeMessageMessage是抽象类,因此必须用子类来实现;在多数情况下,你将使用一个MimeMessage。MimeMessage是实现了MIME类型和头的电子邮件消息。
javax.mail.internet.InternetAddress该类代表了一个使用了RFC822语法规范的网络电子邮件地址。典型地址的语法为user@host.domain,个人签名为<user@host.domain>

    接下来逐个类进行说明:

Session类

    Session类是JavaMail API的主要类,并且再没有子类(使用final修饰)。Session对象在JavaMail API中主要扮演着连接工厂的角色,它持有配置设置和身份认证。

    Session对象可以通过下面的方式来创建:

  1. 通过查找JNDI服务中管理对象
    InitialContext ctx = new InitialContext();
    Session session = (Session) ctx.lookup("usersMailSession");

    usersMailSession是用于表示Session管理对象的JNDI名称,usersMailSession可以通过name/value这样的键值对参数来创建和配置,包括比如邮件服务主机(mail server host),发送邮件的账号(account sending the mail),和Session对象支持的协议(protocols)。

  2. 创建Session对象的另外一种方式是基于编程途径,可以在java.util.Properties对象中保存配置参数,如邮件服务名称、用户名密码和其他参数,这些信息可以在你整个程序中共享。

    Session类的构建方法是私有的,因此它提供了两个方法可以得到Session对象:

  1. getDefualtInstance()
    public static Session getDefaultInstance(Properties props)
    public static Session getDefaultInstance(Properties props,Authenticator auth)
  2. getInstance()
public static Session getInstance(Properties props)
public static Session getInstance(Properties props,Authenticator auth)

    

Message类

    得到Session对象之后,接下来创建一个Message对象来发送邮件。就是将要讲到的javax.mail.Message

  1. Message是个抽象类,因此多数情况下使用的是它的子类javax.mail.internet.MimeMessage
    MimeMessage message=new MimeMessage(session);
  2. 通过session对象来创建一个MimeMessage对象
  3. 一旦message对象创建了,就需要往该对象中填充一些信息。Meesage类实现了javax.mail.Part接口,而MimeMessage类实现了javax.mail.internet.MimePart接口。可以通过message.setContent或mimeMessage.setText来存储邮件内容。
  4. 经常使用的方法有:
方法描述
public void setFrom(Address address)用于设置发送者的邮件地址
public void addRecipients(Message.RecipientType type,String address)用户添加接收人的地址(通过type来指示是收件是还是抄送人)
public void setSubject(String subject)设置邮件标题
public void setText(String textmessage)用于设置文本内容,内容类型为text/plain的MIME类型


Address类

    创建了Session和Message对象后,需要通过Address类来设置信件的地址信息

  1. Address是个抽象类,因此多数用它的实现类javax.mial.internet.InternetAddress类。
  2. Address可以直接通过一个邮箱地址来创建,如:
    Address address = new InternetAddress("manisha@gmail.com");
  3. 另外可以通过邮箱地址和邮寄人姓名来创建,如:
    Address address = new InternetAddress("manisha@gmail.com", Manisha); 
  4. 还可以通过以下方式设计To(收信人)、From(发信人)、CC(抄送)、BBC(私密抄送)字段:
message.setFrom(address)
message.addRecipient(type, address)

    三种预定义的地址类型可以通过下面的方式获得:

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


Authenticator类

    Authenticator类代表一个知道如何获得网络连接认证的对象。通常该类会通过包装用户信息来实现:

  1.     Authenticator是一个抽象类,可以通过创建它的子类PasswordAuthentication,传递用户名和密码来创建。
  2. 必须为创建的Session对象注册这个Authenticator对象。

示例:

Properties props = new Properties();
//Override props with any customized data
PasswordAuthentication auth = new PasswordAuthentication("manisha", "pswrd")
Session session = Session.getDefaultInstance(props, auth);


Transport类

    Transport类被用作一个邮件传输机制。该类通常使用SMTP协议发送邮件消息。

  1. 它是一个抽象类
  2. 可以用默认版本的静态方法send发送:
    Transport.send(message);
  3. 另外的方式是通过会话使用的协议、用户名及密码得到一个特定的对象,发送消息并关闭连接。
    message.saveChanges(); // implicit with send()
    //Get transport for session
    Transport transport = session.getTransport("smtp");
    //Connect
    transport.connect(host, username, password);
    //repeat if necessary
    transport.sendMessage(message, message.getAllRecipients());
    //Done, close the connection
    transport.close();


Store类

    一个抽象类,代表了消息仓库和它的访问协议,用来存储和查询消息。其子类提供具体的实现。Store类扩展自Service类,而Service类提供了很多公用的方法,如命名仓库,连接到仓库和监听连接事件。

    客户端获得到消息仓库的访问,是通过获取实现了数据访问协议的Store对象来实现的。多数消息仓库的访问之前,都需要通过用户认证,下面的连接方式是通过执行认证的:

Store store = session.getStore("pop3");
store.connect(host, username, password);


Folder类

    Folder是个抽象类,代表邮件消息的一个文件夹。子类实现了特定的Folders。文件夹还可以包含子文件夹,因此提供了层级的结构。

    连接到仓库以后,你可以得到一个文件夹,在读取其中的消息前必须先打开它:

Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

    可以通过下图来认识仓库(Store)和文件夹(Folder)的关系。

JavaMail API Store and Folder Relation

    正如所见,对每个用户账号,服务端都保存了一个用户信息的库。而该库又被切分为文件夹(Folder),如最常用的“InBox”(收件箱)。文件夹中还可以包含子文件夹和消息。


还没有评论!
54.198.151.108