JavaMail API - 核心类

JavaMail API 包含一些用于发送、阅读和删除电子邮件的接口和类。尽管 JavaMail API 中有许多包,但本文将介绍 Java Mail API 中经常使用的两个主要包:javax.mailjavax.mail.internet 包。这些包包含所有 JavaMail 核心类。它们是:

描述
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 语法的 Internet 电子邮件地址。典型的地址语法形式为 user@host.domain个人名称 <user@host.domain>

让我们详细研究这些类中的每一个,在后续章节中,我们将研究使用每个类的示例。

Session 类

Session 类是 JavaMail API 的主要类,它没有子类。Session 对象充当 JavaMail API 的连接工厂,它处理配置设置和身份验证。

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

  • 通过查找存储在 JNDI 服务中的管理对象

    InitialContext ctx = new InitialContext();
    Session session = (Session) ctx.lookup("usersMailSession");
    

    usersMailSession 是用作 Session 对象的管理对象的 JNDI 名称对象。可以使用所需参数作为名称/值对来创建和配置 usersMailSession,包括邮件服务器主机名、发送邮件的用户帐户以及 Session 对象支持的协议等信息。

  • 创建 Session 对象的另一种方法是基于编程方法,您可以使用 java.util.Properties 对象覆盖一些默认信息,例如邮件服务器名称、用户名、密码和其他可在整个应用程序中共享的信息。

Session 类的构造函数是 private。因此,Session 类提供了两种方法(如下所列)来获取 Session 对象。

  • getDefaultInstance():有两种方法可以使用 getDefaultInstance() 方法获取会话对象。它返回默认会话。

    public static Session getDefaultInstance(Properties props)
    public static Session getDefaultInstance(Properties props,Authenticator auth)
    
  • getInstance():有两种方法可以使用 getInstance() 方法获取会话对象。它返回新会话。

    public static Session getInstance(Properties props)
    public static Session getInstance(Properties props,Authenticator auth)
    

Message 类

创建 Session 对象后,我们现在开始创建要发送的消息。消息类型为 javax.mail.Message

  • Message 是一个抽象类。因此,其子类 javax.mail.internet.MimeMessage 类被广泛使用。

  • 要创建消息,您需要在 MimeMessage 类构造函数中传递会话对象。例如:

    MimeMessage message=new MimeMessage(session);
    
  • 一旦创建了消息对象,我们就需要在其中存储信息。Message 类实现 javax.mail.Part 接口,而 javax.mail.internet. MimeMessage 实现 javax.mail.internet.MimePart。您可以使用 message.setContent() 或 mimeMessage.setText() 来存储内容。

  • MimeMessage 类的常用方法有

    方法说明
    public void setFrom(Address address)用于设置发件人标头字段。
    public void addRecipients(Message.RecipientType type, String address)用于将给定的地址添加到收件人类型。
    public void setSubject(String subject)用于设置主题标头字段。
    public void setText(String textmessage) 用于使用 text/plain MIME 将文本设置为消息内容类型。

Address 类

现在我们有了 Session 和 Message(其中存储了内容)对象,我们需要使用 Address 对象来为信件指定地址。

  • Address 是一个抽象类。因此,其子类 javax.mail.internet.InternetAddress 类最常使用。

  • Address 可以通过传递电子邮件地址来创建:

    Address address = new InternetAddress("manisha@gmail.com");
    
  • 创建 Address 的另一种方法是传递名称和电子邮件地址:

    Address address = new InternetAddress("manisha@gmail.com", Manisha); 
    
  • 您还可以设置收件人、发件人、抄送、密件抄送字段,如下所示

    • message.setFrom(address)

    • message.addRecipient(type, address)

    • 三种预定义地址类型是具有以下值之一的对象:

      • Message.RecipientType.TO

      • Message.RecipientType.CC

      • Message.RecipientType.BCC

Authenticator 类

Authenticator 类表示知道如何获取网络连接身份验证的对象。通常,它会通过提示用户输入信息来实现这一点。

  • Authenticator 是一个抽象类。您可以创建一个子类 PasswordAuthentication,并将用户名和密码传递给其构造函数。

  • 创建会话对象时,您必须向 Session 注册 Authenticator。

以下是 Authenticator 使用的示例:

Properties props = new Properties();
//使用任何自定义数据覆盖 props
PasswordAuthentication auth = new PasswordAuthentication("manisha", "pswrd")
Session session = Session.getDefaultInstance(props, auth);

Transport 类

Transport 类用作消息传输机制。此类通常使用 SMTP 协议发送消息。

  • 它是一个抽象类。

  • 只需调用静态 send() 方法即可使用该类的默认版本:

    Transport.send(message);
    
  • 发送消息的另一种方法是从会话中获取协议的特定实例,传递用户名和密码(如不需要则留空),发送消息并关闭连接:

    message.saveChanges(); // 隐式使用 send()
    //获取会话的传输
    Transport transport = session.getTransport("smtp");
    //连接
    transport.connect(host, username, password);
    //必要时重复
    transport.sendMessage(message, message.getAllRecipients());
    //完成,关闭连接
    transport.close();
    

Store 类

一个抽象类,用于模拟消息存储及其访问协议,用于存储和检索消息。子类提供实际实现。 Store 扩展了 Service 类,该类提供了许多常用方法来命名存储、连接存储和监听连接事件。

客户端通过获取实现数据库访问协议的 Store 对象来访问消息存储。大多数消息存储都要求用户在允许访问之前进行身份验证。connect 方法执行该身份验证。

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

Folder 类

Folder 是一个抽象类,表示邮件消息的文件夹。子类实现特定于协议的文件夹。文件夹可以包含子文件夹以及消息,从而提供层次结构。

连接到商店后,您可以获得一个文件夹,必须先打开该文件夹,然后才能从中读取消息。

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

Folder 对象的 getFolder(String name) 方法返回指定的子文件夹。读取邮件完成后,关闭 Store 和 Folder 连接。

我们可以在下图中看到 Store 和 Folder 的关系:

JavaMail API Store and Folder Relation

我们可以看到,对于每个用户帐户,服务器都有一个用于存储用户消息的存储库。存储库分为多个文件夹,"收件箱"文件夹是包含电子邮件消息的主要文件夹。文件夹可以同时包含消息和子文件夹。