第六講:使用Store查看郵件(1)

第六講:使用Store查看郵件(1)


一、郵件接收的體系結構
JavaMail API中定義了一個java.mail.Store類,用於執行郵件的接收任務,該類的實例對象封裝了某種郵件接收協議的底層實施細節,應用程序調用這個類的方法就可以獲得用戶郵箱中的各個郵件夾的信息。JavaMail中的使用Folder對象表示郵件夾,通過Folder對象的方法應用程序進而又可以獲得該郵件夾中的所有郵件信息,而每封郵件信息JavaMail又分別使用了一個Message對象進行封裝。JavaMail中接收郵件主要涉及的如下圖所示:

圖1:JavaMail Store的API(取自《JavaMail開發詳解》)

1. 從Session對象中獲得實現了某種郵件發送協議的Store對象
2. 以某個郵件賬戶的身份連接上POP3或IMAP4服務器
3. 調用Store的getFolder方法,獲取代表該賬戶的郵件中的某個郵件夾的Folder對象
4. 調用Folder對象中的getMessages或getMessage方法,獲取郵件夾中的所有郵件或某一封郵件


二、Store類

和Transport類一樣,javax.mail.Store類也是繼承了javax.mail.Service類。Store類用於連接郵件服務器,並訪問郵件接收服務器上的郵件夾。Store類是一個抽象類。Sun公司在mail.jar包的com/sun/mail/pop3目錄中提供的POP3的實現子類POP3Store,其實現了POP3協議的底層實施細節。可以通過Session對象中定義的mail.store.protocol屬性構建相應的協議實現類,並返回實例對象。其常用方法有:

connect() throws MessagingException
connect(String host, String user, String password) 
throws MessagingException
connect(String host, String port, String user, String password)
throws MessagingException                                                                                                                                                   
這三種方法執行客戶端與郵件服務器的連接請求。會拋出下列異常:
連接認證失敗: AuthenticationFailedException
已連接:拋出 IllegalStateException異常
其他原因:拋出MessageException異常                   
isConnected() 用於檢測客戶端與郵件服務器是否已經連接
abstract Folder getFolder(java.lang.String name)
throws MessagingException
用於返回指定名稱的郵件夾(Folder)對象

使用getFolder方法式,name指定的是郵件夾的名稱,如果客戶端與郵件服務器沒有連接的情況下調用該方法,該方法會拋出MessagingException異常。同時調用該方法是要注意兩點:

  1. 指定的郵件夾在郵件服務器上不存在,該方法也將返回指定名稱的Folder對象,如果用戶想判斷得到的郵件夾是否存在還需要調用Folder的exists方法判斷。
  2. 通過POP3協議獲得的Store對象調用這個方法時,郵件夾名稱只能指定爲"INBOX"。

三、Folder類

Folder類是一個抽象類,應用程序通過調用Store的getFolder方法獲得Folder類的實例對象,Folder類常用的方法如下:

abstract boolean exists()
throws MwessagingException                                                                                                      
判斷當前郵件夾在郵件服務器中是否存在,若客戶端與郵件服務器已經斷開則拋出 MessagingException異常
abstract void open(int mode) 設置客戶端訪問郵件賬戶的操作權限。
Folder.READ_ONLY:只能讀取郵件夾中的郵件
Folder.READ_WRITE:可以修改並且讀取其中的郵件
abstract Message getMessage(int msgnum)                                                                                              從郵件夾中獲取指定郵件對象
abstract
Message[] getMessages()
Message[] getMessages(int start, int end)
Message[] getMessage(int[] msgnum)
分別是返回所有郵件、指定範圍內的所有郵件對象
abstract
Message[] serach(SearchTerm term)
Message[] search(SearchTerm term, Message[] msgs)                                                                                                                                                                 
搜索郵件夾中符合條件的郵件。
SearchTerm類在後面介紹,第一個方法搜索整個郵件夾,而後者搜索的範圍有msgs數組指定
abstract int getMessageCount() 返回郵件夾中郵件的總數
abstract void close(boolean expunge) 關閉當前的Folder對象。expunge表示在刪除對象前是否刪除已經設置了刪除標記的郵件從而更新folder

四、Flags類

