📜  JavaMail API-核心类

📅  最后修改于: 2020-11-14 07:21:26             🧑  作者: Mango


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

Class Description
javax.mail.Session The key class of the API. A multithreaded object represents the connection factory.
javax.mail.Message An abstract class that models an e-mail message. Subclasses provide the actual implementations.
javax.mail.Address An abstract class that models the addresses (from and to addresses) in a message. Subclasses provide the specific implementations.
javax.mail.Authenticator An abstract class used to protect mail resources on the mail server.
javax.mail.Transport An abstract class that models a message transport mechanism for sending an e-mail message.
javax.mail.Store An abstract class that models a message store and its access protocol, for storing and retrieving messages. A Store is divided into Folders.
javax.mail.Folder An abstract class that represents a folder of mail messages. It can contain subfolders.
javax.mail.internet.MimeMessage Message is an abstract class, hence must work with a subclass; in most cases, you’ll use a MimeMessage. A MimeMessage is an e-mail message that understands MIME types and headers.
javax.mail.internet.InternetAddress This class represents an Internet email address using the syntax of RFC822. Typical address syntax is of the form user@host.domain or Personal Name .

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

会话课程

Session类是JavaMail API的主要类,并且没有子类。 Session对象充当JavaMail API的连接工厂,该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()方法获取会话对象的方法。它返回默认会话。

    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)
    

讯息类别

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

  • 消息是一个抽象类。因此,主要使用其子类javax.mail.internet.MimeMessage类。

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

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

  • MimeMessage类的常用方法是

    Method Description
    public void setFrom(Address address) used to set the from header field.
    public void addRecipients(Message.RecipientType type, String addresses) used to add the given address to the recipient type.
    public void setSubject(String subject) used to set the subject header field.
    public void setText(String textmessage) used to set the text as the message content using text/plain MIME type.

地址类别

现在我们有了一个Session和Message对象(内容存储在其中),我们需要使用Address对象来寻址该字母。

  • 地址是一个抽象类。因此,主要使用其子类javax.mail.internet.InternetAddress类。

  • 地址可以由刚好路过的电子邮件地址创建:

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

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

    • message.setFrom(地址)

    • message.addRecipient(类型,地址)

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

      • Message.RecipientType.TO

      • Message.RecipientType.CC

      • Message.RecipientType.BCC

身份验证器类

Authenticator类表示知道如何获取网络连接身份验证的对象。通常,它将通过提示用户提供信息来完成此操作。

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

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

以下是Authenticator使用的示例:

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

运输等级

传输类用作消息传输机制。此类通常使用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扩展了Service类,该类提供了许多通用的方法来命名商店,连接商店以及侦听连接事件。

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

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

文件夹类别

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

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

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

Folder对象的getFolder(String name)方法返回命名的子文件夹。阅读邮件后,关闭“存储”和“文件夹”连接。

我们可以看到下图的存储和文件夹关系:

JavaMail API存储和文件夹关系

如我们所见,对于每个用户帐户,服务器都有一个存储,用于存储用户的消息。商店分为多个文件夹,“收件箱”文件夹是主要包含电子邮件的文件夹。文件夹可以同时包含消息和子文件夹。