JavaMail详解(九)——文件夹管理 - 高飞网
88 人阅读

JavaMail详解(九)——文件夹管理

2016-11-24 14:53:50

    到现在为止,前面我们接触的都是INBOX这个文件夹。这是大多数邮件的存在的默认目录。有些系统可能称之为INBOX,而有些可能有其他的名字。但是,通过JavaMail API,你总是可以用INBOX来访问收件箱。

    JavaMail API代表文件夹的类是抽象类Folder:

public abstract class Folder

    该类中声明了一些方法,用以向服务端请求指定名称的文件夹,删除文件夹中的邮件,搜索文件夹中特定的邮件,列出文件夹中的邮件等等。

打开文件夹

    我们不能直接创建Folder类的对象,因为他的构造方法是protected修饰的。然而我们可以这样获得:

  1. 在Session中
  2. 在Store中
  3. 在另外一个Folder中

上面的类中都有一个简单的方法:

public abstract Folder getFolder(String name)
				throws MessagingException;

Folder对象中提供了如下一些方法:

方法描述
abstract boolean exists()
在获取Folder对象之前先使用该方法判断是否存在
abstract void open(int mode)
当你得到一个'Folder时,它是关着的。就可以用该方法打开的,打开的模式有只读和读写两种:READ_ONLY、 Folder.READ_WRITE.
abstract boolean isOpen()
如果文件夹是开着的则返回true,否则返回false
abstract void close(boolean expunge)
关闭文件夹,如果expunge设置为true,任何一个标识为DELETE标识的邮件都会在服务端被真实的删除;否则,这些邮件只会简单地标记为删除,但不会真正地删除

文件夹基本信息

下面的方法可以获得文件夹的基本信息

方法描述
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 or Folder.READ_WRITE),或-1表示未知
Store getStore()
返回Folder所在的Store对象
abstract char getSeparator()
返回文件夹路径名中的分隔符

管理文件夹

下面的方法用以管理文件夹:

方法描述
abstract boolean create(int type)
在该文件夹所在的Store下创建一个新的文件夹,类型可能是:Folder.HOLDS_MESSAGES 或 Folder.HOLDS_FOLDERS,即包含消息或包含文件夹。返回true表示成功
abstract boolean delete(boolean recurse)
在文件夹关闭的情况下才能删除文件夹,否则将抛出IllegalStateException状态非法异常,如果recurse递归参数为true,子文件夹也会被删除
abstract boolean renameTo(Folder f)
修改文件夹的名称。一个文件夹必须是关闭才能修改名称,否则将抛出IllegalStateException状态非法异常

管理文件夹中的消息

下面的方法用以管理文件夹中的消息:

方法描述
abstract void appendMessages(Message[] messages)
如方法名所指,消息数组指定的邮件将被追加到改文件夹的尾部
void copyMessages(Message[] messages, Folder destination)
将邮件复制到参数指定的文件夹中
abstract Message[] expunge()
要删除Folder中的邮件,首先设置它的的标识Flags.Flag.DELETED为true,然后调用改方法才会物理删除

列出文件夹中的内容

下面的四个方法文件夹中包含的文件夹

方法描述
Folder[] list()
返回一个Folder的数组,返回改文件夹中包含的文件夹
Folder[] listSubscribed()
列出包含的所有订阅文件夹
abstract Folder[] list(String pattern)
改方法和list()类似,只不过提供了一个pattern参数,以允许指定一个pattern,只列出匹配上该pattern的文件夹。
Folder[] listSubscribed(String pattern)
改方法和listSubscribed()类似,只不过提供了一个pattern参数,以允许指定一个pattern,只列出匹配上该pattern的订阅文件夹。

关于模式pattern的使用:

模式可以包含%和*两种通配符,前者可以匹配出路径分隔符之外的任意字符,后者可以匹配任意字符。如:

Personal/
       Finance/
          Stocks
          Bonus
          StockOptions
       Jokes
  1. 在Personal上使用list("*"),返回整个层级
  2. 在Personal上使用list("%"),返回"Finance" 和 "Jokes”
  3. 在Personal上使用list("Jokes"),返回"Jokes"
  4. 在Finance上使用("Stock*") ,返回"Stocks" 和"StockOptions"

检查邮件

方法描述
abstract int getMessageCount()
该方法在文件夹打开或关闭时都可以使用。然而在文件夹关闭的情况下,可能返回-1表示消息数不可靠
abstract boolean hasNewMessages()
如果返回true,表示自上一次打开文件夹有新的邮件添加到文件夹了。
int getNewMessageCount()
返回文件夹中标识了RECENT标识的邮件的数量
int getUnreadMessageCount()
该方法在文件夹打开或关闭时都可以使用。然而在文件夹关闭的情况下,可能返回-1表示真实结果的获取成本太高以至于不能获得。

从文件夹中获取邮件

方法描述
abstract Message getMessage(int messageNumber)
返回文件夹中第n个消息,计数从1开始
Message[] getMessages()
返回文件夹中所有的消息
Message[] getMessages(int start, int end)
返回该文件夹中从start到end为止的多个消息。
Message[] getMessages(int[] messageNumbers)
返回指定位置的消息。
void fetch(Message[] messages, FetchProfile fp)
为给定的消息数组,预抓取由FetchProfile指定的项目,FetchProfile对数指定了包含哪些头信息的消息会被预抓取

文件夹中搜索邮件

    如果服务端支持搜索(很多IMAP服务支持但POP服务不支持),可以非常容易地根据指定条件搜索消息。这里说的指定条件用SearchTerm对象来表示,下面是两种搜索方法:

方法描述
Message[] search(SearchTerm term)
搜索文件夹中配置上指定条件的消息。返回一个消息数组。如果返回空数组表示没有可匹配的消息
Message[] search(SearchTerm term, Message[] messages)
在给定的消息数组中搜索指定条件的消息,当然这些给定的消息数组必须在该文件夹中。如果返回空则表示没有发现指定条件的消息。

标识

    在你想修改文件夹中所有消息的状态时,如全部标记为以读,Flag是非常有用的。下面是Folder提供的相关方法:

方法描述
void setFlags(Message[] messages, Flags flag, boolean value)
给给定的消息数组的消息设置指定的标识
void setFlags(int start, int end, Flags flag, boolean value)
给指定范围的消息设置标识
void setFlags(int[] messageNumbers, Flags flag, boolean value)
给指定编号的消息设置标识
abstract Flags getPermanentFlags()
返回文件夹支持的所有消息的标识。


还没有评论!
54.167.152.177