最近重新將JavaMail的API抓出來看看,筆者第一次使用 JavaMail,大概是在3年前,還在唸大學的時候一個project裡面 使用到的,最近再看JavaMail API,已經到了1.3.1版了,而且相關 的third-party release已經不少,似乎成熟了許多。記得筆者第一次 使用JavaMail的時候,光是一個pop3的操作,就得想辦法去找pop的 provider lib,而且還會碰到繁體中文的問題,現在這些都已經bundle 在JavaMail裡面了,問題也少了許多。 這次我們來看看怎麼利用JavaMail來讀取電子郵件: 首先,有幾個類別是必須使用到的,我們要先取得一個Session,利用 這個Session取得Store,再利用這個Store物件來連接到遠端的伺服器 上面。連到伺服器之後,透過Store物件取得Folder物件,要注意的是, 取得Folder物件之前要指定Folder的名稱,如果遠端伺服器支援的是 POP3的協定,那Folder的名稱一定是INBOX,如果是IMAP的協定就不一定 了。取得Folder物件之後,打開Folder,透過getMessages函式取得Message 物件的陣列。要注意的是,根據規格,這些Message物件都是輕量級的 物件,裡面並沒有實際的內容,只有當我們透過Message類別的函式呼叫 的時候,才會依需要取得內容。這樣的設計,讓我們可以在Message全部 被下載下來之前,先指定要下載哪些東西。在Folder這個類別裡面,有一個 fetch函式,有趣的是,即使不呼叫fetch這個動作,Message的內容也會 在需要的時候自動被下載下來,但是fetch這個動作可以讓我們指定要預先 下載哪些東西。fetch函式接受兩個參數,一個是之前取得的Message陣列, 另外一個是FetchProfile物件,這個物件讓我們設定要預先取得的內容, 舉例來說,FetchProfile.add(FetchProfile.Item.ENVELOPE)表示要預先 下載envelope的部分,包括subject,from等等,而FetchProfile.add("X-mailer") 表示要取回X-mail欄位的資訊。底下我們來看看一個範例程式: ============================================================================= /*設定Session的環境參數*/ Properties prop=new Properties(); prop.put("protocol","pop3"); prop.put("type","store"); prop.put("class","com.sun.mail.pop3.POP3Store"); prop.put("vendor","Sun Microsystems, Inc."); Session session = Session.getDefaultInstance(prop, null); Store store = session.getStore("pop3"); store.connect("host.com.tw", "username", "password"); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); /*預先取回envelope的資訊*/ FetchProfile fp=new FetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); folder.fetch(message,fp); for(int i=0;i