摘要:闡述了在JSP的應用程序中,實現電子郵件收發的一般原理、方法及具體的程序實現,該郵件應用的特點在于能在應用軟件系統中自動發送和接收電子郵件,該郵件收發系統可掛接在任意JSP應用軟件中,具有一定實用價值。通過實驗驗證,該系統具有通用性。
關鍵詞:JSP; 電子郵件;pop3
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)35-2294-04
The Design and Realization of Email System based on JSP
QIN Chuan1, YANG Zhi-cheng2
(1. Jiangxi Radio and TV University Classes Nanchang City Branch School,Nanchang 330003,China; 2. Jiangxi Modern Colleage,Nanchang 330003,China)
Abstract: This paper introduces a general principle and method of email system in JSP application, and its kernel program is also provided. The outstanding characteristics of this email application is that it can send and accept email automatically in software systems. This email application module can be embedded in any JSP internet applications and with some practical value. This system is testified to be commonly used.
Key words: JSP; Email; POP3
1 引言
電子郵件翻譯自英文的email或e-mail,它表示通過電子通訊系統進行信件的書寫、發送和接收。今天使用的最多的通訊系統是互聯網,同時電子郵件也是互聯網上作受歡迎的功能之一。通過電子郵件系統,您可以用非常低廉的價格(不管發送到哪里,都只需負擔電話費和網費即可),以非??焖俚姆绞剑◣酌腌娭畠瓤梢园l送到世界上任何你指定的目的地),與世界上任何一個角落的網絡用戶聯絡系,這些電子郵件可以是文字、圖像、聲音等各種方式。同時,您可以得到大量免費的新聞、專題郵件,并實現輕松的信息搜索。這是任何傳統的方式也無法相比的。正是由于電子郵件的使用簡易、投遞迅速、收費低廉,易于保存、全球暢通無阻,使得電子郵件被廣泛地應用,它使人們的交流方式得到了極大的改變。
早在互聯網流行以前很久,電子郵件就已經存在了,是在主機-多終端的主從式體系中從一臺計算機終端向另一計算機終端傳送文本信息的相對簡單的方法而發展起來的。經歷了漫長的過程之后,它現在已經演變成為一個更加復雜并豐富得多的系統,可以傳送聲音、圖片、圖像、文檔等多媒體信息,以至于如數據庫或賬目報告等更加專業化的文件都可以電子郵件附件的形式在網上分發?,F在,電子郵件已成為許多商家和組織機構的生命血脈。用戶可以通過電子郵件的討論會進行項目管理,并且有時要根據快速,或洲際的電子郵件信息交換進行重要的決策行動。但毫無疑問的是,互聯網擴展了其應用的范圍。過去只能在其局域網上進行交談的公司現在可以通過網絡與他們的客戶、競爭伙伴和世界上的任何人進行通信和交流。一旦某個組織的電子郵件系統運行在支持TCP/IP協議的網絡上或具有支持兩個互聯網郵件服務協議SMTP(簡單郵件傳輸協議)和POP(郵局協議)之一的互聯網網關,它的郵件用戶就能夠連接到任何具有相似連接的電子郵件地址上了,并且不論其電子郵件賬戶在何處。
2 電子郵件收發系統框架流程
2.1 客戶端的框架流程
圖1為客戶端流程圖。
導航框架頁面除了上面的內容外,還包括顯示總郵件數和未讀郵件數等功能。
2.2 顯示郵件流程
圖2為顯示郵件流程圖。
2.3 創建編輯發送郵件流程
圖3為發送郵件流程圖。
3 登錄POP3服務器上的郵件帳號
Login.jsp提供了用戶登錄POP3服務器的網頁。通過正確的服務器地址和郵件帳號密碼可連接到POP3服務器上的郵件帳號。
連接到POP3服務器代碼如下:
<%
Session mailsession=1;
Store store=1;
String pop3server=1;
String username=1;
String email=1;
String password=1;
String smtpserver=1;
try{
pop3server=(String)request.getParameter(\"pop3server\");
username=(String)request.getParameter(\"username\");
password=(String)request.getParameter(\"password\");
email=(String)request.getParameter(\"email\");
smtpserver=(String)request.getParameter(\"smtpserver\");
Properties props=new Properties();
props.put(\"mail.store.protocol\", \"pop3\");//指定郵件接受協議
// Get a Session object
mailsession = Session.getDefaultInstance(props, 1);
// Get a Store object
store = mailsession.getStore(\"pop3\");
// Connect
store.connect(pop3server,username,password);
System.out.println(\"Connect Successs!\");
}
catch(Exception e)
{
request.setAttribute(\"loginfail\",\"true\");
%>
<%
}
%>
<%
//save information into context
context.setPop3server(pop3server);
context.setUsername(username);
context.setPassword(password);
context.setEmail(email);
context.setSmtpserver(smtpserver);
// save stuff into MUD
mud.setSession(mailsession);
mud.setStore(store);
Folder inbox;
inbox=store.getFolder(\"inbox\");
//Folder inbox=store.getDefaultFolder().getFolder(\"index\");;
inbox.open(Folder.READ_WRITE);
//save draft into MUD
URLName url = new URLName(\"pop3\",pop3server, -1, \"inbox\", username, password);
mud.setURLName(url);
mud.setCurrFolder(inbox);
%>
如果Mail服務器連接失敗,connect.jsp在request對象中設置的loginfail屬性,再把請求轉發給login.jsp,login.jsp將顯示登錄失敗信息,如圖5所示。
4 管理郵件系統
管理郵件實現了對郵件刪除操作。Java Mail API的Message類沒有直接提供刪除郵件的方法,如果要刪除郵件,首先把Message的DELETED標志設為true,然后調用郵件所在郵件夾Folder的expunge方法,該方法刪除郵件夾中所有DELETED標志為true的郵件。
在doDeleteMessge方法中,如果郵件不在Trah郵件夾中,首先把這個郵件在Trash郵件夾中備份,然后把原來郵件的DELETED標志設為true;如果郵件在Trash中,就直接把郵件的DELETED標志設為true。兩種情況下最后都調用待刪除郵件所在郵件夾的expunge方法,該方法能夠刪除郵件夾總所有DELETED標志設為true的郵件。
public void doDeleteMessage(int arrayOpt[],Folder f)throws Exception {
for(int i=0;i if(arrayOpt[i]==0)continue; Message msg=f.getMessage(i+1); if(!f.getName().equals(\"Trash\")){ Message[] m=new Message[1]; m[0]=msg; Folder Trash=store.getFolder(\"Trash\"); f.copyMessages(m,Trash); msg.setFlag(Flags.Flag.DELETED, true); }else{ msg.setFlag(Flags.Flag.DELETED, true); } } f.expunge(); } 以上doDeleteMessage方法的arrayOpt參數用來指定刪除郵件夾中哪些郵件,例如,如果arrayOpt[5]=1,表示需要刪除郵件夾中第5封郵件;如果arrayOpt[5]=0,表示不需要刪除這封郵件。 5 顯示郵件系統 顯示郵件系統通過登錄POP3服務器獲取郵件列表,并顯示總郵件數和未讀郵件數。通過主題連接可以顯示該郵件的詳細信息。該功能能顯示復合郵件。 圖6 顯示郵件列表圖7 顯示郵件內容 顯示復合郵件主要代碼如下: Object content=\"\"; //判斷該郵件類型是否為text or plain if((msg.isMimeType(\"text/plain\")||msg.isMimeType(\"text/html\")) (content!=1)) { text=(String)content; } //判斷該郵件是否為復合郵件 if(msg.isMimeType(\"multipart/*\")) { Multipart mp = (Multipart)content; int cnt = mp.getCount(); for (int i = 0; i < cnt; i++) { text=text+getPart(mp.getBodyPart(i), i, 2,2); } } //顯示復合郵件的主要實現 public String getPart(Part part, int partNum, int msgNum,int x) throws MessagingException,IOException { String s=\"\"; String s1=\"\"; //x參數來確定是以html格式顯示還是以plain String s2=\"\"; String s3=\"\"; String s5=\"\"; String sct = part.getContentType(); if (sct == 1) { s=\"part 無效\"; return s; } ContentType ct = new ContentType(sct); if (ct.match(\"text/html\")||ct.match(\"text/plain\")) { // display text/plain inline s1+=(String)part.getContent(); } else if(partNum!=0) { String temp=\"\"; if ((temp = part.getFileName()) != 1) { s2= \"Filename: \"+temp; } /* out.println(\" HttpUtils.getRequestURL(req) + \"?message=\" + msgNum + \"part=\" + partNum + \"\\\">Display Attachment\"); */ } if(part.isMimeType(\"multipart/alternative\")) { String s6=\"\"; String s7=\"\"; Multipart mp = (Multipart)part.getContent(); int count = mp.getCount(); for (int i = 0; i < count; i++) { if(mp.getBodyPart(i).isMimeType(\"text/plain\")) s7=getPart(mp.getBodyPart(i), i, 3,2); if(mp.getBodyPart(i).isMimeType(\"text/html\")) s6=getPart(mp.getBodyPart(i), i, 3,1); } if(x==1){s5=s6;} if(x==2){s5=s7;} return s5; } s=s1+s2; return s; } 6 創建和發送郵件 Compose.jsp提供了編輯郵件的表單,用戶進入compose.jsp有3個入口: 1) 在框架頁選擇“compose”連接,此時compose.jsp將創建一封新郵件。 2) 在showmessage.jsp中選擇”reply”連接,此時compose.jsp先創建一封回復郵件,再讓用戶編輯這封郵件。 用戶創建郵件的compose.jsp網頁如圖8所示。 圖8 創建郵件頁面圖9 退出頁面 7 退出郵件系統 Logout.jsp負責退出,結束當前Http Session,并且提供了再次登錄的連接,如圖9所示。 調用Store的close方法,將會斷開與接收郵件服務器的連接,以下是logout.jsp的主要代碼: <%if(mud.getStore()==1)throw new Exception(\"The page you visit expires or you do not login yet. Please login again\"); %> <% String username=mud.getURLName().getUsername(); mud.getStore().close(); session.invalidate(); %> 8 關鍵技術及技巧 8.1 靜態網頁設計技巧 1) 精心營造商城氛圍。重視網站整體設計,充分利用色彩、圖形、文字、動畫等多種設計元素,力求給顧客提供溫馨氛圍,具有很強的親和力。在網站整體設計中,比較突出的是網站標志的設計和色彩的運用兩部分。 2) 色彩的運用。色彩是最富視覺沖擊力的設計元素,本系統從自身特點出發,采用紅色系作為網站的色彩基調,深深淺淺的成功地營造出了輕松、親切的環境,讓進入網站的顧客感到神清氣爽,同時也展示了網站清新脫俗的品質。 3) 方便整潔的系統頁面為用戶提供了良好的視覺效果。雖然沒有美麗的外表,但樸實無華的風格給人端莊的感覺。 4) 人性化的設計使得用戶更容易操作。即使以前從未用過電子郵件的用戶幾乎不用學就可以操作。 8.2 CSS樣式 全稱應該是層疊樣式表(Cascacling stylesheets,簡稱CSS),它改變了HTML對頁面布局、字體、顏色、背景和其它文圖效果控制的繁瑣設定,實現更加精確的控制,為網頁編程人員制作、修改。統一網頁的外觀效果的操作,帶來了極大的方便。具備以下的特點和優勢; 只通過修改一個文件就改變頁數不定的網頁的外觀和格式。 在所有瀏覽器和平臺之間的兼容性。 更少的編碼、更少的頁數和更快的下載速度 8.3 程序設計的關鍵技術 郵件服務器按照為用戶提供E-mail發送和接收的服務不同,可以分為發送郵件服務器和接收郵件服務器。發送郵件服務器常用的是SMTP,接收郵件服務器使用接收郵件協議,常用的有POP3協議和IMAP。與POP3協議相比,IMAP為客戶提供了更多的對郵件服務器上郵件的控制權限,如管理郵件和郵件夾等。Java Mail API是Java對電子郵件處理的延伸,它提供和通訊協定無關的 Java解決方案,可以處理各種email格式,包括IMAP、POP、SMTP,以及MI ME,和其他和Internet相關的訊息通訊協定。Javax.mail.Session類定義了一個基本郵件會話,是Java Mail API最高層入口類。所有其他的類都是經由這個Session才得以生效。 該系統采用了WEB的三層結構:WEB客戶通過瀏覽器訪問javamail應用,該應用可以連接客戶請求的某個POP3服務器上的郵件帳號。 參考文獻: [1] 孫衛琴,李洪成.Tomcat與Java Web開發詳解[M].北京:電子工業出版社,2004.283-322. [2] 飛思科技產品研發中心.JSP應用開發詳解(第二版)[M].北京:電子工業出版社,2004. [3] 甘云劍,鄭福基.網頁設計三合一教程:Dreamweaver Fireworks Flash MX 2004中文版[M].北京:清華大學出版社,2005. [4] 錢龍華,錢培德.基于XML結構的電子郵件的表示及其生成[J].計算機工程,2006, 32(8). [5] Java Programming.NIIT高質量計算機教材.2002. [6] Cay S.Horstmann,Gary Cornell.Core Java 2,Volume II,Advanced Features,5E.PH PTR,2003. [7] Bruce Eckel. Thinking in Java, Third Edition. Prentice Hall PTR,2005. [8] Chen Yu-Che,Gant,Jon. Transforming local e-government services: the use of application service providers[J]. Government Information Quarterly,2001,18(4):343-355. [9] Lacity,M.Willcocks,L. An empirical investigation of information technology sourcing practices:lessons from experience[J]. MIS Quarterly,1998,22(3). [10] Frederic J. Cooper, et al. Implementing Internet Security. New Riders Publishing. 1995.