作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html
四、初次认识JavaMail API
1.了解我们的JavaMail环境
A.纵览JavaMail核心类结构
打开JavaMail.jar文件,我们将发现在javax.mail的包下面存在着一些核心类:Session、Message、Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中还有一些常用的子类。
B.Session
Session类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。
Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象:
Properties props = new Properties();// fill props with any informationSession session = Session.getDefaultInstance(props, null);
或者使用getInstance()这个静态工厂方法获得自定义的Session:
Properties props = new Properties();// fill props with any informationSession session = Session.getInstance(props, null);
从上面的两个例子中不难发现,getDefaultInstance()和getInstance()方法的第二个参数都是null,这是因为在上面的例子中并没有使用到邮件授权,下文中将对授权进行详细介绍。
从很多的实例看,在对mail server进行访问的过程中使用共享的Session是足够的,即使是工作在多个用户邮箱的模式下也不例外。
C.Message
当我们建立了Session对象后,便可以被发送的构造信息体了。在这里SUN提供了Message类型来帮助开发者完成这项工作。由于Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。
为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入:
MimeMessage message = new MimeMessage(session);
注意:对于MimeMessage类来讲存在着多种构造方法,比如使用输入流作为参数的构造方法。
在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。最基本的设置信息内容的方法就是通过表示信息内容和米么类型的参数调用setContent()方法:
message.setContent("Hello", "text/plain");
然而,如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容。
message.setText("Hello");
前面所讲的两种方法,对于文本信息,后者更为合适。而对于其它的一些信息类型,比如HTML信息,则要使用前者。
别忘记了,使用setSubject()方法对邮件设置邮件主题:
message.setSubject("First");
D.Address
到这里,我们已经建立了Session和Message,下面将介绍如何使用邮件地址类:Address。像Message一样,Address类也是一个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。
通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类:
Address address = new InternetAddress("president@whitehouse.gov");
如果要在邮件地址后面增加名字的话,可以通过传递两个参数:代表邮件地址和名字的字符串来建立一个具有邮件地址和名字的邮件地址类:
Address address = new InternetAddress("president@whitehouse.gov", "George Bush");
本文在这里所讲的邮件地址类是为了设置邮件信息的发信人和收信人而准备的,在建立了邮件地址类后,我们通过message的setFrom()和setReplyTo()两种方法设置邮件的发信人:
message.setFrom(address);message.setReplyTo(address);
若在邮件中存在多个发信人地址,我们可用addForm()方法增加发信人:
Address address[] = ...;message.addFrom(address);
为了设置收信人,我们使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量来区分收信人的类型:
message.addRecipient(type, address)
下面是Message.RecipientType的三个常量:
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
因此,如果我们要发送邮件给总统,并发用一个副本给第一夫人的话,下面的方法将被用到:
Address toAddress = new InternetAddress("vice.president@whitehouse.gov");Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");message.addRecipient(Message.RecipientType.TO, toAddress);message.addRecipient(Message.RecipientType.CC, ccAddress);
JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能:验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器上的MX记录验证等。
E.Authenticator
像java.net类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。在javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。
在使用Authenticator这个抽象类时,我们必须采用继承该抽象类的方式,并且该继承类必须具有返回PasswordAuthentication对象(用于存储认证时要用到的用户名、密码)getPasswordAuthentication()方法。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。
下面代码片断中的MyAuthenticator就是一个Authenticator的子类。
Properties props = new Properties();// fill props with any informationAuthenticator auth = new MyAuthenticator();Session session = Session.getDefaultInstance(props, auth);
F.Transport
在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息:
Transport.send(message);
当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:
message.saveChanges(); // implicit with send()Transport transport = session.getTransport("smtp");transport.connect(host, username, password);transport.sendMessage(message, message.getAllRecipients());transport.close();
评论:上面的方法是一个很好的方法,尤其是在我们在同一个邮件服务器上发送多个邮件时。因为这时我们将在连接邮件服务器后连续发送邮件,然后再关闭掉连接。send()这个基本的方法是在每次调用时进行与邮件服务器的连接的,对于在同一个邮件服务器上发送多个邮件来讲可谓低效的方式。
注意:如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志:
session.setDebug(true)。
G.Store和Folder
接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。
// Store store = session.getStore("imap");Store store = session.getStore("pop3");store.connect(host, username, password);
在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:
Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);Message message[] = folder.getMessages();
上面的例子首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读(Folder.READ_ONLY)的方式打开Folder,最后调用Folder的getMessages()方法得到目录中所有Message的数组。
注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder(想想前面讲的IMAP协议)。而且SUN在设计Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件服务器读取邮件内容。
在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。
System.out.println(((MimeMessage)message).getContent());
在读取邮件内容后,别忘记了关闭Folder和Store。
folder.close(aBoolean);store.close();
传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。
H.继续向前进!
在讲解了以上的七个Java Mail核心类定义和理解了简单的代码片断后,下文将详细讲解怎样使用这些类实现JavaMail API所要完成的高级功能。
分享到:
相关推荐
1. **mail.jar**:这是一个核心的 JavaMail JAR 文件,包含了 JavaMail API 的所有类和接口,如 `javax.mail` 和 `javax.mail.internet` 包。这些类提供了创建、发送、读取邮件以及处理附件等功能。例如,`Message` ...
首先,我们需要了解JavaMail的核心类`MimeMessage`,它是邮件消息的容器,可以存储邮件的所有信息,包括发件人、收件人、主题、正文以及附件等。在示例中,创建了一个名为`ReciveOneMail`的类,它包含一个`...
1. **Message类**:这是JavaMail中的核心类,代表一封电子邮件。它封装了邮件的所有内容,包括主题、正文、附件等。你可以通过`javax.mail.internet.MimeMessage`来创建和设置邮件的各种属性。 2. **Session类**:...
JavaMail 是一个强大的开源库...通过理解和应用上述知识点,你可以构建一个高效、稳定的JavaMail工具类,实现邮件的发送、接收和管理功能。同时,结合`MailConfig.properties`进行配置管理,可以使代码更加灵活和安全。
它定义了邮件服务提供商必须实现的一系列规范,比如`Session`、`Message`、`Store`和`Transport`等核心类。开发者通过这些接口与邮件服务器进行交互,例如创建邮件会话、发送邮件、连接邮箱、读取邮件等。 3. **...
JavaMail通过 javax.mail 包中的接口和类提供了邮件处理的能力。以下是一些核心概念和使用方法: 1. **Session对象**:这是JavaMail的起点,它包含了邮件会话的配置信息,如SMTP服务器地址、端口、认证信息等。 2. ...
7. **javax.mail.jar**: 这是JavaMail的核心库,包含了所有与邮件处理相关的类和接口。 8. **mailapi-1.5.5.jar**: 该JAR文件可能包含JavaMail API的特定实现或扩展,供开发者在自己的应用中使用。 9. **imap-...
然后,JavaMail是Java平台上的一个开放源代码库,提供了丰富的API,用于处理电子邮件的发送和接收。JavaMail使得开发者能够轻松地在Java应用程序中集成邮件功能,如发送HTML邮件、处理附件、使用SMTP、POP3和IMAP...
JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。...理解JavaMail API的使用方法和在Struts2中的集成策略,有助于你构建更高效、更灵活的应用系统。
压缩包中的jar包是JavaMail API的核心组件,包括`javax.mail.jar`和`javax.mail-api.jar`,它们包含了JavaMail API的类定义。此外,可能还有`activation.jar`或`javax.activation.jar`,这是JavaBeans Activation ...
这个“javamail资料.zip”压缩包很可能包含了关于 JavaMail 的详细教程、示例代码、API 文档和其他相关资源,帮助开发者学习和理解如何在 Java 应用程序中集成邮件功能。 JavaMail 的核心组件包括 javax.mail 和 ...
JAF的核心类包括`DataContentHandler`和`DataSource`,它们分别处理数据的转换和提供数据源。当JavaMail处理MIME邮件时,会利用JAF来解析不同类型的邮件内容,如文本、图像、音频或应用程序数据。 3. **javamail-1...
JavaMail API 是一套用于处理电子邮件的Java库,它允许开发者编写能够读取、撰写和发送电子邮箱的应用程序,类似于...然而,为了充分利用其功能,开发者需要对邮件协议有一定的理解,并根据实际需求调整和扩展代码。
这个“javamail实例大全2”可能包含了各种示例代码,帮助开发者更好地理解和使用JavaMail API。以下是一些核心的JavaMail知识点,以及如何使用它们: 1. **JavaMail API**: JavaMail API 提供了发送和接收邮件的...
JavaMail本身只定义了接口和规范,具体的实现则由Provider来完成,如JavaMail自带的邮件服务提供商,或第三方提供的扩展Provider。 #### 三、JavaMail使用示例 为了更好地理解JavaMail的实际应用,我们将通过一个...
1. **Session对象**:这是JavaMail的核心,用于管理邮件会话,包括认证信息、属性和默认的邮件服务商信息。创建Session时,可以设置SMTP服务器的属性,如`mail.smtp.host`、`mail.smtp.port`等。 2. **Message对象*...
2. **`javax.mail`**:定义了 JavaMail API 的核心接口和类。 3. **`javax.mail.event`**:定义了事件模型。 4. **`javax.mail.internet`**:定义了与 Internet 邮件相关的类和接口。 5. **`javax.mail.search`**:...
这个jar包包含了JavaMail的核心库,其中包括`javax.mail`和`javax.mail.internet`等关键包。开发者可以通过导入这个库,调用其提供的类和方法来实现邮件的发送和接收。例如,`Session`类用于设置邮件服务器的配置,...
1. **Mailet API**: JavaMail的核心类,用于创建和配置邮件。 2. **Session**: 邮件会话对象,用于设置邮件服务器连接参数,如SMTP服务器地址、端口、用户名和密码。 3. **Message**: 表示一个邮件消息,用于设置发...