JavaMail之POP3協議判斷新郵件的思路 .

本來準備長篇大論一番,寫一些關於郵件、JavaMail的基本知識,寫了一些文字後才發現自己犯了個錯誤,因爲對該題目感興趣的人肯定已經熟知這些東西,沒有必要我在這多費口舌。

      也就是說POP3無法判斷某一封郵件是否已讀,雖然JavaMail的某些類中也有這樣的方法,但是這些方法只是在使用IMAP的時候有效,爲了使 JavaMail針對不同協議有統一的接口,因此它包容着不同協議的功能,是一套抽象的關於郵件系統的API。舉個例子,Folder類中關於新郵件的幾個方法對POP3協議都是無效的。既然無效我們怎麼解決在使用POP3協議的時候判斷是否爲新郵件的這樣一個要求呢?——我們必須在客戶端做點手腳。

      一個郵件服務器在處理每封郵件的時候會給它分配一個獨一無二的編號(UID),這個編號是一個正的長整數,一般這是一個遞增的值,有關於這個UID可以參照RFC 2060的詳細說明。利用這個UID我們就可以實現郵件的讀狀態的處理。首先我們必須在客戶端保存一個一對多的關係表,也就是一個郵箱地址對應多個郵件的 UID,以後在收取每封郵件的時候判斷該郵件的UID是否已經在本地保存,如果已保存則該郵件已讀,否則的話這是一封新郵件,並把該新郵件的UID加入本地繼續保存。可能你會覺得這樣的話豈不是要保存很多郵件的編號,會不會佔用空間之類的懷疑,我想這應該是一個權宜之策,不過UID僅僅是一個長整數,浪費不了多大的空間。

      在獲取郵件UID的時候還需要有一個注意的地方不再囉嗦,請看下面程序片斷中的紅色粗體字。


URLName url = new URLName("pop3", host, port, "", user, password);
Session session = Session.getInstance(System.getProperties(),null);
Store store = session.getStore(url);
POP3Folder inbox = null;
try {
       store.connect();
       inbox = (POP3Folder) store.getFolder("INBOX");
       inbox.open(Folder.READ_ONLY);
       FetchProfile profile = new FetchProfile(); 
       profile.add(UIDFolder.FetchProfileItem.UID);  
       profile.add(FetchProfile.Item.ENVELOPE);
       Message[] messages = inbox.getMessages();
       inbox.fetch(messages, profile);
       int j = messages.length - 1;
       for (int i = 0; i < messages.length; i++,j--) 
              System.out.println(inbox.getUID(messages[i]));       
} finally {
       try{
              inbox.close(false);
       }catch(Exception e){}
       try{
              store.close();
       }catch(Exception e){}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章