到現在爲止,前面我們接觸的都是INBOX這個文件夾。這是大多數郵件的存在的默認目錄。有些系統可能稱之爲INBOX,而有些可能有其他的名字。但是,通過JavaMail API,你總是可以用INBOX來訪問收件箱。
JavaMail API代表文件夾的類是抽象類Folder:
public abstract class Folder
該類中聲明瞭一些方法,用以向服務端請求指定名稱的文件夾,刪除文件夾中的郵件,搜索文件夾中特定的郵件,列出文件夾中的郵件等等。
打開文件夾
我們不能直接創建Folder類的對象,因爲他的構造方法是protected修飾的。然而我們可以這樣獲得:
- 在Session中
- 在Store中
- 在另外一個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修飾的。然而我們可以這樣獲得:
- 在Session中
- 在Store中
- 在另外一個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
- 在Personal上使用list("*"),返回整個層級
- 在Personal上使用list("%"),返回"Finance" 和 "Jokes”
- 在Personal上使用list("Jokes"),返回"Jokes"
- 在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() | 返回文件夾支持的所有消息的標識。 |