📅  最后修改于: 2020-11-14 07:21:26             🧑  作者: Mango
JavaMail API包含一些用于发送,阅读和删除电子邮件的接口和类。尽管JavaMail API中有许多软件包,但它们将涵盖Java Mail API中经常使用的两个主要软件包: javax.mail和javax.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)方法返回命名的子文件夹。阅读邮件后,关闭“存储”和“文件夹”连接。
我们可以看到下图的存储和文件夹关系:
如我们所见,对于每个用户帐户,服务器都有一个存储,用于存储用户的消息。商店分为多个文件夹,“收件箱”文件夹是主要包含电子邮件的文件夹。文件夹可以同时包含消息和子文件夹。