JavaMail詳解(九)——文件夾管理

    到現在爲止,前面我們接觸的都是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;

JavaMail詳解(九)——文件夾管理

2017年07月28日 02:09 閱讀 1919


1 打開文件夾
2 文件夾基本信息
3 管理文件夾
4 管理文件夾中的消息
5 列出文件夾中的內容
6 檢查郵件
7 從文件夾中獲取郵件
8 文件夾中搜索郵件
9 標識

    到現在爲止,前面我們接觸的都是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() 返回文件夾支持的所有消息的標識。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章