JavaMail - 核心类

  • 简述

    JavaMail API 包含一些用于发送、读取和删除电子邮件消息的接口和类。尽管JavaMail API 中有很多包,但将涵盖Java Mail API 中经常使用的主要两个包:javax.mailjavax.mail.internet包。这些包包含所有 JavaMail 核心类。他们是:
    班级 描述
    javax.mail.Session API 的关键类。多线程对象表示连接工厂。
    javax.mail.Message 对电子邮件消息建模的抽象类。子类提供了实际的实现。
    javax.mail.地址 对消息中的地址(发件人和收件人地址)建模的抽象类。子类提供了具体的实现。
    javax.mail.Authenticator 用于保护邮件服务器上的邮件资源的抽象类。
    javax.mail.Transport 一个抽象类,它为发送电子邮件消息的消息传输机制建模。
    javax.mail.Store 对消息存储及其访问协议建模的抽象类,用于存储和检索消息。一个商店被分成多个文件夹。
    javax.mail.文件夹 表示邮件消息文件夹的抽象类。它可以包含子文件夹。
    javax.mail.internet。MimeMessage Message 是一个抽象类,因此必须与子类一起使用;在大多数情况下,您将使用 MimeMessage。MimeMessage 是一种了解 MIME 类型和标头的电子邮件。
    javax.mail.internet。InternetAddress 此类表示使用 RFC822 语法的 Internet 电子邮件地址。典型的地址语法格式为user@host.domainPersonal Name <user@host.domain>
    让我们详细研究这些类中的每一个,在随后的章节中,我们将研究使用这些类中的每一个的示例。
  • Session 类

    会话类是主类的JavaMail API,并且它不是子类。所述会话对象充当连接工厂了JavaMail API,它可以同时处理配置设置和认证。
    可以通过以下方式创建会话对象:
    • 通过查找存储在 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()方法获取session对象有两种方法。它返回默认会话。
      
      public static Session getDefaultInstance(Properties props)
      public static Session getDefaultInstance(Properties props,Authenticator auth)
      
    • getInstance():使用getInstance()方法获取session对象有两种方法。它返回新会话。
      
      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(地址地址) 用于设置 from 头字段。
      public void addRecipients(Message.RecipientType 类型,字符串地址) 用于将给定地址添加到收件人类型。
      public void setSubject(字符串主题) 用于设置主题标题字段。
      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 = new InternetAddress("manisha@gmail.com", Manisha); 
      
    • 您还可以设置收件人、发件人、抄送、密件抄送字段如下
      • message.setFrom(地址)
      • message.addRecipient(类型,地址)
      • 三种预定义的地址类型是具有以下值之一的对象:
        • Message.RecipientType.TO
        • Message.RecipientType.CC
        • Message.RecipientType.BCC
  • Authenticator 类

    Authenticator 类表示一个对象,该对象知道如何获得网络连接的身份验证。通常,它会通过提示用户提供信息来做到这一点。
    • Authenticator是一个抽象类。您创建一个子类PasswordAuthentication,将用户名和密码传递给其构造函数。
    • 创建会话对象时,您必须向会话注册身份验证器。
    以下是Authenticator使用的示例:
    
    Properties props = new Properties();
    //Override props with any customized data
    PasswordAuthentication auth = new PasswordAuthentication("manisha", "pswrd")
    Session session = Session.getDefaultInstance(props, auth);
    
  • Transport 类

    传输类用作消息传输机制。此类通常使用 SMTP 协议发送消息。
    • 它是一个抽象类。
    • 您可以通过调用静态send()方法来使用该类的默认版本:
      
      Transport.send(message);
      
    • 发送消息的另一种方法是从会话中为您的协议获取特定实例,传递用户名和密码(如果不需要则为空),发送消息,然后关闭连接:
      
      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类,该类提供了许多常用的方法来命名存储、连接到存储和侦听连接事件。
    客户端通过获取实现数据库访问协议的 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 关系:
    JavaMail API 存储和文件夹关系
    如我们所见,对于每个用户帐户,服务器都有一个存储用户消息的存储。该存储分为多个文件夹,“收件箱”文件夹是包含电子邮件消息的主要文件夹。文件夹可以包含邮件和子文件夹。