Javamail Api 简明教程

JavaMail API - Folder Management

到目前为止,我们在我们之前的章节中主要使用收件箱文件夹。这是大多数邮件所驻留的默认文件夹。某些系统可能会将其称为 INBOX,而另一些系统可能会将其称为其他名称。但是,您可以始终使用名称 INBOX 从 JavaMail API 访问它。

JavaMail API 将文件夹表示为抽象 Folder 类的实例:

public abstract class Folder extends Object

此类声明了用于从服务器请求命名文件夹、从文件夹中删除邮件、在文件夹中搜索特定邮件、列出文件夹中的邮件等的方法。

Opening a Folder

我们无法直接创建文件夹,因为 Folder 类中的唯一构造函数受到保护。我们可以从以下位置获取文件夹:

  1. a Session

  2. a Store

  3. or another Folder

以上所有类都具有具有相似签名的相似 getFolder() 方法:

public abstract Folder getFolder(String name) throws MessagingException

某些有助于获取 Folder 对象的方法包括:

Method

Description

boolean exists()

检查文件夹是否实际存在。在获取 Folder 对象之前使用此方法。

abstract void open(int mode)

当您获取 Folder 时,它已关闭。使用此方法将其打开。 mode 可以是 Folder.READ_ONLY 或 Folder.READ_WRITE。

abstract boolean isOpen()

如果文件夹已关闭,此方法将返回 false,如果已打开,将返回 true。

abstract void close(boolean expunge)

关闭文件夹。如果 expunge 参数为 true,则文件夹中任何已删除的邮件都会从服务器上的实际文件中删除。否则,它们将被标记为已删除,但邮件仍可以取消删除。

Basic Folder Info

下面是一些 Folder 类中的方法,它们返回有关文件夹的基本信息:

Method

Description

abstract String getName()

返回文件夹的名称,如 “教程点邮件”

abstract String getFullName()

从根目录返回完整的层次结构名称,如“书籍/Manisha/教程点邮件”。

URLName getURLName()

返回表示此文件夹的 URLName。

abstract Folder getParent()

返回包含此文件夹(即父文件夹)的文件夹的名称。例如,从先前的“教程点邮件”示例中的“Manisha”。

abstract int getType()

返回一个 int,表示文件夹是否可以包含邮件和/或其他文件夹。

int getMode()

它会返回两个已命名的常量之一 Folder.READ_ONLY 或 Folder.READ_WRITE,或在未知模式的情况下返回 -1。

Store getStore()

从该文件夹被检索出的商店对象。

abstract char getSeparator()

返回将该 Folder 的路径名与直接子文件夹的名称分隔的定界符字符。

Managing Folder

以下是一些用于管理 Folder 的方法:

Method

Description

abstract boolean create(int type)

在该文件夹的 Store 中创建一个新的文件夹。其中类型可能是:Folder.HOLDS_MESSAGES 或 Folder.HOLDS_FOLDERS。如果文件夹已成功创建,则返回 true;否则,返回 false。

abstract boolean delete(boolean recurse)

仅当文件夹已关闭时,才删除该文件夹。否则会抛出 IllegalStateException。如果 recurse 为 true,那么将删除子文件夹。

abstract boolean renameTo(Folder f)

此方法将更改该文件夹的名称。文件夹必须关闭才能重命名。否则将抛出 IllegalStateException。

Managing Messages in Folders

以下是一些用于管理 Folder 中邮件的方法:

Method

Description

abstract void appendMessages(Message[] messages)

顾名思义,该数组中的邮件被放置在该文件夹的末尾。

void copyMessages(Message[] messages, Folder destination)

此方法将邮件从该文件夹复制到作为参数指定的文件夹中。

abstract Message[] expunge()

若要从文件夹中删除邮件,请将其 Flags.Flag.DELETED 标志设置为 true。若要从文件夹中物理删除已删除邮件,你必须调用此方法。

Listing the Contents of a Folder

有四种方法可以列出文件夹包含的子文件夹:

Method

Description

Folder[] list()

此方法返回一个数组,列出该文件夹包含的所有文件夹。

Folder[] listSubscribed()

此方法返回一个数组,列出该文件夹包含的所有已订阅的文件夹。

abstract Folder[] list(String pattern)

此方法与 list() 方法类似,但允许你指定一个模式。该模式是一个字符串,给出匹配的文件夹的名称。

Folder[] listSubscribed(String pattern)

此方法与 listSubscribed() 方法类似,但允许你指定一个模式。该模式是一个字符串,给出匹配的文件夹的名称。

Checking for Mail

Method

Description

abstract int getMessageCount()

此方法可用于打开或关闭文件夹。但是,对于关闭的文件夹,此方法可能会(或可能不会)返回 -1 以指示确切的邮件数不可用。

abstract boolean hasNewMessages()

如果在上次打开后新邮件已添加到文件夹,此方法返回 true。

int getNewMessageCount()

通过检查 RECENT 标志已设置的文件夹中的邮件,返回新的邮件数量。

int getUnreadMessageCount()

这可以针对打开的或未打开的文件夹进行调用。但是,如果是不打开的文件夹,它可能返回-1,表明获取真实答案的成本太高。

Getting Messages from Folders

文件夹类提供了四种方法来从打开的文件夹中检索邮件:

Method

Description

abstract Message getMessage(int messageNumber)

这将返回文件夹中的第 n 封邮件。文件夹中的第一封邮件为序号 1。

Message[] getMessages()

这将返回表示此文件夹中所有邮件的邮件对象数组。

Message[] getMessages(int start, int end)

这将返回文件夹中从 start 开始至 end 结束(包括 start 和 end)的邮件对象数组。

Message[] getMessages(int[] messageNumbers)

这将返回仅包含由 messageNumbers 数组中的编号特别识别出的邮件的数组。

void fetch(Message[] messages, FetchProfile fp)

为给定的邮件预取 FetchProfile 中指定的项。FetchProfile 参数指定预取邮件中应包含哪些标头。

Searching Folders

如果服务器支持搜索(很多 IMAP 服务器支持,但大多数 POP 服务器不支持),则很容易搜索某个文件夹以查找满足某些条件的邮件。条件通过 SearchTerm 对象进行编码。以下是两种搜索方法:

Method

Description

Message[] search(SearchTerm term)

在此文件夹中搜索与特定搜索条件匹配的消息。返回一个包含匹配消息的数组。如果没有找到匹配的消息,则返回一个空数组。

Message[] search(SearchTerm term, Message[] messages)

搜索给定的消息数组,找到与特定搜索条件匹配的消息。返回一个包含匹配消息的数组。如果没有找到匹配的消息,则返回一个空数组。指定的 Message 对象必须属于这个文件夹。

Flags

当您需要更改一个 Folder 中的所有消息的标志时,标志修改将很有用。以下是 Folder 类中提供的方法:

Method

Description

void setFlags(Message[] messages, Flags flag, boolean value)

设置数组中指定的消息上的指定标志。

void setFlags(int start, int end, Flags flag, boolean value)

将从 start 到 end 中标为数字的消息上的指定标志进行设置,并且 start 和 end 都包含在内。<br>

void setFlags(int[] messageNumbers, Flags flag, boolean value)

设置消息编号位于数组中的邮件上的指定标志。

abstract Flags getPermanentFlags()

返回此文件夹支持的所有邮件的标志。