JavaMail API - 文件夹管理



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

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

public abstract class Folder extends Object

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

打开文件夹

我们不能直接创建文件夹,因为Folder类中唯一的构造函数是protected。我们可以从以下对象获取Folder

  • 会话 (Session)

  • 存储 (Store)

  • 或其他文件夹

所有上述类都具有签名类似的 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 getMode()它返回两个命名常量之一:Folder.READ_ONLY 或 Folder.READ_WRITE,或者在模式未知时返回 -1。
Store getStore()返回从中检索此文件夹的 Store 对象。
abstract char getSeparator()返回分隔符字符,该字符将此 Folder 的路径名与直接子文件夹的名称分隔开。

管理文件夹

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

方法描述
abstract boolean create(int type)这将在此文件夹的 Store 中创建一个新文件夹。其中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()这将返回一个数组,其中列出了此文件夹包含的所有已订阅的文件夹。
abstract 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)这将返回文件夹中从 start 开始到 end 结束(包含 start 和 end)的Message对象数组。
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)搜索给定的邮件数组中与指定搜索条件匹配的邮件。返回一个包含匹配邮件的数组。如果未找到匹配项,则返回一个空数组。指定的 Message 对象必须属于此文件夹。

标志

当您需要更改文件夹中整套邮件的标志时,标志修改非常有用。以下是 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()返回此文件夹支持的所有邮件的标志。
广告