JavaMail API - 文件夹管理

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

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

public abstract class Folder extends Object

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

打开文件夹

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

  • 会话

  • 商店

  • 或其他文件夹

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

public abstract Folder getFolder(String name) throws MessagingException

有助于获取 Folder 对象的一些方法如下:

方法描述
boolean exists()检查文件夹是否真的存在存在。在获取 Folder 对象之前使用此方法。
abstract void open(int mode)当您获取 Folder 时,它是关闭的。使用此方法打开它。mode 可以是 Folder.READ_ONLY 或 Folder.READ_WRITE。
abstract boolean isOpen()如果文件夹打开,则此方法返回 true,如果文件夹关闭,则返回 false
abstract void close(boolean expunge)关闭文件夹。如果 expunge 参数为 true,则文件夹中所有已删除的邮件都将从服务器上的实际文件中删除。否则,它们只是被标记为已删除,但消息仍然可以恢复。

基本文件夹信息

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

方法描述
abstract String getName()返回文件夹的名称,例如"TutorialsPoint Mail"
abstract String getFullName()从根目录返回完整的层次名称,例如"books/Manisha/TutorialsPoint Mail"。
URLName getURLName()返回表示此文件夹的 URLName。
abstract Folder getParent()返回包含此文件夹的文件夹的名称,即父文件夹。例如,上一个"TutorialsPoint Mail"示例中的"Manisha"。
abstract int getType()返回一个 int,指示文件夹是否可以包含消息和/或其他文件夹。
int getMode() 返回两个命名常量之一 Folder.READ_ONLY 或 Folder.READ_WRITE,如果模式未知,则返回 -1。
Store getStore()返回从中检索此文件夹的 Store 对象。
abstract char getSeparator()返回将此 Folder 的路径名与直接子文件夹名称分隔开的分隔符。

管理文件夹

以下是一些有助于管理文件夹的方法:

方法描述
abstract boolean create(int type)这将在此文件夹的存储中创建一个新文件夹。其中 type 为:Folder.HOLDS_MESSAGES 或 Folder.HOLDS_FOLDERS。如果文件夹创建成功,则返回 true,否则返回 false
abstract boolean delete(boolean recurse)仅当文件夹关闭时,才会删除文件夹。否则,它会抛出 IllegalStateException。如果 recursetrue,则删除子文件夹。
abstract boolean renameTo(Folder f)这会更改此文件夹的名称。必须关闭文件夹才能重命名。否则,将抛出 IllegalStateException。

管理文件夹中的消息

以下是一些有助于管理文件夹中消息的方法:

方法描述
abstract void appendMessages(Message[] messages)顾名思义,数组中的消息放在此文件夹的末尾。
void copyMessages(Message[] messages, Folder destination)这会将消息从此文件夹复制到指定的文件夹中,该文件夹以参数。
abstract Message[] expunge()要从文件夹中删除消息,请将其 Flags.Flag.DELETED 标志设置为 true。要从文件夹中物理删除已删除的邮件,您必须调用此方法。

列出文件夹的内容

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

方法说明
Folder[] list()这将返回一个数组,列出此文件夹包含的文件夹。
Folder[] listSubscribed()这将返回一个数组,列出此文件夹包含的所有订阅文件夹。
摘要Folder[] list(String pattern)该方法类似于 list() 方法,不同之处在于它允许您指定一个 模式。该模式是一个字符串,给出匹配文件夹的名称。
Folder[] listSubscribed(String pattern)该方法类似于 listSubscribed() 方法,不同之处在于它允许您指定一个模式。模式是一个字符串,给出匹配文件夹的名称。

检查邮件

方法描述
abstract int getMessageCount()可以在打开或关闭的文件夹上调用此方法。但是,如果文件夹已关闭,此方法可能会(也可能不会)返回 -1,以表明无法轻松获得确切的消息数量。
abstract boolean hasNewMessages()如果自上次打开文件夹以来,有新消息添加到文件夹中,则此方法返回 true
int getNewMessageCount()通过检查已设置 RECENT 标志的文件夹中的消息来返回新消息计数。
int getUnreadMessageCount()可以在打开或关闭的文件夹中调用此方法。但是,如果文件夹已关闭,则此方法可能会返回 -1,以表明获取真实答案的成本太高。

从文件夹获取消息

Folder 类提供了四种从打开的文件夹检索消息的方法:

方法说明
abstract Message getMessage(int messageNumber) 这将返回文件夹中的第 n 条消息。文件夹中的第一条消息是编号 1。
Message[] getMessages()这将返回一个 Message 对象数组,该数组表示此文件夹中的所有消息。
Message[] getMessages(int start, int end)这将返回文件夹中的 Message 对象数组,以 start 开始,以 end 结束(含)。
Message[] getMessages(int[] messageNumbers)这将返回一个数组,该数组仅包含 messageNumbers 数组中通过数字明确标识的那些消息。
void fetch(Message[] messages, FetchProfile fp)预取给定消息的 FetchProfile 中指定的项目。 FetchProfile 参数指定要预取邮件中的哪些标头。

搜索文件夹

如果服务器支持搜索(许多 IMAP 服务器支持搜索,而大多数 POP 服务器不支持),则可以轻松地在文件夹中搜索符合特定条件的邮件。这些条件编码在 SearchTerm 对象中。以下是两种搜索方法:

方法描述
Message[] search(SearchTerm term)在此文件夹中搜索符合指定搜索条件的邮件。返回包含匹配邮件的数组。如果未找到匹配项,则返回一个空数组。
Message[] search(SearchTerm term, Message[] messages)在给定的消息数组中搜索符合指定搜索条件的消息。返回包含匹配消息的数组。如果未找到匹配项,则返回一个空数组。指定的消息对象必须属于此文件夹。

标志

当您需要更改文件夹中整个消息集的标志时,标志修改非常有用。以下是 Folder 类中提供的方法:

方法说明
void setFlags(Message[] messages, Flags flag, boolean value)在数组中指定的消息上设置指定的标志。
void setFlags(int start, int end, Flags flag, boolean value)在从 start 到 end 编号的消息上设置指定的标志,包括 start 和 end。
void setFlags(int[] messageNumbers, Flags flag, boolean value)在消息编号位于数组中的消息上设置指定的标志。
abstract Flags getPermanentFlags()返回此文件夹支持的所有消息的标志。