核心类(Core Classes)
JavaMail API包含一些用于发送,读取和删除电子邮件的接口和类。 虽然JavaMail API中有许多软件包,但它们将涵盖Java Mail API中经常使用的两个主要软件包: javax.mail和javax.mail.internet软件包。 这些包包含所有JavaMail核心类。 他们是:
类 | 描述 |
---|---|
javax.mail.Session | API的关键类。 多线程对象表示连接工厂。 |
javax.mail.Message | 一个为电子邮件建模的抽象类。 子类提供实际的实现。 |
javax.mail.Address | 一个抽象类,用于对消息中的地址(来自和到地址)进行建模。 子类提供特定的实现。 |
javax.mail.Authenticator | 用于保护邮件服务器上的邮件资源的抽象类。 |
javax.mail.Transport | 一种抽象类,用于模拟用于发送电子邮件的邮件传输机制。 |
javax.mail.Store | 一种抽象类,用于为消息存储及其访问协议建模,用于存储和检索消息。 商店分为文件夹。 |
javax.mail.Folder | 表示邮件消息文件夹的抽象类。 它可以包含子文件夹。 |
javax.mail.internet。 MimeMessage | Message是一个抽象类,因此必须使用子类; 在大多数情况下,您将使用MimeMessage。 MimeMessage是一种了解MIME类型和标头的电子邮件。 |
javax.mail.internet。 InternetAddress | 此类表示使用RFC822语法的Internet电子邮件地址。 典型的地址语法格式为user@host.domain或Personal Name <user@host.domain> 。 |
让我们详细研究这些类中的每一个,在随后的章节中,我们将使用这些中的每一个来研究示例。
会话类
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)
消息类
创建Session对象后,我们现在继续创建将要发送的消息。 消息类型为javax.mail.Message 。
Message是一个抽象类。 因此,它的子类javax.mail.internet.MimeMessage类主要用于。
要创建消息,需要在MimeMessage类构造函数中传递会话对象。 例如:
MimeMessage message=new MimeMessage(session);
创建消息对象后,我们需要在其中存储信息。 Message类在javax.mail.internet中实现javax.mail.Part接口。 MimeMessage实现了javax.mail.internet.MimePart。 您可以使用message.setContent()或mimeMessage.setText()来存储内容。
MimeMessage类常用的方法有
方法 描述 public void setFrom(Address address) 用于设置from头字段。 public void addRecipients(Message.RecipientType type,String addresses) 用于将给定地址添加到收件人类型。 public void setSubject(String subject) 用于设置主题标题字段。 public void setText(String textmessage) 用于使用text/plain MIME类型将文本设置为消息内容。
地址类
既然我们有一个Session和Message(内容存储在其中)对象,我们需要使用Address对象来处理这个字母。
Address是一个抽象类。 因此,主要使用其子类javax.mail.internet.InternetAddress类。
只需传递电子邮件地址即可创建地址:
Address address = new InternetAddress("manisha@gmail.com");
创建地址的另一种方法是通过名称alogwith电子邮件地址:
Address address = new InternetAddress("manisha@gmail.com", Manisha);
您还可以设置To,From,CC,BCC字段,如下所示
message.setFrom(address)
message.addRecipient(type, address)
三种预定义的地址类型是具有以下值之一的对象:
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
认证类
Authenticator类表示一个知道如何获取网络连接身份验证的对象。 通常,它会通过提示用户提供信息来完成此操作。
Authenticator是一个抽象类。 您创建一个子类PasswordAuthentication ,将用户名和密码传递给其构造函数。
创建会话对象时,必须向Session注册Authenticator。
以下是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扩展了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)方法返回指定的子文件夹。 阅读邮件完成后,关闭存储和文件夹连接。
我们可以在下面的图片中看到商店和文件夹的关系:
我们可以看到,对于每个用户帐户,服务器都有一个存储用户消息的存储。 商店分为多个文件夹,“收件箱”文件夹是包含电子邮件的主要文件夹。 文件夹可以包含邮件和子文件夹。