陳 翔
(杭州師范大學(xué) 杭州國(guó)際服務(wù)工程學(xué)院,浙江 杭州 310036)
隨著網(wǎng)絡(luò)技術(shù)及網(wǎng)絡(luò)辦公化的發(fā)展,電子郵件已經(jīng)成為人們主要的通信方式之一.平常人們收發(fā)郵件主要有兩種:一種是通過(guò)常用的郵件管理軟件來(lái)實(shí)現(xiàn),如微軟的Outlook Express,國(guó)產(chǎn)的FoxMail;另一種是通過(guò)Web瀏覽器直接訪問(wèn)郵件服務(wù)器網(wǎng)站來(lái)實(shí)現(xiàn)收發(fā)郵件.這兩種方法都比較簡(jiǎn)單、方便,但如果希望在自己開(kāi)發(fā)的系統(tǒng)中擁有郵件的收發(fā)功能,以上兩種方法就都無(wú)法實(shí)現(xiàn)了.該文就以在“高校畢業(yè)論文管理系統(tǒng)B/S版”中增加郵件管理的功能為例,提出了一種基于JavaMail的簡(jiǎn)潔、高效、可行的郵件管理系統(tǒng).
圖1 基于JavaMail API的應(yīng)用程序體系結(jié)構(gòu)圖
JavaMail是Sun公司為Java開(kāi)發(fā)人員提供的公共應(yīng)用程序接口框架,提供了一個(gè)與平臺(tái)無(wú)關(guān)、協(xié)議獨(dú)立的框架,預(yù)置了一些最常用的郵件傳送協(xié)議的實(shí)現(xiàn)方法,通過(guò)一組API來(lái)模擬郵件系統(tǒng),提供E-mail的發(fā)送和接收服務(wù).它采用接口與實(shí)現(xiàn)相分離,支持存取方式,消息格式、消息傳送協(xié)議不同的郵件消息系統(tǒng),可以簡(jiǎn)便地為應(yīng)用程序增加E-mail支持,廣泛應(yīng)用于構(gòu)建郵件和消息應(yīng)用系統(tǒng)[1].
JavaMail API提供了幾個(gè)抽象類,這些抽象類定義了組成郵件系統(tǒng)對(duì)象.同時(shí)這些API能夠被擴(kuò)展來(lái)提供新的協(xié)議和增加功能(見(jiàn)圖1).此外API還提供了具體的子類用于應(yīng)用程序的開(kāi)發(fā).最新的JavaMail已經(jīng)能夠完全支持POP3、IMAP和STMP等協(xié)議[2].
2.1 系統(tǒng)結(jié)構(gòu)
系統(tǒng)采用3層結(jié)構(gòu).第1層是客戶端層,用戶通過(guò)瀏覽器(如IE)發(fā)起瀏覽、檢索、處理郵件等請(qǐng)求,并顯示處理結(jié)果[3].第2層為服務(wù)器層,可以分為兩個(gè)功能:一個(gè)是用于響應(yīng)和處理客戶端請(qǐng)求,通過(guò)請(qǐng)求處理程序與后臺(tái)數(shù)據(jù)庫(kù)交互,返回處理結(jié)果;另一個(gè)是通過(guò)JavaMail API與郵件服務(wù)器交互,發(fā)送和接收郵件,并對(duì)有效郵件進(jìn)行解析與分類,將結(jié)果存放在數(shù)據(jù)庫(kù)中,通過(guò)系統(tǒng)消息或短信平臺(tái)通知用戶[4].第3層為數(shù)據(jù)層,主要功能是存儲(chǔ)系統(tǒng)和郵件信息.
2.2 郵件系統(tǒng)功能設(shè)計(jì)
考慮到此郵件系統(tǒng)是依托于“論文管理系統(tǒng)”,因此系統(tǒng)主要包含3大功能:郵件發(fā)送、郵件接收、郵件管理.郵件發(fā)送,包括編輯和發(fā)送郵件.接收郵件,包括顯示郵件列表和閱讀郵件.收到的郵件將直接保存到收件箱中,采用郵件列表的形式顯示在頁(yè)面上,每封郵件只顯示主題、發(fā)件人、發(fā)信時(shí)間和收信時(shí)間等簡(jiǎn)單信息,用戶可以點(diǎn)擊鏈接來(lái)查看具體內(nèi)容.郵件管理模塊,主要實(shí)現(xiàn)郵件的刪除,用戶可以直接從數(shù)據(jù)庫(kù)中刪除郵件,也可以保存到本地來(lái)保存郵件.
3.1 開(kāi)發(fā)環(huán)境
該系統(tǒng)是在Windows XP操作系統(tǒng)下進(jìn)行開(kāi)發(fā)的,支持JDK5.5、JavaMail API和JAF.Web服務(wù)器采用Tomcat5.0,數(shù)據(jù)庫(kù)為SQL Server 2005,郵件服務(wù)器選用是Exchange 2003.
3.2 實(shí)現(xiàn)方式
圖2 Web郵件客戶端處理過(guò)程
Web郵件客戶端從實(shí)現(xiàn)角度分析,包括2個(gè)部分:前臺(tái)和后臺(tái).前臺(tái)實(shí)現(xiàn)JSP頁(yè)面、JavaBean和Servlet.后臺(tái)實(shí)現(xiàn)JavaMail應(yīng)用程序.其處理工程如圖2所示.
3.2.1 前臺(tái)功能實(shí)現(xiàn)
系統(tǒng)前臺(tái)每個(gè)模塊都是由Pagedata、JSP頁(yè)面和Servlet組成.其中,Pagedata為一個(gè)JavaBean,它類似于一個(gè)數(shù)據(jù)結(jié)構(gòu),封裝了相應(yīng)頁(yè)面所需要傳遞的數(shù)據(jù),并提供set()和get()方法設(shè)置和讀取數(shù)據(jù).JSP頁(yè)面又由主頁(yè)面和對(duì)應(yīng)的data頁(yè)面構(gòu)成,data頁(yè)面具體定義了主頁(yè)面所需要的數(shù)據(jù),主頁(yè)面只需要將其data頁(yè)面包含進(jìn)來(lái)即可以訪問(wèn)這些數(shù)據(jù).Servlet作為控制器對(duì)頁(yè)面請(qǐng)求進(jìn)行處理,處理完成后通過(guò)Pagedata的set()方法將數(shù)據(jù)存入JavaBean,然后控制頁(yè)面跳轉(zhuǎn)到的頁(yè)面再通過(guò)Pagedata的get()方法讀取數(shù)據(jù)并顯示出來(lái).
系統(tǒng)中的Servlet主要包括以下幾個(gè)方面的處理.LoginServlet是對(duì)成功登錄后頁(yè)面的控制.當(dāng)用戶輸入用戶名和密碼并且成功通過(guò)驗(yàn)證后,LoginServlet將控制頁(yè)面跳轉(zhuǎn)到menu界面,并自動(dòng)取得menu中要顯示的數(shù)據(jù)顯示在頁(yè)面上.比如取得個(gè)人文件夾的名稱和個(gè)數(shù)顯示在menu中.FolderServlet是對(duì)郵箱文件夾的處理.用戶可以通過(guò)頁(yè)面調(diào)用它來(lái)取得郵箱的所有文件夾,并可顯示所有的文件夾及其包含的郵件數(shù).ListMailServlet是對(duì)郵箱文件夾中郵件列表顯示、移動(dòng)郵件、刪除郵件、查找郵件、過(guò)濾郵件等操作的控制.ViewMailServlet用于閱讀郵件控制.當(dāng)用戶在頁(yè)面點(diǎn)擊某一郵件時(shí),此Servlet將調(diào)用impl包中相應(yīng)方法,將此郵件的具體內(nèi)容顯示在另一個(gè)JSP頁(yè)面上并從當(dāng)前頁(yè)面跳轉(zhuǎn)到此頁(yè)面.WriteMailServlet用于發(fā)送郵件、保存郵件以及回復(fù)郵件控制.AddressServlet用于通訊錄記錄處理.
3.2.2 后臺(tái)程序?qū)崿F(xiàn)
JavaMail應(yīng)用程序作為整個(gè)系統(tǒng)的指揮中心在后臺(tái)運(yùn)行.JavaMail應(yīng)用程序負(fù)責(zé)實(shí)現(xiàn)頁(yè)面提交的請(qǐng)求,通過(guò)Servlet來(lái)連接頁(yè)面和應(yīng)用程序.Servlet在處理過(guò)程中可以調(diào)用JavaMail應(yīng)用程序,JavaMail應(yīng)用程序也可以通過(guò)set()方法將數(shù)據(jù)傳遞給JavaBean.
接口RecvMailConnlnterf由類ImapConnlmpl實(shí)現(xiàn)用戶登錄認(rèn)證、郵件接收、郵件解析、郵件發(fā)送、郵件列表、郵件文件夾管理等功能.下面給出部分主要功能的實(shí)現(xiàn)過(guò)程.
1)郵件的接收.獲取郵件服務(wù)器上的用戶文件夾,然后使用根文件夾的getMessage()方法獲取郵件,以郵件列表的形式顯示.
Public Message[] getMessages() throws MailboxFolderException{
Message[] messages=null;
if (!openFolder(Folder. READ_ONLY)) return null;
try { messages = this.rootfolder.getMessages(); //郵件獲取
} catch ( MessagingException me){
throw (new MailboxFolderException(”獲取郵件失敗”,null));
}finally {closeFolder();}
return (messages);
}
2)郵件解析.當(dāng)收到郵件后需要對(duì)郵件按格式進(jìn)行解析,MessageParse類實(shí)現(xiàn)了郵件的解析,應(yīng)用于郵件的閱讀.它詳細(xì)定義了郵件的主題、收件人、發(fā)件人、正文等信息.下面給出郵件解析的部分實(shí)現(xiàn)內(nèi)容:
public class MessageParse {
private Message message;
……
}
3)郵件的發(fā)送.sendMessage方法實(shí)現(xiàn)了使用SMTP協(xié)議發(fā)送郵件.通過(guò)創(chuàng)建與郵件服務(wù)器的SMTP會(huì)話,然后在該SMTP會(huì)話上產(chǎn)生和發(fā)送郵件.具體實(shí)現(xiàn)如下所示:
public boolean sendMessage (SmtpMall msgp) {
Session session = genimtpSession); //創(chuàng)建會(huì)話
Message msg = msgp. createmessage (session);
try{ //發(fā)送郵件
SMTPTransport t=initSMTPTransport (session);
t. sendMessage ( msg, msg.getAllRecipients());
t. close();
return true;
} catch (MessagingException e ){
e. printStackTrace;}
return false;
}
3.3 系統(tǒng)運(yùn)行示例
經(jīng)測(cè)試郵件管理在論文系統(tǒng)中各功能運(yùn)行正常.界面設(shè)計(jì)簡(jiǎn)潔,使用方便.系統(tǒng)運(yùn)行時(shí)收件箱的界面如圖3所示.
圖3 Web郵件在系統(tǒng)中運(yùn)行界面示例
基于JavaMail開(kāi)發(fā)的Web郵件系統(tǒng)具有良好的可擴(kuò)展性,能夠支持各種復(fù)雜的郵件格式和數(shù)據(jù)類型.該郵件客戶端系統(tǒng)依托于“論文管理系統(tǒng)”實(shí)現(xiàn)了用戶登錄、郵件發(fā)送、郵件接收、郵件管理和通訊錄管理等基本功能,適用于為企業(yè)內(nèi)部提供郵件服務(wù),具有較強(qiáng)的應(yīng)用價(jià)值.但在郵件分類和過(guò)濾方面還需要改進(jìn),有待于引進(jìn)復(fù)雜的分類算法和過(guò)濾技術(shù),并使用更靈活的分類框架,實(shí)現(xiàn)智能化、自動(dòng)化、高效的郵件過(guò)濾與分類.
[1] Sun Microsystems, Inc. JavaMail API design specification version 1.4[EB/OL].(2008-10-22)[2008-12-30].http://java.sun.com/producta/javamail/
[2] Sun Microsystems, Inc. JavaBeans activation framework specification version 1.1[EB/OL].(2008-04-25)[2008-07-15].http://java.sun.corn/producta/javabeana/jaf/index.jsp
[3] 謝偉全,葉強(qiáng),李一軍.基于用戶知識(shí)的中文電子郵件分類[J].計(jì)算機(jī)應(yīng)用研究,2007,24(3):263-264.
[4] 鐘路,劉玲,夏紅筱.基于Java Mail API的Web郵件系統(tǒng)開(kāi)發(fā)[J].武漢理工大學(xué)學(xué)報(bào),2008,28(6):84-86.