基于Javamail的郵件收發(fā)系統(tǒng)(系統(tǒng)+論文+開(kāi)題報(bào)告+任務(wù)書+外文翻譯+文獻(xiàn)綜述+答辯PPT
畢業(yè)設(shè)計(jì)(論文)
(?20 屆)
論文(設(shè)計(jì))題目 基于Javamail的郵件收發(fā)系統(tǒng)
作 者
二級(jí)學(xué)院、專業(yè)
班 級(jí)
指導(dǎo)教師(職稱)
論 文 字 數(shù)
論文完成時(shí)間 20年月日
基于JavaMail的郵件收發(fā)系統(tǒng)
摘 要
電子郵件在當(dāng)今社會(huì)中扮演了一個(gè)很重要的角色。越來(lái)越多的人在使用它。而且用它的人數(shù)勢(shì)必會(huì)繼續(xù)增加。本文介紹了Javamail郵件收發(fā)系統(tǒng)的開(kāi)發(fā)背景,對(duì)國(guó)內(nèi)外現(xiàn)有的多種成熟的電子郵件系統(tǒng)進(jìn)行分析和比較,總結(jié)出它們的優(yōu)缺點(diǎn),對(duì)Javamail技術(shù)進(jìn)行深入研究,提出并設(shè)計(jì)實(shí)現(xiàn)了基于Javamail的郵件收發(fā)系統(tǒng)。本系統(tǒng)利用SMTP協(xié)議和POP協(xié)議從底層進(jìn)行開(kāi)發(fā),利用JavaMail API為收發(fā)郵件提供與協(xié)議無(wú)關(guān)的訪問(wèn)。SMTP(簡(jiǎn)單郵件傳輸協(xié)議)是專門用來(lái)發(fā)送郵件的。POP(郵局協(xié)議)是專門用于接收郵件的。JavaMail API是一種可選的、能用于讀取、編寫和發(fā)送電子消息的標(biāo)準(zhǔn)擴(kuò)展包。
本文主要可分為四個(gè)部分。第一部分介紹了Javamail郵件系統(tǒng)的意義和現(xiàn)狀。第二部分具體介紹了幾種相關(guān)協(xié)議和Javamail API。第三部分主要介紹了系統(tǒng)的開(kāi)發(fā)工具JAVA語(yǔ)言、Eclipse及其安裝過(guò)程與配置方法。第四部分詳細(xì)闡述了Javamail郵件收發(fā)系統(tǒng)的實(shí)現(xiàn)過(guò)程。
關(guān)鍵詞:SMTP,POP,JAVAMAIL,郵件收發(fā)
MAIL SYSTEM BASED ON JAVAMAIL
ABSTRACT
E-Mail play a very important role in modern times. More and more people are using it, and the number of it will larger and larger. This paper introduced the javamail system's development background, analyzed and compared some existing maturity Email system at home and abroad , summarized their advantages and disadvantages, studied deeply with the javamail technology , proposed and designed out the mail system based on javamail. This system used POP protocol and SMTP protocol to develop from the bottom, used JavaMail API to provide the visit which has nothing to do with the agreement for send and receive email. SMTP (Simple Mail Transfer Protocol) is designed to send a message. POP (Post Office Protocol) is designed to receive mail. JavaMail API is an standard expansion package which is optional, can be used to read, write and send electronic messages.
This paper can be divided into four parts. The first part introduced javamail email system's significance and status. The second part introduced several related agreements and JavaMail API. The third part mainly introduced system's development tools JAVA language , Eclipse and their installation process and configuration method. The fourth part detailed javamail email system's realization process.
Keywords:SMTP, POP, JAVAMAIL, Email to send and receive
目 錄
第一章 緒 論11
1.1 電子郵件介紹11
1.2 研究意義11
1.3 研究現(xiàn)狀33
第二章 相關(guān)郵件協(xié)議和JavaMail API5JavaMail API5JavaMail API5
2.1 相關(guān)郵件協(xié)議55
2.2 JavaMail API6JavaMail API6JavaMail API6
2.2.1 JavaMail API簡(jiǎn)介66
2.2.2 JavaMail API核心類66
2.3.3 JavaMail API的應(yīng)用88
第三章 應(yīng)用系統(tǒng)開(kāi)發(fā)工具1111
3.1 Java開(kāi)發(fā)語(yǔ)言簡(jiǎn)介1111
3.2 開(kāi)發(fā)工具Eclipse12Eclipse12Eclipse12
3.3 開(kāi)發(fā)軟件的安裝1212
3.3.1 JAVA環(huán)境的安裝與配置1212
3.3.2 Eclipse的安裝1515
3.3.3 javamail的安裝1515
第四章 JavaMail系統(tǒng)的實(shí)現(xiàn)1616
4.1環(huán)境配置與界面搭建1616
4.2設(shè)置郵件服務(wù)器參數(shù)的實(shí)現(xiàn)1616
4.3 創(chuàng)建與發(fā)送郵件功能的實(shí)現(xiàn)1717
4.3.1 裝載郵件服務(wù)器屬性, 并與其建立連接1717
4.3.2 構(gòu)建郵件1818
4.3.3 創(chuàng)建Transport對(duì)象發(fā)送郵件1919
4.4 接收郵件功能的實(shí)現(xiàn)1919
4.4.1 獲取服務(wù)器信息2020
4.4.2 建立通信連接2020
4.4.3顯示郵件2020
4.5 刪除郵件功能的實(shí)現(xiàn)2222
第五章 結(jié)語(yǔ)2323
參考文獻(xiàn)2424
致 謝2525
第一章 緒 論
本文是一項(xiàng)基于JavaMail的郵件系統(tǒng)的綜合性研究,使用Sun公司提供的JavaMail API實(shí)現(xiàn)電子郵件的發(fā)送、電子郵件的接收等等功能。
1.1 電子郵件介紹
電子郵件(簡(jiǎn)稱E-mai1)又稱電子信箱、電子郵政,它是—種用電子手段提供信息交換的通信方式。它是全球多種網(wǎng)絡(luò)上使用最普遍的一項(xiàng)服務(wù)。這種非交互式的通信,加速了信息的交流及數(shù)據(jù)傳送,它是—個(gè)簡(jiǎn)易、快速的方法。通過(guò)連接全世界的Internet,實(shí)現(xiàn)各類信號(hào)的傳送、接收、存貯等處理,將郵件送到世界的各個(gè)角落。到目前為止,可以說(shuō)電子郵件是Internet資源使用最多的一種服務(wù),E-mai1不只局限于信件的傳遞,還可用來(lái)傳遞文件、聲音及圖形、圖像等不同類型的信息。
電子郵件不是一種“終端到終端”的服務(wù),是被稱為“存貯轉(zhuǎn)發(fā)式”服務(wù)。這正是電子信箱系統(tǒng)的核心,利用存貯轉(zhuǎn)發(fā)可進(jìn)行非實(shí)時(shí)通信,屬異步通信方式[1]。即信件發(fā)送者可隨時(shí)隨地發(fā)送郵件,不要求接收者同時(shí)在場(chǎng),即使對(duì)方現(xiàn)在不在,仍可將郵件立刻送到對(duì)方的信箱內(nèi),且存儲(chǔ)在對(duì)方的電子郵箱中。接收者可在他認(rèn)為方便的時(shí)候讀取信件,不受時(shí)空限制。在這里,“發(fā)送”郵件意味著將郵件放到收件人的信箱中,而“接收”郵件則意味著從自己的信箱中讀取信件,信箱實(shí)際上是由文件管理系統(tǒng)支持的—個(gè)實(shí)體。因?yàn)殡娮余]件是通過(guò)郵件服務(wù)器(mai1 server)來(lái)傳遞檔的。通常mail server是執(zhí)行多任務(wù)操作系統(tǒng)UNIX的計(jì)算機(jī),它提供24小時(shí)的電子郵件服務(wù),用戶只要向 mail server管理人員申請(qǐng)—個(gè)信箱賬號(hào),就可使用這項(xiàng)快速的郵件服務(wù)。
電子郵件的工作原理:
電子郵件系統(tǒng)是一種新型的信息系統(tǒng),是通信技術(shù)和計(jì)算機(jī)技術(shù)結(jié)合的產(chǎn)物。
電子郵件的傳輸是通過(guò)電子郵件簡(jiǎn)單傳輸協(xié)議(Simple Mail Transfer Protocol,簡(jiǎn)稱SMTP)這一系統(tǒng)軟件來(lái)完成的,它是Internet下的一種電子郵件通信協(xié)議。電子郵件的基本原理,是在通信網(wǎng)上設(shè)立“電子信箱系統(tǒng)”,它實(shí)際上是一個(gè)計(jì)算機(jī)系統(tǒng)。系統(tǒng)的硬件是一個(gè)高性能、大容量的計(jì)算機(jī)。硬盤作為信箱的存儲(chǔ)介質(zhì),在硬盤上為用戶分一定的存儲(chǔ)空間作為用戶的“信箱”,每位用戶都有屬于自己的—個(gè)電子信箱。并確定—個(gè)用戶名和用戶可以自己隨意修改的口令。存儲(chǔ)空間包含存放所收信件、編輯信件以及信件存盤三部分空間,用戶使用口令開(kāi)啟自己的信箱,并進(jìn)行發(fā)信、讀信、編輯、轉(zhuǎn)發(fā)、存檔等各種操作,系統(tǒng)功能主要由軟件實(shí)現(xiàn)。
電子郵件的通信是在信箱之間進(jìn)行的。用戶首先開(kāi)啟自己的信箱,然后通過(guò)鍵入命令的方式將需要發(fā)送的郵件發(fā)到對(duì)方的信箱中。郵件在信箱之間進(jìn)行傳遞和交換,也可以與另—個(gè)郵件系統(tǒng)進(jìn)行傳遞和交換。收方在取信時(shí),使用特定賬號(hào)從信箱提取。
1.2 研究意義
隨著社會(huì)的發(fā)展,科技的進(jìn)步,作為信息載體的計(jì)算機(jī)日益顯露出其舉足輕重的地位。當(dāng)今社
會(huì)已步入了信息社會(huì),知識(shí)經(jīng)濟(jì)將成為新世紀(jì)的主導(dǎo)產(chǎn)業(yè)。人們傳統(tǒng)的聯(lián)系方式也在不斷的被改變。伴隨著Internet的發(fā)展,電子郵件以其使用簡(jiǎn)易、投遞迅速、收費(fèi)低廉,易于保存、全球暢通無(wú)阻等等優(yōu)點(diǎn)被廣泛地應(yīng)用,它使人們的交流方式得到了極大的改變。電子郵件已是人們溝通、交流的重要工具。
由于E-mail是當(dāng)今人們交流的重要工具之一,因而,對(duì)E-mail系統(tǒng)的研究也逐漸變的熱起來(lái)?;贘avaMail郵件系統(tǒng)具有快捷、方便的優(yōu)點(diǎn),吸引了眾多的網(wǎng)絡(luò)用戶,使其成為E-mail研究方向的熱點(diǎn)之一。
最初人們?cè)谑褂肊-mail服務(wù)時(shí),必須使用郵件客服端,如:Outlook、Foxmail等軟件,去接收郵件服務(wù)器上的郵件。由于操作系統(tǒng)的不同,往往需要不同的郵件接收客戶端,給人們接收郵件帶來(lái)很大的不便。但是基于JavaMail的郵件系統(tǒng)只要一個(gè)網(wǎng)絡(luò)瀏覽器就可以實(shí)現(xiàn)E-mail的日常收發(fā)功能,而網(wǎng)絡(luò)瀏覽器是任何操作系統(tǒng)中都自帶的軟件,用戶在世界任何一個(gè)角落任何一臺(tái)計(jì)算機(jī)都可以進(jìn)行E-mail的收發(fā)工作。
此外,由于最初用戶接收郵件的設(shè)置信息均保存在客服端,當(dāng)用戶重新安裝操作系統(tǒng)或者更換計(jì)算機(jī)還要重新設(shè)置,而基于JavaMail的郵件收發(fā)系統(tǒng)的設(shè)置保存在郵件服務(wù)器上,不論你更換電腦還是系統(tǒng),收發(fā)郵件的方式都是按照以前的設(shè)置進(jìn)行的,使郵件的收發(fā)更合你的口味。
基于JavaMail的郵件系統(tǒng)讓你不在為機(jī)器配置擔(dān)憂,而且還為用戶的郵件安全分擔(dān)憂愁。
由于最初需要使用客服端軟件收發(fā)軟件,硬件配置低的計(jì)算機(jī)就顯得“愛(ài)莫能助”了。雖然計(jì)算機(jī)的發(fā)展使得硬件問(wèn)題不再是個(gè)問(wèn)題,但是不強(qiáng)調(diào)硬件的配置也是基于JavaMail郵件系統(tǒng)的一個(gè)優(yōu)點(diǎn)之一。此外,由于客戶端軟件維護(hù)和升級(jí)困難,網(wǎng)絡(luò)瀏覽器的更新速度要遠(yuǎn)遠(yuǎn)大于郵件客戶端軟件的更新速度,這就給用戶一個(gè)更安全的環(huán)境。
日前,基于JavaMail郵件系統(tǒng)的發(fā)展越來(lái)越成熟。多線程的設(shè)計(jì)方法,大大的提高了系統(tǒng)的通信效率和成本;采用MVC設(shè)計(jì)模式的郵件系統(tǒng)還大大的減少了系統(tǒng)的維護(hù)量。
當(dāng)然,基于JavaMail的郵件系統(tǒng)缺乏對(duì)動(dòng)態(tài)頁(yè)面的支持能力,沒(méi)有集成有效地?cái)?shù)據(jù)庫(kù)處理功能,也存在系統(tǒng)擴(kuò)展性差、數(shù)據(jù)處理速度稍慢等缺點(diǎn)。但是,這些問(wèn)題已經(jīng)有了很好的起步,將不再是大的問(wèn)題。
電子郵件系統(tǒng)經(jīng)過(guò)幾十年的發(fā)展,已經(jīng)形成了完善的技術(shù)體系。郵件服務(wù)器系統(tǒng)在保留了電子郵件系統(tǒng)最初的收發(fā)郵件、郵件存儲(chǔ)等基本功能的同時(shí),融入了最新的計(jì)算機(jī)與網(wǎng)絡(luò)技術(shù),使電子郵件系統(tǒng)有了全新的改觀 。郵件技術(shù)的發(fā)展趨勢(shì)如下:
Web郵件技術(shù)
隨著中國(guó)Internet應(yīng)用的日益普及和逐步深入,這些數(shù)字仍在不斷增長(zhǎng)。但是對(duì)于電子郵件系統(tǒng)來(lái)說(shuō),單純使用郵件客戶端程序進(jìn)行郵件的收發(fā)已經(jīng)不能滿足用戶移動(dòng)辦公的需要。Web郵件技術(shù)的出現(xiàn),徹底解決了用戶辦公的需要,使得郵件用戶可以在任何地方使用瀏覽器登錄郵件服務(wù)器收發(fā)郵件,而不用配置郵件客戶端程序。多域郵件服務(wù)
所謂多域郵件服務(wù),即是一臺(tái)物理服務(wù)器為多個(gè)獨(dú)立注冊(cè)Internet域名的企業(yè)或單位提供電子郵件的服務(wù),在邏輯上,這些企業(yè)和單位擁有自己獨(dú)立的郵件服務(wù)器,也可以稱為虛擬郵件服務(wù)器技術(shù)。對(duì)于ISP提供商和企業(yè)集團(tuán)公司來(lái)說(shuō),多域郵件服務(wù)器的支持能力是選擇郵件服務(wù)器的一個(gè)重要考慮因素。它可以方便地?cái)U(kuò)展其橫向郵件服務(wù)能力。
(3) Linux郵件服務(wù)器
Linux操作系統(tǒng)作為目前應(yīng)用最為廣泛的開(kāi)源操作系統(tǒng),具有性能穩(wěn)定、可靠性高和價(jià)格低廉的特點(diǎn)。使用Linux作為郵件服務(wù)器,主要是可以與Sendmail、MySQL等開(kāi)源軟件共同使用,在滿足用戶需求的基礎(chǔ)上降低了系統(tǒng)價(jià)格。
(4) 安全防護(hù)
現(xiàn)在的郵件服務(wù)器在安全防護(hù)技術(shù)上有了較大的提高,包括數(shù)據(jù)身份認(rèn)證、傳輸加密、垃圾郵件過(guò)濾、郵件病毒過(guò)濾、安全審計(jì)等的多項(xiàng)安全技術(shù)在郵件服務(wù)器中都得到了很好的應(yīng)用。
(5) 多語(yǔ)言
目前光中文就有若干字符集,如GB-18030、GB-2312、Big5等等,雖然我們可以統(tǒng)一標(biāo)準(zhǔn),但是,在實(shí)際的過(guò)程中,我們不可能統(tǒng)一所有的郵件客戶端,因此我們只能要求郵件服務(wù)器支持多語(yǔ)言的環(huán)境,使“我們的溝通無(wú)障礙”。
(6) 遠(yuǎn)程監(jiān)控和性能調(diào)整
由于目前許多郵件服務(wù)器處于電信托管等方式,不可能經(jīng)常進(jìn)行本地操作,因此目前郵件服務(wù)器均提供了遠(yuǎn)程郵件監(jiān)控的功能。我們可以通過(guò)Web方式,監(jiān)控郵件服務(wù)器的工作狀態(tài),包括在線用戶數(shù)、郵件處理數(shù)量和速度、存儲(chǔ)空間使用率等,并且可以隨時(shí)對(duì)出現(xiàn)的發(fā)信高峰和網(wǎng)絡(luò)攻擊進(jìn)行遠(yuǎn)程處理[2]。
總之,計(jì)算機(jī)的廣泛應(yīng)用,Internet的不斷發(fā)展,E-mail在日常通訊中的地位越來(lái)越重要。雖然傳統(tǒng)的C/S模式的郵件系統(tǒng)仍占有重要地位,但基于JavaMail的郵件收發(fā)系統(tǒng)會(huì)以其快捷、方便的等等優(yōu)點(diǎn)為越來(lái)越多的人所接收,廣泛的應(yīng)用到各個(gè)領(lǐng)域,成為一名后起之秀。
1.3 研究現(xiàn)狀
E-mail是信息化時(shí)代最重要的聯(lián)系工具之一,在日常的工作學(xué)習(xí)中具有非常重要作用。對(duì)E-mail的研究也層出不窮,基于JavaMail郵件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)大多數(shù)都是研究和使用Sun公司提供的JavaMail API去實(shí)現(xiàn)其郵件發(fā)送和接收功能。
電子郵件的研究也存在著以下的問(wèn)題:
Unix式的平臺(tái)
在Unix平臺(tái)下以Sendmail的資格最老,但是由于Unix系統(tǒng)是開(kāi)發(fā)源代碼的,所以導(dǎo)致Sendmail有不少代碼缺陷和漏洞,如有些代碼缺陷可以讓攻擊者遠(yuǎn)程地利用紅帽子或SlackwareLinux軟件的計(jì)算機(jī),APP漏洞,即用sendmail系統(tǒng)的APP漏洞能夠取得root權(quán)限。Winodws式的平臺(tái)
在windows領(lǐng)域種類繁多的郵件服務(wù)器中,微軟的Exchange排在首位,但是它存在著以下問(wèn)題:該系統(tǒng)只能運(yùn)行在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自身安全防范較弱,容易被外界利用來(lái)轉(zhuǎn)發(fā)郵件,甚至冒充內(nèi)部人員發(fā)送垃圾郵件。
Exchange Server維護(hù)困難,擁有成本高,每個(gè)用戶需交納10美元許可費(fèi)。
除了Exchange外,Lotus Notes基本上還是一套OA和工作流系統(tǒng),其郵件功能十分有限。國(guó)內(nèi)用戶反映的問(wèn)題[3]主要有:
郵件系統(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è)用戶的成本是21美元,比Exchange Server還貴。
郵件系統(tǒng)市場(chǎng)是個(gè)剛剛形成的市場(chǎng),格局還有很大的變數(shù)。同時(shí)企業(yè)用戶對(duì)郵件系統(tǒng)產(chǎn)品的各項(xiàng)性能不太熟悉,在對(duì)郵件系統(tǒng)的好壞沒(méi)有很清晰的評(píng)判標(biāo)準(zhǔn)時(shí),往往很注重系統(tǒng)提供商的成功案例,也就是系統(tǒng)提供商的業(yè)界背景。企業(yè)購(gòu)買郵件系統(tǒng)主要是為了提高辦公效率,所以力圖控制成
本。用戶需要更標(biāo)準(zhǔn)的產(chǎn)品以減小整體擁有成本。產(chǎn)品整體化可為企業(yè)維護(hù)降低成本,但需要更容易定制化來(lái)滿足用戶個(gè)性化需求。另外,不同的ISP[4]需要個(gè)性化的標(biāo)志以區(qū)別同類產(chǎn)品,價(jià)格和產(chǎn)品性能同為企業(yè)用戶購(gòu)買時(shí)的重要參照。
電子郵件系統(tǒng)應(yīng)該具備無(wú)限的擴(kuò)展能力,Internet網(wǎng)絡(luò)的一個(gè)特性是變化無(wú)常,我們需要應(yīng)對(duì)隨
時(shí)而來(lái)的應(yīng)用尖峰。因此,我們需要電子郵件系統(tǒng)具有無(wú)限的可擴(kuò)展能力,這個(gè)能力主要體現(xiàn)在郵件的處理能力和郵件的存儲(chǔ)能力上。為了能夠使郵件的處理能力可以無(wú)限擴(kuò)展,就需要引入集群和負(fù)載均衡技術(shù),使應(yīng)用平臺(tái)可以在需要的時(shí)候無(wú)限擴(kuò)充,滿足長(zhǎng)期或臨時(shí)的業(yè)務(wù)需要。為了便于郵件存儲(chǔ),需要高性能的郵件存儲(chǔ)解決方案,最為理想的應(yīng)該是SAN技術(shù)在郵件服務(wù)器領(lǐng)域的應(yīng)用。
總之,電子郵件是一項(xiàng)系統(tǒng)工程,需要網(wǎng)絡(luò)、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)庫(kù)、操作系統(tǒng)等技術(shù)的支持。因此電子郵件系統(tǒng)的每一次技術(shù)革新都是在其他技術(shù)發(fā)展的基礎(chǔ)之上的。
第二章 相關(guān)郵件協(xié)議和JavaMail API
2.1 相關(guān)郵件協(xié)議
郵件的傳送要依賴于具體的傳輸協(xié)議,主要有:SMTP、POP3、MIME。
(1)SMTP:簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地傳送郵件的規(guī)則,或者說(shuō)是由它來(lái)控制信件傳輸?shù)囊环N中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議族,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)郵件時(shí)找到下一個(gè)目的地。通過(guò)SMTP協(xié)議所指定的服務(wù)器,我們就可以把Email寄到收信人的服務(wù)器上了,整個(gè)過(guò)程只需要幾分鐘。SMTP的開(kāi)發(fā)最初是為了在封閉的網(wǎng)絡(luò)中傳送相對(duì)來(lái)說(shuō)不太重要的簡(jiǎn)短信件,而不是為了在互聯(lián)網(wǎng)中傳送重要而敏感的信息,因此最初通過(guò)SMTP傳輸信件時(shí) ,安全性不高。
(2)POP:郵局協(xié)議[5],當(dāng)前的版本為3,也稱作POP3。POP是一種允許用戶從郵件服務(wù)器收發(fā)郵件的協(xié)議,它有兩種版本,即POP2和POP3,都具有簡(jiǎn)單的電子郵件存儲(chǔ)轉(zhuǎn)發(fā)功能。POP2和POP3本質(zhì)上類似,都屬于離線式工作協(xié)議,但是由于使用了不通的協(xié)議端口,兩者并不兼容。與SMTP協(xié)議相結(jié)合,POP3是目前最常用的電子郵件服務(wù)協(xié)議。在離線工作方式下,用戶收發(fā)郵件時(shí),首先通過(guò)POP3客戶程序登錄到支持POP3協(xié)議的郵件服務(wù)器,然后發(fā)送郵件及附件;接著,郵件服務(wù)器為該用戶收存的郵件傳送給POP3客戶程序,并將這些郵件從服務(wù)器上刪除;最后,郵件服務(wù)器將用戶提交的發(fā)送郵件,轉(zhuǎn)發(fā)到運(yùn)行SMTP協(xié)議的計(jì)算機(jī)中,通過(guò)它實(shí)現(xiàn)郵件的最終發(fā)送。在為用戶從郵件服務(wù)器收取郵件時(shí),POP3是以該用戶當(dāng)前存儲(chǔ)在服務(wù)器上全部郵件為對(duì)象進(jìn)行操作的,并一次性將它們下載到用戶端計(jì)算機(jī)中。一旦客戶的郵件下載完畢,郵件服務(wù)器對(duì)這些郵件的暫存托管即告完畢。使用POP3,用戶不能對(duì)他們貯存在郵件服務(wù)器上的郵件進(jìn)行部分傳輸,離線工作方式適合那些從固定計(jì)算機(jī)上收發(fā)郵件的用戶使用。
(3)MIME: 多用途網(wǎng)際郵件擴(kuò)充協(xié)議,是最初的互聯(lián)網(wǎng)電子郵件協(xié)議的一個(gè)擴(kuò)展,說(shuō)明了如何安排消息格式使消息在不同的郵件系統(tǒng)內(nèi)進(jìn)行交換。 MIME 的格式靈活,使人們能使用這一協(xié)議在互聯(lián)網(wǎng)上交換不同類型的數(shù)據(jù)文件:音頻,視頻,圖像,應(yīng)用軟件和其他類型的文件,也包括在最初的協(xié)議—簡(jiǎn)單郵件傳送協(xié)議(SMTP)中的ASCII文本。
(4)IMAP:IMAP使用在接收信息的高級(jí)協(xié)議,目前版本為第4版,所以也被稱為IMAP4。需要注意的是在使用IMAP時(shí),郵件服務(wù)器必須支持該協(xié)議。從這個(gè)方面講,我們并不能完全使用IMAP來(lái)替代POP,不能期待IMAP在任何地方都被支持。假如郵件服務(wù)器支持IMAP,那么我們的郵件程序?qū)⒛軌蚓哂幸韵卤籌MAP所支持的特性[6]:每個(gè)用戶在服務(wù)器上可具有多個(gè)目錄,這些目錄能在多個(gè)用戶之間共享。其與POP相比高級(jí)之處顯而易見(jiàn),但是在嘗試采取IMAP時(shí),我們認(rèn)識(shí)到它并不是十分完美的。由于IMAP需要從其它服務(wù)器上接收新信息,將這些信息遞送給用戶,維護(hù)每個(gè)用戶的多個(gè)目錄,這都為郵件服務(wù)器帶來(lái)了高負(fù)載。并且IMAP與POP的一個(gè)不同之處是POP用戶在接收郵件時(shí)將從郵件服務(wù)器上下載郵件,而IMAP允許用戶直接訪問(wèn)郵件目錄,所以在郵件服務(wù)器進(jìn)行備份作業(yè)時(shí),由于每個(gè)長(zhǎng)期使用此郵件系統(tǒng)的用戶所用的郵件目錄會(huì)占有很大的空間,這將直接導(dǎo)致郵件服務(wù)器上磁盤空間暴漲。
(5)NNTP和其它的第三方協(xié)議:正因?yàn)镴avaMail API在設(shè)計(jì)時(shí)考慮到與第三方協(xié)議實(shí)現(xiàn)提供商之間的分離,故我們可以很容易的添加一些第三方協(xié)議。SUN維護(hù)著一個(gè)第三方協(xié)議實(shí)現(xiàn)提供商的列表:http://java.sun.com/products/javamail/Third_Party.html,通過(guò)此列表我們可以找到所需要的而又不被SUN提供支持的第三方協(xié)議:比如NNTP這個(gè)新聞組協(xié)議和S/MIME這個(gè)安全的MIME協(xié)議。
2.2 JavaMail API
2.2.1 JavaMail API簡(jiǎn)介
JavaMail API是SUN為Java開(kāi)發(fā)者提供對(duì)電子郵件處理的延伸,能用于讀取、編寫和發(fā)送電子消息的包(標(biāo)準(zhǔn)擴(kuò)展)。為管理電子郵件提供了統(tǒng)一的應(yīng)用編程接口,它可以處理各種e-mail格式(包括IMAP、POP、SMTP以及MIME)和其他Internet相關(guān)的訊息通信協(xié)定。
用戶可使用這種包創(chuàng)建郵件用戶代理(Mail User Agent,MUA)類型的程序,它類似于Foxmail、Eudora以及Miceosoft Outlook這些郵件程序。其主要目的不是像發(fā)送郵件或其他郵件傳輸代理(Mail Transfer Agent,MTA)類型的程序那樣用于傳輸、發(fā)送和轉(zhuǎn)發(fā)消息[7]。換句話說(shuō),用戶可以與MUA類型的程序交互,以閱讀和撰寫電子郵件。MUA依靠MTA處理實(shí)際的發(fā)送任務(wù)。
2.2.2 JavaMail API核心類
(1)Session:Session類定義了基本的郵件會(huì)話。就像Http會(huì)話那樣,我們進(jìn)行收發(fā)郵件的工作都是基于這個(gè)會(huì)話的。Session對(duì)象利用了java.util.Properties對(duì)象獲得了郵件服務(wù)器、用戶名、密碼信息和整個(gè)應(yīng)用程序都要使用到的共享信息。
Session類的構(gòu)造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個(gè)靜態(tài)工廠方法獲得一個(gè)默認(rèn)的Session對(duì)象:
Properties props = new Properties();
// fill props with any information
Session session = Session.getDefaultInstance(props, null);
或者使用getInstance()這個(gè)靜態(tài)工廠方法[8]獲得自定義的Session:
Properties props = new Properties();
// fill props with any information
Session session = Session.getInstance(props, null);
從上面的兩個(gè)例子中不難發(fā)現(xiàn),getDefaultInstance()和getInstance()方法的第二個(gè)參數(shù)都是null,這是因?yàn)樵谏厦娴睦又胁](méi)有使用到郵件授權(quán)。在對(duì)mail server進(jìn)行訪問(wèn)的過(guò)程中使用共享的Session是足夠的,即使是工作在多個(gè)用戶郵箱的模式下也不例外。
(2)Message :一旦獲得Session對(duì)象,就可以繼續(xù)創(chuàng)建要發(fā)送的信息,在這里SUN提供了Message類型來(lái)幫助開(kāi)發(fā)者完成這項(xiàng)工作。由于Message是一個(gè)抽象類,大多數(shù)情況下,我們使用javax.mail.internet.MimeMessage這個(gè)子類,該類是使用MIME類型和頭的電子郵件信息。
信息頭只能使用US-ASCII字符,而非ASCII字符將通過(guò)編碼轉(zhuǎn)換為ASCII的方式使用。為了建立一個(gè)MimeMessage對(duì)象,我們必須將Session對(duì)象作為MimeMessage構(gòu)造方法的參數(shù)傳入:
MimeMessage message = new MimeMessage(session);
注意:對(duì)于MimeMessage類來(lái)講存在著多種構(gòu)造方法,比如使用輸入流作為參數(shù)的構(gòu)造方法。
在建立了MimeMessage對(duì)象后,我們需要設(shè)置它的各個(gè)part,對(duì)于MimeMessage類來(lái)說(shuō),這些part就是MimePart接口。最基本的信息內(nèi)容設(shè)置方法就是通過(guò)表示信息內(nèi)容和MIME類型的參數(shù)調(diào)用setContent()方法:message.setContent("Hello", "text/plain")[9];然而,如果我們所使用的MimeMessage中信息內(nèi)容是文本的話,我們便可以直接使用setText()方法來(lái)方便的設(shè)置文本內(nèi)容。message.setText("Hello");前面所講的兩種方法,對(duì)于文本信息,后者更為合適。而對(duì)于其它的一些信息類型,比如HTML信息,則要使用前者。使用setSubject()方法對(duì)郵件設(shè)置郵件主題:message.setSubject("First");
(3)Address:到這里,我們已經(jīng)建立了Session和Message,像Message一樣,Address類也是一個(gè)抽象類,所以我們將使用javax.mail.internet.InternetAddress這個(gè)子類。
通過(guò)傳入代表郵件地址的字符串,我們可以建立一個(gè)郵件地址類:
Address address = new InternetAddress("president@whitehouse.gov");
如果要在郵件地址后面增加名字的話,可以通過(guò)傳遞兩個(gè)參數(shù):代表郵件地址和名字的字符串來(lái)建立一個(gè)具有郵件地址和名字的郵件地址類:
Address address = new InternetAddress("president@whitehouse.gov", "George Bush");
本文在這里所講的郵件地址類是為了設(shè)置郵件信息的發(fā)信人和收信人而準(zhǔn)備的,在建立了郵件地址類后,我們通過(guò)message的setFrom()和setReplyTo()兩種方法設(shè)置郵件的發(fā)信人:
message.setFrom(address);
message.setReplyTo(address);
若在郵件中存在多個(gè)發(fā)信人地址,我們可用addForm()方法增加發(fā)信人:
Address address[] = ...;
message.addFrom(address);
為了設(shè)置收信人,我們使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量來(lái)區(qū)分收信人的類型:
message.addRecipient(type, address)
下面是Message.RecipientType的三個(gè)常量:
Message.RecipientType.TO
http://Message.RecipientType.CC
Message.RecipientType.BCC
因此,如果我們要發(fā)送郵件給總統(tǒng),并發(fā)用一個(gè)副本給第一夫人的話,下面的方法[10]將被用到:
Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);
JavaMail API并沒(méi)有提供檢查郵件地址有效性的機(jī)制。當(dāng)然我們可以自己完成這個(gè)功能:驗(yàn)證郵件地址的字符是否按照RFC822規(guī)定的格式書寫或者通過(guò)DNS服務(wù)器上的MX記錄驗(yàn)證等。
(4)Authenticator: JavaMail API也可以利用Authenticator通過(guò)用戶名和密碼訪問(wèn)受保護(hù)的資源。對(duì)于JavaMail API來(lái)說(shuō),這些資源就是郵件服務(wù)器。JavaMail Authenticator在javax.mail包中,要使用Authenticator,先創(chuàng)建一個(gè)抽象類的子類,并從getPasswordAuthentication()方法中返回PassaordAuthentication實(shí)例。創(chuàng)建完成后,必須向Session注冊(cè)Authenticator。然后,在需要認(rèn)證的時(shí)候,就會(huì)通知Authenticator。
(5)Transport:像http://java.net類那樣,JavaMail API通過(guò)使用授權(quán)者類(Authenticator)以用戶名、密碼的方式訪問(wèn)那些受到保護(hù)的資源,在這里“資源”就是指郵件服務(wù)器。在javax.mail包中可以找到這個(gè)JavaMail的授權(quán)者類(Authenticator)。
在使用Authenticator這個(gè)抽象類時(shí),我們必須采用繼承該抽象類的方式,并且該繼承類必須具有返回PasswordAuthentication對(duì)象(用于存儲(chǔ)認(rèn)證時(shí)要用到的用戶名、密碼)getPasswordAuthentication()方法。并且要在Session中進(jìn)行注冊(cè),使Session能夠了解在認(rèn)證時(shí)該使用哪個(gè)類。
下面代碼片斷中的MyAuthenticator就是一個(gè)Authenticator的子類。
Properties props = new Properties();
// fill props with any information
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
(6)Folder和Store :Store類實(shí)現(xiàn)特定郵件協(xié)議上的讀、寫、監(jiān)視、查找等操作。通過(guò)javax.mail.Store類可以訪問(wèn)javax.mail.Folder類。
Folder類用于分級(jí)組織郵件,并提供javax.mail.Message格式訪問(wèn)e-mail的能力。
2.3.3 JavaMail API的應(yīng)用
(1)閱讀電子郵件
對(duì)于閱讀郵件來(lái)說(shuō),首先要獲取一個(gè)會(huì)話,然后獲取并連接到一個(gè)相應(yīng)的用于您的收件箱的存儲(chǔ)上,接著打開(kāi)相應(yīng)的文件夾,再獲取消息。同時(shí),不要忘記了操作完成后關(guān)閉連接。
步驟如下:
創(chuàng)建一個(gè)Properties 對(duì)象,Session 對(duì)象通過(guò)Properties 對(duì)象來(lái)接受選項(xiàng),在這種情況下,沒(méi)有選項(xiàng),但仍然需要Properties 對(duì)象。
創(chuàng)建Session 對(duì)象,并不直接對(duì)Session 實(shí)例化,而是通過(guò)調(diào)用getDefaultInstance
使用Session.getStore 來(lái)獲取服務(wù)器的POP3存取,也可以指定IMAP。
使用store.connect 來(lái)創(chuàng)建一個(gè)從store 對(duì)象到實(shí)際服務(wù)器上的活連接。
用store.getFolder 找到INBOX(收件箱)文件夾(POP3 存儲(chǔ)里唯一的文件夾),對(duì)IMAP 服務(wù)器而言,可以訪問(wèn)不同的文件夾。用folder.open 以只讀方式打開(kāi)文件夾。
folder.getMessages 獲得一組消息,這個(gè)數(shù)組效率高,因此它僅當(dāng)需要結(jié)果傳輸數(shù)據(jù)。使用JavaMail 獲取郵件,部分關(guān)鍵代碼如下:
public void sendMessage( String host,String from,String to,String content)
throws IOException{
try{
// Get system properties
Properties props = System.getProperties();
// Setup mail server
props.put("mail.smtp.host", host);
// Get session
Session session = Session.getDefaultInstance (props,null);
// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
message.setSubject("Hello JavaMail");
message.setText(content);
// Send message
Transport.send(message);
}
catch(IOException e)
{
e.printStackTrace();
}
}
(2)發(fā)送電子郵件
發(fā)送電子郵件消息涉及到獲取會(huì)話、創(chuàng)建和填充消息并發(fā)送消息這些操作。在獲取Session 時(shí),通過(guò)為要傳遞的Properties 對(duì)象設(shè)置mail.smtp.host屬性來(lái)指定所用的SMTP 服務(wù)器。
(3)轉(zhuǎn)發(fā)電子郵件
轉(zhuǎn)發(fā)消息涉及的內(nèi)容要稍微多一點(diǎn),沒(méi)有一個(gè)專門用于轉(zhuǎn)發(fā)消息的方法,可以通過(guò)處理組成消息的各個(gè)部分來(lái)創(chuàng)建要轉(zhuǎn)發(fā)的消息。一條郵件消息可由多個(gè)部分組成,每一部分是一個(gè)BodyPart(報(bào)文部分),或更特殊一點(diǎn),在操作MIME 消息時(shí)則是MimeBodyPart [11]。不同的報(bào)文部分組合到一個(gè)稱為Multipart 的容器中,或者更特殊一點(diǎn),是一個(gè)MimeMultipart 容器。要轉(zhuǎn)發(fā)消息,用戶需要?jiǎng)?chuàng)建一個(gè)用于消息文本的部分,和用于要轉(zhuǎn)發(fā)的消息的第二個(gè)部分,并將這兩個(gè)部分組合成一個(gè)Multipart(多個(gè)部分)。然后, 可以把這個(gè)Multipart添加到一個(gè)合適的注明地址的消息中并發(fā)送它。
這就是轉(zhuǎn)發(fā)消息的過(guò)程。要把一條消息的內(nèi)容復(fù)制給另一條消息,只需通過(guò)它的ataHandler 類復(fù)制即可,它是出自于JavaBeans Activation Framework的一個(gè)類。
上面著重分析和探討基于JavaMail API 的郵件服務(wù)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)的相關(guān)技術(shù)。為系統(tǒng)實(shí)際開(kāi)發(fā)過(guò)程中充分利用Java 編程語(yǔ)言的開(kāi)放性、平臺(tái)無(wú)關(guān)性等優(yōu)點(diǎn),極大地提高了系統(tǒng)的效率和性能。
第三章 應(yīng)用系統(tǒng)開(kāi)發(fā)工具
本次程序設(shè)計(jì)所采用的開(kāi)發(fā)環(huán)境為:
(1)AMD Athlon(TM),512M內(nèi)存,80G硬盤
(2)Microsoft? Windows? XP Professional
(3)The Eclipse Foundation?Eclipse3.4(Java)
(4)Sun? JDK1.5或以上
運(yùn)行環(huán)境為:
(1)Intel? Pentium? 2及以上處理器,32M以上內(nèi)存,4G以上硬盤
(2)Microsoft? Windows? 9X/NT操作系統(tǒng)
(3)800*600或以上的屏幕分辨率
(4)確保機(jī)器上安裝有JDK 1.5或者以上版本
3.1 Java開(kāi)發(fā)語(yǔ)言簡(jiǎn)介
Java 2是SUN公司推出的新一代面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它是一種簡(jiǎn)單的面向?qū)ο蟮姆植际娇梢浦残阅軆?yōu)異的多線程的動(dòng)態(tài)語(yǔ)言。它具有以下的特點(diǎn):簡(jiǎn)單
Java最初是為了對(duì)家用電器進(jìn)行智能化控制而設(shè)計(jì)的一種語(yǔ)言,因此它特別的簡(jiǎn)單明了。它的簡(jiǎn)單性體現(xiàn)在以下三個(gè)方面[12]:
①Java的編程風(fēng)格類似于C++的風(fēng)格,因此大家都比較熟悉。
②Java中沒(méi)有C++中的指針和內(nèi)存管理的概念,可以避免犯C++中的常見(jiàn)錯(cuò)誤。
③在Java中有豐富的類庫(kù),大大方便了編程工作。面向?qū)ο蟮奶匦?br>面向?qū)ο笮钥梢哉f(shuō)是Java最重要的特性。Java語(yǔ)言的設(shè)計(jì)完全是面向?qū)ο蟮?,它不支持類似于C語(yǔ)言那樣的面向過(guò)程的程序設(shè)計(jì)技術(shù)。Java支持靜態(tài)和動(dòng)態(tài)風(fēng)格的代碼繼承及重用。
分布性
Java有很強(qiáng)的網(wǎng)絡(luò)特性。通過(guò)它特有的類,可以方便地處理TCP/IP協(xié)議和訪問(wèn)網(wǎng)絡(luò)資源。它的分布計(jì)算的特性正是它得以在網(wǎng)絡(luò)時(shí)代風(fēng)靡的重要原因。魯棒性
Java中對(duì)應(yīng)不同的類具有的Exception,正是這些不同的Exception可以防止因?yàn)槌绦騿T的錯(cuò)誤而造成系統(tǒng)的崩潰。安全性
Java不支持指針,因此一切對(duì)內(nèi)存的訪問(wèn)都必須通過(guò)對(duì)象的實(shí)例變量來(lái)進(jìn)行,因此可以有效的
防范病毒的入侵。體系結(jié)構(gòu)中立
Java的解釋器可以生成與系統(tǒng)體系結(jié)構(gòu)無(wú)關(guān)的字節(jié)碼指令,一個(gè)系統(tǒng)只要安裝了Java虛擬機(jī)就可以執(zhí)行Java程序了。多線程性
Java的多線程能夠保證程序的并行執(zhí)行。而且同步機(jī)制保證了對(duì)共享數(shù)據(jù)的正確操作,方便用戶在網(wǎng)絡(luò)上的實(shí)時(shí)交互操作,提高系統(tǒng)的處理能力。動(dòng)態(tài)性
Java的設(shè)計(jì)使它適合于一個(gè)不斷發(fā)展的環(huán)境。在類庫(kù)中可以自由地加入新的方法和實(shí)例變量而不會(huì)影響用戶程序的執(zhí)行,并且Java通過(guò)接口來(lái)支持多重繼承,使之比嚴(yán)格的繼承類具有更靈活的方式和擴(kuò)展性。同時(shí)用戶也可以創(chuàng)建自己的特有的類,以方便操作和提高編程能力。
3.2 開(kāi)發(fā)工具Eclipse
Eclipse:Eclipse 是一個(gè)開(kāi)放源代碼的、基于 Java 的可擴(kuò)展開(kāi)發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過(guò)插件組件構(gòu)建開(kāi)發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括 Java 開(kāi)發(fā)工具(Java Development Tools,JDT)。 Eclipse 還包括插件開(kāi)發(fā)環(huán)境(Plug-in Development Environment,PDE),這個(gè)組件主要針對(duì)希望擴(kuò)展 Eclipse 的軟件開(kāi)發(fā)人員,因?yàn)樗试S他們構(gòu)建與 Eclipse 環(huán)境無(wú)縫集成的工具。
Eclipse是一種通用工具平臺(tái)——普遍適用的開(kāi)放式擴(kuò)展IDE,它提供了功能豐富的開(kāi)發(fā)環(huán)境,允許開(kāi)發(fā)者高效地創(chuàng)建一些能夠無(wú)縫集成到Eclipse平臺(tái)中的工具。Eclipse的體系結(jié)構(gòu)[13]為: 底層為JAVA開(kāi)發(fā)環(huán)境插件(JDT),插件開(kāi)發(fā)環(huán)境(PDE),其他的第三方插件。中層為Eclipse的圖形界面(包括——工作臺(tái),Jface,SWT),核心為工作空間(workspace)和運(yùn)行時(shí)內(nèi)核(runtime)。
Eclipse的設(shè)計(jì)思想是:一切皆為插件。Eclipse的核心是非常小的,其他所有的功能都是以插件的形式附加到這個(gè)Eclipse核心之上。這樣的功能插件包括他的圖形API(稱為SWT/JFace)、JAVA開(kāi)發(fā)環(huán)境插件(JDT)、插件開(kāi)發(fā)環(huán)境(PDE)等。Eclipse還對(duì)這些插件的協(xié)同工作提供了良好的支持,不僅安裝簡(jiǎn)單,而且還可以無(wú)縫結(jié)合。
Eclipse對(duì)這些插件是動(dòng)態(tài)載入動(dòng)態(tài)調(diào)用的。所謂動(dòng)態(tài)就是指,Eclipse啟動(dòng)后要真正用到這個(gè)插件時(shí),它才會(huì)被調(diào)入內(nèi)存,當(dāng)插件不再被使用時(shí),它就會(huì)被在適當(dāng)?shù)臅r(shí)候清除出去。因此即使裝了一大堆插件在Eclipse里,也不必?fù)?dān)心某些不常用的插件白白占著內(nèi)存。
3.3 開(kāi)發(fā)軟件的安裝
3.3.1 JAVA環(huán)境的安裝與配置
在安裝Eclipse之前,需要先安裝JDK(Java Development Kits)。
在JDK安裝完成之后,一般需要設(shè)置計(jì)算機(jī)系統(tǒng)的環(huán)境變量,以便于其它軟件確定JDK的安裝位置。在WindowsXP操作系統(tǒng)環(huán)境,具體操作步驟如下:
1.選擇“開(kāi)始”菜單中的“控制面板”命令,打開(kāi)控制面板窗口,雙擊選擇“系統(tǒng)”,打開(kāi)如圖3-1所示的“系統(tǒng)屬性”對(duì)話框。
2.單擊“系統(tǒng)屬性”對(duì)話框中的“環(huán)境變量”按鈕,進(jìn)入圖3-2所示的“環(huán)境變量”對(duì)話框。在該對(duì)話框中可以設(shè)置只有當(dāng)前用戶登錄時(shí)才有效的用戶變量,也可以設(shè)置該系統(tǒng)的所有用戶登錄時(shí)都有效的系統(tǒng)變量。
3.在“環(huán)境變量”對(duì)話框中單擊“新建”按鈕,在打開(kāi)圖3-3所示的新建系統(tǒng)變量對(duì)話框輸入變量名為JAVA_HOME,其環(huán)境變量的值應(yīng)該設(shè)置為JDK的安裝位置。
4.然后在如圖3-2所示的“環(huán)境變量”對(duì)話框中再次選擇Path環(huán)境變量,將%JAVA_HOME%\bin;添加到對(duì)應(yīng)的變量值后面,注意和前面的值用“;”隔開(kāi)。單擊“確定”按鈕即可完成JDK相關(guān)環(huán)境變量的設(shè)置。
5.在“環(huán)境變量”對(duì)話框中單擊“新建”按鈕,在打開(kāi)圖3-5所示的新建系統(tǒng)變量對(duì)話框中輸入變量名為CLASSPATH,其環(huán)境變量的值設(shè)置為dt.jar和tools.jar的安裝位置。
圖3-1?系統(tǒng)屬性對(duì)話框
圖3-2?環(huán)境變量對(duì)話框
圖3-3 新建系統(tǒng)變量對(duì)話框
圖3-4 系統(tǒng)變量對(duì)話框
圖3-5 新建系統(tǒng)變量對(duì)話框
3.3.2 Eclipse的安裝
Eclipse是開(kāi)放源代碼的項(xiàng)目,可以到http://www.eclipse.org?去免費(fèi)下載Eclipse的最新版本。其中可以選擇下載Eclipse SDK,它包括了Eclipse開(kāi)發(fā)環(huán)境、Java開(kāi)發(fā)環(huán)境、Plug-in開(kāi)發(fā)環(huán)境以及所有源代碼和文檔。
Eclipse在下載完成后,只需要將對(duì)應(yīng)的壓縮包文件Eclipse—SDK-3.4.2-win32.zip解壓縮到指定位置,即可完成安裝。
3.3.3 javamail的安裝
下載javamail.rar后解壓得到兩個(gè)包:mail.jar和activation.jar,把它導(dǎo)入到所建工程的lib目錄下即可。
第四章 JavaMail系統(tǒng)的實(shí)現(xiàn)
Javamail API使郵件的發(fā)送與接收得到大大的簡(jiǎn)化。本文所開(kāi)發(fā)的郵件客戶端程序是在Eclipse
環(huán)境下實(shí)現(xiàn)的。其主要實(shí)現(xiàn)如下基本功能:
(1) 收取并顯示POP3郵件服務(wù)器上指定郵箱的郵件;
(2) 使用SMTP郵件服務(wù)器發(fā)送郵件;
(3) 郵件附件的發(fā)送與接受;
(4) 刪除郵件;
郵件客戶端的功能界面如下圖4-1所示:
圖4-1?系統(tǒng)界面
4.1環(huán)境配置與界面搭建
在Eclipse中創(chuàng)建工程后,首先為工程添加javamail和javabeans ActivationFrame Work開(kāi)發(fā)包,然后使用swing圖形工具包搭建各個(gè)程序界面,并在使用Javamail API的類文件中導(dǎo)入相關(guān)的API包,即在程序的開(kāi)頭添加下面的語(yǔ)句:
import javax.mail.*;
import javax.internet.*;
import javax.activation.*;
4.2設(shè)置郵件服務(wù)器參數(shù)的實(shí)現(xiàn)
用戶在收發(fā)郵件時(shí),需要設(shè)置郵件服務(wù)器主機(jī)、收發(fā)郵件帳戶及密碼等信息。因此系統(tǒng)提供對(duì)上述信息的設(shè)置與存儲(chǔ)的功能,這里,我們采用屬性文件的形式存儲(chǔ)SMTP 和POP3 郵件服務(wù)器屬性設(shè)置。其文件名為smtpPop3.properties,位于工程的根目錄下,可使用java.uitl. Properties 類的setProperty()方法和getProperty() 方法[14]對(duì)屬性文件中的屬性內(nèi)容進(jìn)行存取。本系統(tǒng)smtp Pop3.properties文件的內(nèi)容格式如下:
smtpPop3.pop3host=pop3 郵件服務(wù)器地址(如http://pop3.sina.com.cn?)
smtpPop3.smtphost=smtp 郵件服務(wù)器地址(如http://smtp.sina.com.cn)
smtpPop3.address=收發(fā)郵件帳戶(如xyz@sina.com)
smtpPop3.username=用戶名(如xyz)
smtpPop3.password=密碼(如654321)
圖4-2 POP3與SMTP服務(wù)器屬性設(shè)置
4.3 創(chuàng)建與發(fā)送郵件功能的實(shí)現(xiàn)
發(fā)送郵件的基本過(guò)程為:點(diǎn)擊主界面中的“創(chuàng)建郵件”按鈕后,彈出新郵件編輯窗體,在該窗體中編輯新郵件,選擇郵件附件后,點(diǎn)擊“發(fā)送”按鈕,程序根據(jù)輸入的郵件信息構(gòu)造郵件,并將其發(fā)送。其具體實(shí)現(xiàn)步驟和關(guān)鍵代碼為:
4.3.1 裝載郵件服務(wù)器屬性, 并與其建立連接
用java.uitl.Properties 類的getProperty () 方法從屬性文件smtpPop3.properties中取得smtp 郵件服務(wù)器的地址、用戶帳號(hào)、用戶郵箱地址、密碼信息,創(chuàng)建與SMTP 服務(wù)器連接的Session 會(huì)話。
//裝載服務(wù)器屬性,并與服務(wù)器建立連接 String smtpHost=null,sendAddress=null,userName=null,password=null; Properties p = new Properties(); try {//從文件中讀入相關(guān)的服務(wù)器屬性設(shè)置 FileInputStream fileIn = new FileInputStream("smtp.properties"); p.load(fileIn); smtpHost=p.getProperty("smtp.host"); sendAddress=p.getProperty("smtp.address"); userName=p.getProperty("smtp.username"); password=p.getProperty("smtp.password"); fileIn.close(); //創(chuàng)建與服務(wù)器的對(duì)話 p=new Properties(); p.put("mail.smtp,host",smtpHost); p.put("mail.smtp.auth","true");//設(shè)置身份驗(yàn)證為真,如果發(fā)郵件時(shí)需要身份驗(yàn)證必須設(shè)為真 session=Session.getInstance(p,null); session.setDebug(true); } catch (Exception ex) { System.out.println("裝載服務(wù)器屬性出錯(cuò)!"); ex.printStackTrace(); }
4.3.2 構(gòu)建郵件
獲取收件人地址、抄送人地址、郵件主題、附件等信息構(gòu)建郵件。包括設(shè)置郵件標(biāo)題&發(fā)送時(shí)間,處理郵件正文和附件文件。這里,在構(gòu)建郵件時(shí),對(duì)含有中文字符的附件文件名,進(jìn)行BASE64 [15]編碼,否則,收郵件時(shí)附件名將為亂碼。程序中使用類sun.mism.BASE64Encoder 實(shí)現(xiàn)BASE64 編碼。
//建構(gòu)郵件信息 try{ msg=new MimeMessage(session);//處理郵件頭部 if(!to.equals("")) msg.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); if(!cc.equals("")) msg.addRecipient(Message.RecipientType.BCC,new InternetAddress(cc)); msg.setSubject(subject);//設(shè)置郵件主題 msg.setFrom(new InternetAddress(sendAddress)); msg.setSentDate(new Date());//設(shè)置郵件發(fā)送日期 Multipart mp=new MimeMultipart();//創(chuàng)建用于封裝郵件的Multipart對(duì)象//處理郵件正文 MimeBodyPart mbp1=new MimeBodyPart(); mbp1.setText(contentArea.getText()); mp.addBodyPart(mbp1);//處理郵件附件 MimeBodyPart mbpAttatch; FileDataSource fds; BASE64Encoder enco=new BASE64Encoder(); String sendFileName=""; if(attatchFiles.size()!=0){ for (int i = 0; i < attatchFiles.size(); i++) { mbpAttatch = new MimeBodyPart(); fds = new FileDataSource(attatchFiles.get(i).toString()); mbpAttatch.setDataHandler(new DataHandler(fds));//將文件名進(jìn)行BASE64編碼 sendFileName="=?GB2312?B?"+enco.encode(new String(fds.getName().getBytes(),"gb2312").getBytes("gb2312"))+"?="; mbpAttatch.setFileName(sendFileName); mp.addBodyPart(mbpAttatch); } }//封裝并保存郵件信息 msg.setContent(mp); msg.saveChanges(); }catch(Exception ex){ System.out.println("構(gòu)建郵件出錯(cuò)!"); ex.printStackTrace(); }
4.3.3 創(chuàng)建Transport對(duì)象發(fā)送郵件,界面如圖4-3。
圖4-3 發(fā)送新郵件
try{Transport transport=session.getTransport(“smtp”);transport.connect(smtpHost,userName,password);transport.sendMessage(msg,msg.getAlRecipients());transport.close();System.ou.t.println(“發(fā)送郵件成功!”);}catch(Exception ex){System.out.println(“發(fā)送郵件失敗!”);}
4.4 接收郵件功能的實(shí)現(xiàn)
在點(diǎn)擊“接收郵件”按鈕后,用戶可以收取并閱讀郵件。這時(shí),系統(tǒng)首先從指定接收郵件的服務(wù)器中收取郵件,并將郵件的發(fā)件人、郵件主題以及郵件日期信息以列表形式顯示出來(lái);其次是在該郵件列表中點(diǎn)擊某封郵件時(shí), 可以顯示該郵件的詳細(xì)信息,包括郵件內(nèi)容、附件列表等。其具體實(shí)現(xiàn)步驟和關(guān)鍵代碼如下:
4.4.1 獲取服務(wù)器信息
與發(fā)送郵件時(shí)獲取SMTP 服務(wù)器屬性一樣,接收郵件時(shí)要從smtpPop3.properties 文件中取得Pop3 服務(wù)器信息, 并建立Session 會(huì)話。
4.4.2 建立通信連接
獲取郵件服務(wù)器上的郵件夾,并將其以列表形式顯示,代碼如下[16]:
try{
Store store =session.getStore(“pop3”);
Store.connect(opoHost,userName,password);
Folder folder=store.getFolder(“Inbox”);//取得store中的Folder郵件夾
mailListPanei.model.setFolder(folder);//將郵箱中的郵件顯示在表格中
}catch(Exception ex){System.out.println(“服務(wù)器連接失敗!”);
Return;
}
4.4.3顯示郵件
在郵件顯示列表中點(diǎn)擊某封郵件,根據(jù)該郵件的編號(hào)獲得該郵件并存放在一個(gè)Message 對(duì)象message 中,然后使用Message類所提供的方法將郵件的主題、發(fā)件人、收件人、郵件體、附件信息解析并顯示出來(lái)。如果將這個(gè)郵件顯示在一個(gè)面板viewPanel中,則ViewPanel 類的主要代碼如下。其效果圖如圖4-4。
Class ViewPanel extends Jpanel{Message message = null;// 用來(lái)存放顯示的郵件Vector attachmentFiles = new Vector();//用來(lái)存放郵件所帶的附件列表Vector attachmentInutStream = new Vector();//用來(lái)存放與附件列表對(duì)應(yīng)的附件數(shù)據(jù)流void setMessage(Message message){this.message = message;mailContentArea.setText(“”);//清空郵件內(nèi)容顯示區(qū)域if(message!= null){loadHeader();//本類中的方法,用來(lái)顯示有關(guān)郵件頭信息attachmentFiles.clear();//清空郵件附件列表向量,用來(lái)存放新郵件的附件列表attchmentInputStream.clear();//清空,用來(lái)存放新郵件的所帶附件的數(shù)據(jù)流loadBody(message);//本類中的方法,用來(lái)解釋并顯示郵件內(nèi)容與附件}}loadHeader()方法用來(lái)顯示郵件頭信息,包括郵件的主題、收件人、發(fā)件人。使用Message類getForm()方法、getRecipients()方法和getSubject()方法獲取后并將其顯示出來(lái)。關(guān)鍵代碼如下:String form = message.getForm().toString();//獲取郵件發(fā)件人String subject = message.getSubject();//獲取郵件主題String to = message.getRecipients(Message.RecipentType.TO)[0].toString();//獲取收件人
LoadBody(Part part)方法用來(lái)解釋并顯示郵件內(nèi)容與附件。方法的入口參數(shù)是一個(gè)Part 類型的參數(shù), Part 為一個(gè)接口, Message 類、BodyPart 類等都實(shí)現(xiàn)該方法。調(diào)用方法時(shí)傳入的參數(shù)為一個(gè)Message 對(duì)象。解釋郵件的基本思路為:當(dāng)郵件為Multipart 類型時(shí), 依次取出郵件的各個(gè)部分;如果郵件的某個(gè)部分不為Multipart 類型, 則該部分應(yīng)為正文或附件;此時(shí)再使用getDisposition()方法進(jìn)一步判斷該部分為正文還是附件, 方法返回值為null 時(shí)為正文, 方法返回值為Part.ATTACHMENT 或?yàn)镻art.INLINE 時(shí)為附件。loadBody (Part part) 方法需要用到的類為:javax.mail.internet.MimeBodyPart、javax.activation.FileDataSource、javax.mail.Multipart、javax.mail.MimeMultipart、javax.mail.BodyPart[17]。其中Multipart 類和BodyPart 類是抽象類,MimeMultipart 類和MimeBodyPart 類分別是繼承于Multipart 類和BodyPart 類并支持MIME 的實(shí)現(xiàn)類, 而FileDataSource 是用來(lái)處理附件的類。
圖4-4 接收郵件
圖4-5 保存郵件附件
4.5 刪除郵件功能的實(shí)現(xiàn)
用戶點(diǎn)擊系統(tǒng)主窗體的,刪除郵件-按鈕后,系統(tǒng)將郵件的表格中當(dāng)前被選中的郵件刪除,并刷新郵件顯示表格。其實(shí)現(xiàn)代碼如下:
message[deleIndex].setFlag(Flags.Flag.DELETED,true);
folder.close(true);
folder.open(Folder.READ_WRITE);
message = folder.getMessage();
fireTableDataChanged();//刷新郵件顯示表格數(shù)據(jù)
其中deleteIndex為被選中郵件在郵件列表中的序號(hào),由郵件顯示表格的時(shí)間程序獲得。
上面使用javamail API所實(shí)現(xiàn)的郵件客戶端程序具備了一個(gè)Email收發(fā)系統(tǒng)的基本功能,在此基礎(chǔ)上,可以進(jìn)一步添加其它的功能,比如轉(zhuǎn)發(fā)郵件、回復(fù)郵件等,使其成為一個(gè)功能完善的郵件客戶端系統(tǒng)。
第五章 結(jié)語(yǔ)
本文首先介紹了電子郵件的工作原理,開(kāi)發(fā)背景以及研究現(xiàn)狀,然后介紹了JavaMail郵件系統(tǒng)的開(kāi)發(fā)過(guò)程中所涉及的協(xié)議,并簡(jiǎn)單的介紹了JavaMail API中重要的類和JavaMail開(kāi)發(fā)環(huán)境以及開(kāi)發(fā)語(yǔ)言Java的特點(diǎn)。在系統(tǒng)的設(shè)計(jì)過(guò)程中,由淺入深的實(shí)現(xiàn)了E-mail收發(fā)系統(tǒng)的發(fā)送、接收功能,等基本功能,并最終實(shí)現(xiàn)了各個(gè)子模塊的整合,形成了簡(jiǎn)單的基于JavaMail的郵件收發(fā)系統(tǒng)。在此基礎(chǔ)上,可以進(jìn)一步添加其它的功能,比如轉(zhuǎn)發(fā)郵件、回復(fù)郵件等,使其成為一個(gè)功能完善的郵件客戶系統(tǒng)。
在這次設(shè)計(jì)實(shí)現(xiàn)基于JavaMail郵件系統(tǒng)的過(guò)程中,我學(xué)到了很多的知識(shí)和經(jīng)驗(yàn),為學(xué)習(xí)Java編程提供了一次很好的實(shí)踐的機(jī)會(huì)。在此,謝謝我的指導(dǎo)教師以及學(xué)校的精心安排與指導(dǎo)。
參考文獻(xiàn)
[1]賀文,顧訓(xùn)穰。基于Web的客戶端電子郵件系統(tǒng)的實(shí)現(xiàn)[J]。計(jì)算機(jī)工程與應(yīng)用,2001,(8):56—58。
[2] Java程序設(shè)計(jì)與應(yīng)用開(kāi)發(fā)。於東軍等編著。清華大學(xué)出版社, 2005。
[3]姚伏天,金連甫,潘敏?;诜?wù)器端安全電子郵件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]。計(jì)算機(jī)科學(xué),2004,31(8):35—38。
[4] Java郵件開(kāi)發(fā)詳解。張孝祥。電子工業(yè)出版社,2007。
[5]盧秉亮,王玉湘,許莉?;赪INDOWS環(huán)境POP3協(xié)議郵件接收客戶端的實(shí)現(xiàn)[J]。沈陽(yáng)航空工業(yè)學(xué)院學(xué)報(bào),2006,23(3):27—30。
[6]廖麗嶸?;赩B6.0有安全認(rèn)證的Email客戶端軟件[J]。中山大學(xué)學(xué)報(bào)論叢,2004,24(3):259—261。
[7] Learning Java。Niemeyer, Patrick., Knudsen, Jonathan。O'Reilly, 2000。
[8] Java program design。Cohoon, James P.,Davidson, Jack W。McGraw-Hill Higher Education, 2004。
[9] Thinking in Java。Eckel, Bruce。Prentice Hall, c2000。
[10] Java高級(jí)程序設(shè)計(jì)。王路群主編。中國(guó)水利水電出版社, 2006 。
[11] Java課程設(shè)計(jì)。黃明, 梁旭, 周紹斌編著。電子工業(yè)出版社, 2006。
[12] Java開(kāi)發(fā)與應(yīng)用教程。王吳迪, 趙楓朝等編著。電子工業(yè)出版社, 2006。
[13] Java程序設(shè)計(jì)大學(xué)教程。劉藝等編著。機(jī)械工業(yè)出版社, 2006。
[14]楊寧。使用Java Mail API實(shí)現(xiàn)電子郵件客戶端[J]。晉東南師范??茖W(xué)校學(xué)報(bào),2004,21(2):38—40。
[15] Java數(shù)據(jù)庫(kù)高級(jí)編程寶典。陳天河編著。電子工業(yè)出版社, 2005。
[16] Java語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)。趙海廷主編。武漢大學(xué)出版社, 2005。
[17] 網(wǎng)絡(luò)編程技術(shù)及應(yīng)用。譚獻(xiàn)海等編著。清華大學(xué)出版社, 2006。
致 謝
感謝我的父母和親人,沒(méi)有您們的包容和支持,就不會(huì)有我的今天。
感謝我的導(dǎo)師陶x和x老師,為我們提供豐富的材料,指導(dǎo)我們完成畢業(yè)設(shè)計(jì)。
感謝我的班主任x老師,無(wú)論在學(xué)習(xí)上還是生活上,都給予我莫大鼓勵(lì)和幫助。
感謝CSDN技術(shù)論壇的人們,幫我解決了很多技術(shù)性的難題。
感謝621的全體室友們,我們一起走過(guò)的日子,我感覺(jué)充實(shí)又快樂(lè)。
感謝我在xx大學(xué)的四年里,所經(jīng)歷的一切,無(wú)論我走到哪里,我都會(huì)記得這是我生命中不可或缺的記憶。