mail.jar包中的Flags類代表一組郵件標記的集合,郵件標記用於標識郵件的使用狀況,例如:刪除標記、已讀標記等。JavaMail中的郵件標記分爲系統標記和用戶標記,系統標記是指Flags.Flag這個內部類中表示的郵件標記,用戶標記指用戶自定義的標記。
Flags.Flag是Flags的內部類,該內部類定義了一些常量分別表示各種不同的郵件標記,這些標記都是系統標記。

Flags.Flag中定義的常量
常量 說明
Flags.Flag.ANSWERED 郵件回覆標記,用於標識郵件是否已經回覆
Flags.Flag.DELETED 郵件刪除標記
Flags.Flag.DRAFT 草稿郵件標記
Flags.Flag.FLAGGED 用於表示郵件是否爲回收站中的郵件
Flags.Flag.RECENT 新郵件標記,用於表示郵件是否是新郵件
Flags.Flag.SEEN 郵件閱讀標記,用於表示郵件是否已經閱讀
Flags.Flag.USER                                                                                                  底層系統是否支持用於自定義標記,應用程序只能檢索這個屬性,而不能設置這個屬性
   

設置郵件標記應該注意的問題:爲郵件服務器中的郵件設置郵件標記依賴於具體的郵件協議,例如POP3協議只定義了dele命令,因此POP3服務器只支持JavaMail中的Flags.Flag.DELETED標記。雖然POP3服務器不支持除Flags.Flag.DELETED標記以外的其他郵件標記,但是客戶端軟件可以爲本地硬盤上的郵件設置這些郵件標記,以方便用戶管理本地郵件。


Flags類中的常用方法
Flags()
Flags(Flags flags)
Flags(Flags.Flag flag)
Flags(java.lang.String flag)
構造一個空的Flags對象
用指定的Flags對象構造一個Flags對象
用指定的系統標記構造一盒Flags對象
用於指定的用戶標記構造一個Flags對象
void add(Flags.Flag flag)
void add(java.lang.String flag)
void add(Flags flag)                                                                                                                                                            
增加指定的系統標記到Flags對象
增加指定的用戶標記到Flags對象
增加一個Flags對象中包含的所有郵件標記到當前的Flags對象中
void remove(Flags.Flag flag)
void remove(java.lang.String flag)
void remove(Flags flag)
從當前的Flags對象中刪除指定的系統標記
從當前的Flags對象中刪除用戶標記
從當前Flags對象中刪除參數Flags對中定義的所有郵件標記
boolean contains(Flags.Flag flag)
boolean contains(java.lang.String flag)
boolean contains(Flags flag)                          
檢查當前對象中是否包含指定的系統標記
檢查當前對象中是否包含指定的用戶標記
檢查當前對象中是否包含指定的Flags對象中的所有郵件標記
Flags.Flag[] getSystemFlags() 返回Flags對象中的所有系統標記
String[] getUserFlags() 返回Flags對象中所有的用戶標記
Flags getFlags()
void setFlags(Flags flag, boolean set)
getFlags方法用於得到Message對象中設置的郵件標記
setFlags方法用於爲Message對象設置郵件標記,其中set參數用於表示flags對象代表的郵件標記是設置到Message對象中的,還是從Message對象中刪除。當set爲true時表示設置,false表示刪除
//設置郵件標識
folder.open(Folder.READ_WRITE);  //以讀寫模式打開郵件夾
message.setFlag(Flags.Flag,true);  //設置郵件標記
message.saveChange();                //保存設置

//清除郵件標識
folder.open(Folder.READ_WRITE);
Flags flags = messgae.getFlags();
if(flags.contains(Flags.Flag)){
	message.setFlag(Flags.Flag, false);
}
message.saveChanges();


PS:刪除保存在POP3服務器中的郵件時,應用程序首先要爲郵件設置爲刪除標記,然後調用folder.close(true)方法關閉當前郵件夾對象POP3服務器纔會刪除保存在服務器中的郵件。在JavaMail的API文檔中可以知道Folder類定義了一個名爲expunge的方法,該方法的定義就是用來刪除郵件夾中所有設置了刪除標記的郵件。事實上應用程序不能調用這個方法來刪除保存在POP3服務器中的郵件,由於POP3本分的限制所導致其不能調用其本身POP3Folder.expunge()方法刪除郵件。而IMAP協議則允許客戶端在郵件服務器上直接執行郵件刪除操作。IMAP實現類IMAPFolder中提供了IMAPFolder.expunge方法刪除郵件其實其實直接調用Folder.expunge中的方法刪除郵件。


發佈了32 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章