《用Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單郵件系統(tǒng).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《用Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單郵件系統(tǒng).ppt(28頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、Presentation by: Emil,用Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單郵件系統(tǒng),實(shí)訓(xùn)作品原理及功能說(shuō)明,Presentation by: Emil,項(xiàng)目目標(biāo),掌握郵件系統(tǒng)開(kāi)發(fā)技術(shù),包括郵件協(xié)議, JavaMail及郵件開(kāi)發(fā)環(huán)境配置,郵件收發(fā)流程及JavaMail 核心類(lèi)的使用,利用 JavaMail 開(kāi)發(fā)一個(gè)具體的郵件管理系統(tǒng)。,Presentation by: Emil,郵件系統(tǒng)介紹,在網(wǎng)上怎樣收發(fā)郵件? 答:在網(wǎng)絡(luò)上收發(fā)郵件各需要一個(gè)協(xié)議來(lái)完成,這一點(diǎn)不用于現(xiàn)實(shí)世界的郵件處理過(guò)程。 常用的郵件協(xié)議是哪些? 答:它們是pop3協(xié)議,負(fù)責(zé)收取郵件;smtp協(xié)議,負(fù)責(zé)發(fā)送郵件。二者各司其職,但是一
2、個(gè)完整的郵件系統(tǒng)必須擁有這兩種協(xié)議才能完成郵件收發(fā)工作。,Presentation by: Emil,兩種查收郵件的方式,一、在線查收 比如hotmail。此時(shí)只需要登陸服務(wù)器收發(fā)信件就可以了,用戶不必理會(huì)pop3和smtp服務(wù)器的設(shè)置,因?yàn)樗鼈兪亲詣?dòng)在幕后工作的,點(diǎn)擊“發(fā)送”,smtp就在工作了。,Presentation by: Emil,兩種查收郵件的方式,二、離線查收 比如Outlook或者Foxmail。此類(lèi)軟件的好處是可以把信件收到本地的硬盤(pán)上。但是在創(chuàng)建新賬號(hào)的過(guò)程中就必須按提示正確填寫(xiě)你的信箱地址、密碼、pop3服務(wù)器地址、smtp服務(wù)器地址,這樣才能實(shí)現(xiàn)不登陸信箱也能收發(fā)
3、信件。,Presentation by: Emil,市場(chǎng)上的幾種郵件系統(tǒng)性能比較,,Presentation by: Emil,大型門(mén)戶網(wǎng)站的郵件系統(tǒng),目前大型門(mén)戶網(wǎng)站的郵件系統(tǒng)通常是由內(nèi)部人員自行開(kāi)發(fā)的,需要十幾個(gè)高級(jí)技術(shù)人員專門(mén)維護(hù),并依賴于昂貴的硬件支持。 Etang的郵件系統(tǒng)采用了價(jià)格為100萬(wàn)美元的EMC存儲(chǔ)設(shè)備 263的郵件系統(tǒng)成本在1500萬(wàn)人民幣,有30人負(fù)責(zé)維護(hù) 新浪的郵件系統(tǒng)有60臺(tái)的服務(wù)器支撐,還有十幾位工程師在專門(mén)維護(hù)該系統(tǒng) 結(jié)論:這樣的成本令眾多企業(yè)在開(kāi)展郵件服務(wù)時(shí)望而生畏。,Presentation by: Emil,Exchange Server,該系統(tǒng)只能運(yùn)行在
4、Windows NT上,而WinNT本身的不可靠、不穩(wěn)定決定了Exchange Server的不穩(wěn)定、不可靠。 Exchange Server具有嚴(yán)重的內(nèi)存泄漏問(wèn)題,隨著系統(tǒng)運(yùn)行時(shí)間的增加會(huì)越來(lái)越慢,平均至少要一周重啟一次。 Windows NT系統(tǒng)面臨著巨大的病毒感染隱患,一旦Exchange Server感染病毒,會(huì)造成Exchange Server本身的癱瘓,感染速度驚人。殺毒軟件只會(huì)“亡羊補(bǔ)牢”。 Exchange Server對(duì)郵件賬戶的支持是非常有限的,一般超過(guò)200個(gè)用戶是系統(tǒng)就會(huì)效率低下,提升性能只能依靠昂貴的硬件。 Exchange Server自身安全防范較弱,容易被外界利
5、用來(lái)轉(zhuǎn)發(fā)郵件,甚至冒充內(nèi)部人員發(fā)送垃圾郵件。 Exchange Server維護(hù)困難,擁有成本高,每個(gè)用戶需交納10美元許可費(fèi)。,Presentation by: Emil,Lotus Notes,Lotus Notes基本上還是一套OA和工作流系統(tǒng),其郵件功能十分有限。國(guó)內(nèi)用戶反映的問(wèn)題主要有: 郵件系統(tǒng)經(jīng)常不能正常收發(fā),需頻繁的重啟動(dòng)服務(wù)器或清理郵件系統(tǒng)。 經(jīng)常被外界利用來(lái)轉(zhuǎn)發(fā)郵件 不能和部分郵件系統(tǒng)很好兼容,系統(tǒng)收到的263和163信箱的郵件顯示為亂碼,收不到hotmail的郵件。 OA功能豐富,但是郵件系統(tǒng)不夠可靠,效率低,超過(guò)300人時(shí),收信速度明顯變慢 擁有成本高,每個(gè)用戶的成本是
6、21美元,比Exchange Server還貴。,Presentation by: Emil,我的JavaMail系統(tǒng),自己開(kāi)發(fā)系統(tǒng)的最大好處是: 按需定制,怎么簡(jiǎn)單怎么來(lái)! 資源開(kāi)銷(xiāo)小,維護(hù)成本低,功能靈活,有問(wèn)題不用咨詢工程師,毀掉重做就好。 擁有成本低到只有時(shí)間成本。 界面簡(jiǎn)單,清晰明了。,Presentation by: Emil,使用郵件協(xié)議的優(yōu)點(diǎn)和不足,郵局協(xié)議的最大好處在于支持移動(dòng)計(jì)算。由于用戶的信件是存放在POP服務(wù)器中而不是直接自動(dòng)存放到用戶的計(jì)算機(jī)中的,這樣用戶就不必建立與“郵局”的永久性連接,以等待隨時(shí)可能寄來(lái)的電子郵件,這使得那些不易于直接連入局域網(wǎng)絡(luò)的臺(tái)式PC
7、或筆記本機(jī)可以通過(guò)撥號(hào)上網(wǎng)(建立臨時(shí)的TCPIP連接)的方式方便地獲得郵件服務(wù)。這也是目前分散的互聯(lián)網(wǎng)用戶獲得郵件服務(wù)的主要形式。 離線收發(fā)郵件的不足之處在于容易受到垃圾郵件的騷擾。而www郵局則較好地解決了此問(wèn)題,因?yàn)榉?wù)器已經(jīng)自動(dòng)攔截了相當(dāng)數(shù)量的垃圾郵件。,Presentation by: Emil,怎樣用J2SE實(shí)現(xiàn)郵件系統(tǒng),Java提供了相應(yīng)的程序接口 JavaMail是相應(yīng)的郵件功能實(shí)現(xiàn)接口,通過(guò)此接口,應(yīng)用程序可以在黑盒狀態(tài)下實(shí)現(xiàn)與郵件協(xié)議的通信,完成郵件收發(fā)。實(shí)現(xiàn)機(jī)制類(lèi)似于數(shù)據(jù)庫(kù)橋接程序原理。,Presentation by: Emil,本項(xiàng)目中郵件收發(fā)實(shí)現(xiàn)過(guò)程,使用JavaM
8、ail接收郵件的基本系統(tǒng)流程 1、使用session建立會(huì)話 2、使用store建立連接 3、使用folder與制定文件夾建立連接 4、使用message等類(lèi)處理郵件,Presentation by: Emil,本項(xiàng)目中郵件收發(fā)實(shí)現(xiàn)過(guò)程,使用JavaMail發(fā)送郵件的基本系統(tǒng)流程 1、使用session建立會(huì)話 2、使用transport建立通信對(duì)象 3、使用message構(gòu)建郵件 4、使用transport發(fā)送郵件,Presentation by: Emil,本系統(tǒng)組建思路,因?yàn)閷?shí)際上我們的目標(biāo)系統(tǒng)就是郵件服務(wù)器的客戶端,所以他的基本功能得以確定: 1、實(shí)現(xiàn)pop3郵件服務(wù)器的收取與
9、顯示 2、使用smtp郵件服務(wù)器發(fā)送郵件 3、實(shí)現(xiàn)文本郵件與多附件的發(fā)送與接受 4、實(shí)現(xiàn)郵件的刪除功能 仿照 MS Outlook Express功能實(shí)現(xiàn),Presentation by: Emil,系統(tǒng)界面管理,系統(tǒng)主界面寫(xiě)郵件、收郵件、刪除郵件、服務(wù)器參數(shù)預(yù)置、郵件列表、郵件顯示窗口。 新建和發(fā)送郵件界面 服務(wù)器參數(shù)設(shè)定界面pop3和smtp服務(wù)器參數(shù)設(shè)定。 收取附件界面附件列表、保存功能。,Presentation by: Emil,重點(diǎn)功能的實(shí)現(xiàn)技術(shù),JavaMail API如何支持郵件系統(tǒng)開(kāi)發(fā)?,Presentation by: Emil,發(fā)送郵件的類(lèi)和方法,,Presentatio
10、n by: Emil,Properties,JavaMail需要Properties來(lái)創(chuàng)建一個(gè)Session對(duì)象,它將尋找字符串“mail.smtp.host”,屬性值就是發(fā)送郵件的主機(jī)。比如: Properties props = new Properties(); Props.put(“mail.smtp.host”,””);,Presentation by: Emil,Session,Session類(lèi)代表JavaMail中的一個(gè)郵件Session 。每一個(gè)基于Javamail的應(yīng)用程序至少有一個(gè)Session ,但是可以有任意多的Session 。 Session對(duì)象需要知道用來(lái)處理郵件
11、的smtp服務(wù)器。例程: Session sendMialSession; sendMailSession = Session.getInstance(props,null); Session類(lèi)定義了基本的郵件會(huì)話。就像Http會(huì)話那樣,我們進(jìn)行收發(fā)郵件的工作都是基于這個(gè)會(huì)話的。Session對(duì)象利用了java.util.Properties對(duì)象獲得了郵件服務(wù)器、用戶名、密碼信息和整個(gè)應(yīng)用程序都要使用到的共享信息。,Presentation by: Emil,Transport,JavaMail使用了兩個(gè)不同的類(lèi)來(lái)完成這兩個(gè)功能:Transport 和 Store。Transport是用來(lái)
12、發(fā)送信息的,而Store用來(lái)收信。使用Transport 的方法: Tranport transport; transport =sendMailSession.getTransport(“smtp”); 用JavaMail Session的對(duì)象的getTransport方法來(lái)初始化Transport。傳過(guò)去的字符串申明了對(duì)象所要使用的協(xié)議“smtp”,這極大的節(jié)省了我們的時(shí)間。 JavaMail已經(jīng)內(nèi)置了很多協(xié)議的實(shí)現(xiàn)方法。,Presentation by: Emil,Authenticator,Authenticator 像類(lèi)那樣,JavaMail API通過(guò)使用授權(quán)者類(lèi)(Authen
13、ticator)以用戶名、密碼的方式訪問(wèn)那些受到保護(hù)的資源,在這里“資源”就是指郵件服務(wù)器。在javax.mail包中可以找到這個(gè)JavaMail的授權(quán)者類(lèi)(Authenticator)。 在使用Authenticator這個(gè)抽象類(lèi)時(shí),我們必須繼承該抽象類(lèi),并且該繼承類(lèi)必須具有返回PasswordAuthentication對(duì)象(用于存儲(chǔ)認(rèn)證時(shí)要用到的用戶名、密碼)getPasswordAuthentication()方法。并且要在Session中進(jìn)行注冊(cè),使Session能夠了解在認(rèn)證時(shí)該使用哪個(gè)類(lèi)。,Presentation by: Emil,Message,Message對(duì)象存儲(chǔ)我們實(shí)際
14、發(fā)送的電子郵件信息,Message對(duì)象被作為一個(gè)MimeMessage對(duì)象來(lái)創(chuàng)建并且需要知道應(yīng)當(dāng)選擇哪一個(gè)JavaMail Session。 使用方法: Message newMessage = new MimeMesage(sendMailSession);,Presentation by: Emil,接收郵件的類(lèi)和方法,,Presentation by: Emil,Store,建立Session對(duì)象后,就需要使用Store類(lèi)建立與POP或者IMAP服務(wù)器的通信連接,例程: Store store = session.getStore(“pop3”); Store.connect(h
15、ost,username,pwd); Store是抽象類(lèi),它模擬了消息存儲(chǔ)器及其內(nèi)部目錄(Folder)訪問(wèn)協(xié)議,以存儲(chǔ)和讀取消息,由其子類(lèi)提供具體實(shí)現(xiàn)??蛻舫绦蚩梢酝ㄟ^(guò)獲取一個(gè)Store對(duì)象來(lái)訪問(wèn)消息存儲(chǔ)器,以絕大多數(shù)的存儲(chǔ)器要求用戶在訪問(wèn)前提供認(rèn)證信息,connect方法執(zhí)行了該認(rèn)證過(guò)程。與Transport類(lèi)似,也可以指定Store使用協(xié)議。郵件是讀取郵件所以用pop3協(xié)議來(lái)讀取。如: Store store=new Store(“pop3”); 然后認(rèn)證:store.connect(host,username,pwd),Presentation by: Emil,Folder,使用F
16、older類(lèi)與指定的文件夾相連,例程: Folder folder = store.getFolder(“INBOX”); foler.open(Folder.READ_ONLY); Message message=folder.getMessage(); folder.close(true);,Presentation by: Emil,對(duì)本地郵件進(jìn)行處理,先來(lái)了解一下每封郵件的構(gòu)成: 郵件標(biāo)題 郵件體,通常是multipart類(lèi)型 正文,可能是文本,可能是網(wǎng)頁(yè) 附件,多種類(lèi)型的格式 正因?yàn)猷]件格式多數(shù)情況下為嵌套類(lèi)型,面對(duì)單一協(xié)議的非智能處理,可行的辦法就是采用循環(huán)(遞歸)作業(yè)方式對(duì)每一部分郵件內(nèi)容進(jìn)行比對(duì)索取,完成郵件解釋。,Presentation by: Emil,感謝老師的辛勤工作!,,