李現(xiàn)全蔣 華,2孔黎明
電子郵件系統(tǒng)關鍵技術及協(xié)議研究
李現(xiàn)全1蔣 華1,2孔黎明1
1.北京電子科技學院,北京 100070; 2.西安電子科技大學,西安 710071
隨著互聯(lián)網(wǎng)技術的發(fā)展,電子郵件作為企業(yè)開發(fā)重要組件,是企業(yè)組織內(nèi)部人員進行信息交流的重要手段之一。開發(fā)郵件系統(tǒng)需要研究相關郵件傳輸協(xié)議,如SMTP、POP3、IMAP等。本文利用Javamail作為目前流行的郵件系統(tǒng)開發(fā)技術,研究和開發(fā)了一種郵件系統(tǒng),并給出實例分析。
電子郵件;Javamail;SMTP;POP3;IMAP
隨著互聯(lián)網(wǎng)及辦公自動的快速發(fā)展,電子郵件已經(jīng)成為政府機關、企事業(yè)單位內(nèi)部信息交流的重要手段之一。在日常生活中人們發(fā)送電子郵件主要通過特定的郵件管理軟件如Outlook Express和FoxMail等實現(xiàn)。還有一種就是通過網(wǎng)頁訪問郵件服務器發(fā)送接收郵件。這兩種方式都可以簡單方便的發(fā)送接收郵件。本文主要探討開發(fā)專有的郵件系統(tǒng),使其既可以作為單獨系統(tǒng)用于郵件發(fā)送與接收,又可以作為其他企業(yè)應用的重要組件。開發(fā)一個郵件系統(tǒng)需要對其關鍵技術及協(xié)議做深入研究。Javamail作為目前主流的郵件系統(tǒng)開發(fā)技術,已經(jīng)得到業(yè)界認可。郵件傳輸協(xié)議主要有SMTP協(xié)議、POP3協(xié)議和IMAP協(xié)議。在開發(fā)系統(tǒng)之前,有必要對所需技術和協(xié)議做深入研究,掌握電子郵件系統(tǒng)開發(fā)API,熟悉郵件發(fā)送及傳輸流程,了解郵件格式。
1.1 Javamail技術介紹
Javamail是Sun公司為方便Java開發(fā)人員在應用程序中實現(xiàn)郵件發(fā)送和接收功能而提供的一套標準開發(fā)包,不同的廠商可以提供自己的實現(xiàn)類,它支持一些常用的郵件協(xié)議,如SMTP、POP3、IMAP等。
1.2 Javamail API介紹
Session類:Session類主要用于配置整個應用程序所需的環(huán)境信息,主要體現(xiàn)在兩方面:一方面通過Properties對象設置郵件服務器的主機名、端口號、采用的郵件發(fā)送和接收協(xié)議等屬性信息和網(wǎng)絡連接的會話信息;另一方面初始化Javamail環(huán)境。Session對象根據(jù)這些信息構建用于郵件收發(fā)的Transport和Store對象,以及為客戶端創(chuàng)建Message對象時提供信息支持。
Javamail API按其功能劃分通??煞譃槿缦氯箢悾鐖D1所示。
(1)創(chuàng)建和解析郵件內(nèi)容的API:Message抽象類是創(chuàng)建和解析郵件的核心,其實現(xiàn)類MimeMessage能夠解析MIME類型、MIME頭信息,最終的封裝對象代表一封電子郵件。
(2)發(fā)送郵件的API:Transport類是發(fā)送郵件的核心API類,它的實例對象代表實現(xiàn)了某個郵件發(fā)送協(xié)議的郵件發(fā)送對象,通過屬性mail.transport.protocol指定傳輸協(xié)議,默認為 SMTP協(xié)議。
(3)接收郵件的API:Store類是接收郵件的核心API類,它的實例對象代表實現(xiàn)了某個郵件接收協(xié)議的郵件接收對象,通過屬性mail.store.protocol指定存儲郵件協(xié)議默認為POP3協(xié)議。Store類能夠實現(xiàn)特定郵件協(xié)議上的讀、寫、監(jiān)視、查找等操作。用戶認證的 API: Authenticatior類是郵件認證的核心API類,它的實例對象代表實現(xiàn)了某個郵件認證對象,通過用戶名和密碼訪問受保護的資源。
1.3 JAF框架介紹
JAF(JavaBeans Activation Framework,JavaBeans激活框架)是目前互聯(lián)網(wǎng)常用的處理郵件數(shù)據(jù)的數(shù)據(jù)處理框架,通過封裝數(shù)據(jù)對外暴露接口方便其他應用程序調(diào)用。經(jīng)過JAF框架處理過的數(shù)據(jù)可以方便應用程序對其進行查看、編輯等操作。對于通過JAF封裝的數(shù)據(jù),應用程序通過JAF提供的接口可以完成如下功能:訪問數(shù)據(jù)源中的數(shù)據(jù)、獲知數(shù)據(jù)源的數(shù)據(jù)類型、獲知可對數(shù)據(jù)進行的各種操作、用戶對數(shù)據(jù)執(zhí)行某種操作時,自動創(chuàng)建執(zhí)行該操作的軟件部件的實例對象Javamail API可以利用JAF從某種數(shù)據(jù)源中讀取數(shù)據(jù)和獲知數(shù)據(jù)的MIME類型,并用這些數(shù)據(jù)生成MIME消息中的消息體和消息類型。
盡管Javamail API與郵件協(xié)議無關,在這里還需要深入研究相關郵件協(xié)議。目前郵件系統(tǒng)傳輸協(xié)議主要有SMTP協(xié)議、POP協(xié)議、IMAP協(xié)議及MIME協(xié)議,下面將對這四個協(xié)議做具體分析:
SMTP簡單郵件傳輸協(xié)議(Simple Mail Transfer Protocol)由RFC 821定義用于發(fā)送電子郵件的機制。在 Javamail API環(huán)境下,基于SMTP服務器通信,經(jīng)過SMTP服務器周轉,用戶最終經(jīng)由 POP(Post Office Protocol)或 IMAP (Internet Message Access Protocol)服務 獲得信息。由于支持身份驗證,不需要SMTP服務器是一種開放的轉發(fā)器,但需要確保SMTP服務器配置正確。目前Javamail API中并不支持配置服務器來中繼消息或添加刪除郵件賬號等功能。
POP代表郵局協(xié)議是由RFC 1939定義用來接收郵件的機制協(xié)議。雖然POP作為互聯(lián)網(wǎng)接受郵件的協(xié)議得到大規(guī)模應用,但本身也存在一些缺陷,例如不具有實時更新以及計算功能。當采用Javamail實現(xiàn)郵件服務時,需要自己添加這些功能。
IMAP是RFC 2060定義的更高級的用于接收消息的協(xié)議。IMAP代表因特網(wǎng)消息訪問協(xié)議,在使用到IMAP時,郵件服務器必需支持這個協(xié)議。POP協(xié)議和IMAP在某些方面并不完全兼容。基于Javamail的程序就可訪問在服務器上擁有的多個文件夾,并且這些文件夾可以被多個用戶共享。
MIME (Multipurpose Internet Mail Extensions)代表多用途因特網(wǎng)郵件擴展標準。雖然不是郵件傳輸協(xié)議,但對傳輸內(nèi)容的消息、附件及其它的內(nèi)容定義了格式。主要有RFC 822、RFC 2045、RFC 2046和RFC 2047。郵件傳輸過程如圖2所示。
(1)郵件發(fā)送
發(fā)送電子郵件消息這一過程包括獲取一個會話,創(chuàng)建并填充一則消息,然后發(fā)送。首先創(chuàng)建一個Properties對象,存放郵件服務器的信息,生成Session對象,從這個 session中創(chuàng)建一條Message,給這條Message設定From TO CC BCC和Subject,用Transport.send()發(fā)送郵件。
(2)郵件內(nèi)容讀取
為讀郵件,首先創(chuàng)建一個Properties對象,存放郵件服務器的信息,給Properties對象賦值,生成Session對象,從這個session中創(chuàng)建Store,從Store中獲取Folder,從Folder中讀取郵件內(nèi)容。
(3)郵件回復
Message類引入一個reply()方法來配置一個新Message,包括正確的recipient(收件人)和添加“Re”(如果沒有就添加)的正確的subject。這樣做并沒有為消息添加新內(nèi)容,僅僅將 from或reply-to(被回復人)頭復制給新的收件人。這種方法用一個 boolean參數(shù)指定消息只回復給發(fā)件人(false)或回復給全體(true)。
(4)郵件轉發(fā)
轉發(fā)消息首先要分析郵件消息組成部分,通常消息格式是 MIME格式,消息是一般由BodyPart組成,特殊情況下是由MimeBodyPart組成。不同的body part(信體部件或正文部件)結合成一個容器,命名 Multipart,還有的是MimeMultipart。要轉發(fā)一條消息,先創(chuàng)建消息正文然后加入要轉發(fā)消息組成一個Multipart(多部件),最后按照地址發(fā)送即可。
(5)郵件附件處理
附件是郵件消息的相關資源,如通常不包含在消息正文里文本文件、電子表格或圖像等。發(fā)送附件非常像轉發(fā)消息。建立各部分以組成完整消息。完成第一部件,即消息正文后,添加其它部件,其中每個DataHandler都代表附件,而不是轉發(fā)消息情況下的共享處理程序。如果從文件中讀附件,附件的數(shù)據(jù)源是 FileDataSource。而如果從 URL中讀時,附件的數(shù)據(jù)源是URLDataSource。一旦存在DataSource,只要先把它傳遞給 DataHandler構造器,最后再用setDataHandler()把它附加到BodyPart。假定您要保留附件的原始文件名,最終要做的是用BodyPart的setFileName()方法設置與附件相關的文件名。
4.1 使用Javamail技術發(fā)送一封簡單郵件
(1)創(chuàng)建包含郵件服務器的網(wǎng)絡連接信息的session對象
Session session = Session. getInstance (Properties props);
(2)創(chuàng)建包含郵件內(nèi)容的Message對象Message msg=new MimeMessage(session); (3)創(chuàng)建Transport對象、連接服務器、發(fā)送Message、關閉連接。
Msg.send();
4.2 發(fā)送復雜郵件
(1)復雜郵件的開發(fā)實例分析
消息的類型采用 MimeMessage msg=new MimeMessage(session);Mail Extensions多功能Internet郵件擴充服務,它是一種多用途網(wǎng)際郵件擴充協(xié),能夠支持非ASCII字符、二進制格式附件等多種格式的郵件消息。Message中的方法:
1.msg.setFrom();設置發(fā)件人
2.msg.setSubject();設置郵件主題
3.msg.setRecipients();設置收件人
4.msg.setReplyTo(Adress[]);設置回復郵件的地址
5.“sina”<sina@sina.com>;收件人、發(fā)件人友好顯現(xiàn)方式
6.InternetAddress.parse(String s);將字符串轉換成InternetAddress類型的數(shù)組
(2)設置復雜郵件
1.設置郵件類型
MimeMultipart msgMultipart = new MimeMultipart(“mixed”);混合模式
2.設置消息文本
msg.setContent(msgMultipart);設置消息為混合類型的正文
3.設置混合文本的組成部分
MimeBodyPart attch1=new MimeBodyPart ();第一個附件
MimeBodyPart attch2=new MimeBodyPart ();第二個附件
MimeBodyPart content=new MimeBodyPart ();正文部分
msgMultipart.a(chǎn)ddBodyPart(attch1);將附件添加到混合文本中去
msgMultipart.a(chǎn)ddBodyPart(attch2);
msgMultipart.a(chǎn)ddBodyPart(content);
4.附件的初始化
DataSource ds2=new FileDataSource(“文件路徑”);
DataHandler dh2=new DataHandler(ds2);
attch2.setDataHandler(dh2);將附件包裝成DataHandler對象
attch2.setFileName("slogo.gif");設置附件的名稱
5.Html類型的正文的初始化
MimeMultipart bodyMultipart = new MimeMultipart(“related”);設置文本為依賴注入關系
content.setContent(bodyMultipart);設置正文為bodyMultipart
MimeBodyPart htmlPart=new MimeBodyPart ();設置html文本部分
MimeBodyPart gifPart=new MimeBodyPart ();設置圖片部分
bodyMultipart.a(chǎn)ddBodyPart(htmlPart);
bodyMultipart.a(chǎn)ddBodyPart(gifPart);
html文本部分初始化:
htmlPart.setContent("html文本部分 <img src='http://www.itcast.cn/logo.gif'>",
"text/html;charset=gbk");
圖片部分初始化:
DataSource gifds=new FileDataSource(“圖片路徑”);
DataHandler gifdh = new DataHandler (gifds);
gifPart.setDataHandler(gifdh);
gifPart.setHeader("Content-Location"," http://www.itcast.cn/logo.gif");設置圖片代表正文中的那個位置
6.保存信息的修改
msg.saveChanges();保存復雜文本
7.中文編碼
MimeUtility.encodeText(“中文”);
開發(fā)一個性能優(yōu)良的郵件系統(tǒng),需要了解郵件系統(tǒng)開發(fā)所需要的技術和郵件傳輸過程中所涉及到的協(xié)議。Javamail作為當今郵件系統(tǒng)開發(fā)主流技術,是郵件系統(tǒng)開發(fā)的關鍵,本文重點分析了API用法以及如何與特定的協(xié)議融合。
[1]張孝祥,方立勛.Java郵件開發(fā)詳解[M].北京:電子工業(yè)出版社,2007.
[2]李揚.安全增強電子郵件系統(tǒng)安全性分析[J].保密科學技術,2014(2):20-30.
[3]楊清蘭.電子郵件定題信息服務的安全策略[J].內(nèi)蒙古科技與經(jīng)濟,2014(4):44-57.
[4]楊旭士.基于James技術的企業(yè)電子郵件系統(tǒng)設計與實現(xiàn)[J].計算機與現(xiàn)代化,2011 (4):61-63.
[5]鐘路,劉玲,夏紅霞.基于Java Mail API的Web郵件系統(tǒng)開發(fā)[J].武漢理工大學學報,2006,28(6):84-86.
[6]孫衛(wèi)琴,李洪成.Tomcat與Java Web開發(fā)技術詳解[M].北京:電子工業(yè)出版社,2004.
[7]邱林,張凌.基于B/S三層結構的電子郵件解決方案明[J].計算機工程,2003,29 (19):158-159.
[8]屈培,劉莉,葛蓁.基于JavaMail的電子郵件群發(fā)[J].電腦知識與技術(學術交流),2007,3(17):1285-1286.
[9]鐘忺,劉春燕.基于JavaMail API的郵件認證與接受[J].計算機與數(shù)字工程,2007,35 (3):145-147.
[10]王勇,陳楠.基于Java語言的電子郵件系統(tǒng)的實現(xiàn)[J].現(xiàn)代電子技術,2004(9):26-30.
Key Techniques and Protocols of E-mail System
Li Xianquan1Jiang Hua1,2Kong Liming1
1.Beijing Electronic Science and Technology Institute,Beijing 100070,China; 2.Xi’dian University,Xi’an Shaanxi710071,China
With the development of Internet technology,as an important component of corporate development,e-mail is an important means of information within the organization personnel exchanges.It is also need to study related mail transfer protocols,such as SMTP,POP3,IMAP to develop mail system.As the most popular e-mail systems development technology,Javamail is the preferred mail system development.
e-mail;Javamail;SMTP;POP3;IMAP
TP393.08
A
1672-464X(2016)2-26-05
(責任編輯:鞠 磊)
本論文受“基本科研業(yè)務費(項目號:2015CL-LXQ)”
** 作者簡介:李現(xiàn)全(1990—),男,北京電子科技學院;專業(yè):電子與通信工程;學歷:工程碩士。