如何使用JSP開發WebMail系統
來源:互聯網
上載者:User
js|web 電子郵件(E-mail)是Internet上使用最廣泛的服務之一,傳統的Email應用模式基於C/S結構,即使用者使用用戶端的郵件收發工具(如Outlook、Foxmail等)與提供郵件服務的伺服器(如163.net、263.net、371.net)通訊,在使用用戶端郵件工具之前,使用者要進行一些必要的設定,如指定郵件伺服器的主機地址和通訊連接埠等,這些工作對剛開始上網的使用者會有一定的困難,如果把E-mail和Web結合在一起,即通過Web編程和適當的系統設定,使使用者僅僅以訪問Web的方式就可以得到和使用完整的郵件服務,這樣將極大地方便上網使用者,這種系統稱為WebMail。WebMail是目前Internet上最受歡迎的服務之一,也是很多網站必備功能之一。另外WebMail同樣也適用於企業或校園網的應用。
通常在後台伺服器的搭建和設定完成後實現WebMail系統,而前台的開發工作主要是開發工具與後台資料庫和郵件伺服器的互動問題。在Linux平台上啟動並執行各種伺服器軟體穩定性和可靠性一直很好,而且選擇跨平台的Java開發工具使系統更穩定,具有更高的伸縮性。
JSP效能
儘管JSP提供強大的功能是建立在Servlet之上,但JSP的效能和Servlet相差無幾。JSP首先要編譯成Servlet,這隻會增加少量的代碼,僅需編譯一次且可以先行編譯,這就消除了運行時花費不必要的負擔。JSP與Servlet效能上的差異僅僅表現在返回的資料是二進位的。這是因為JSP返回時用的是PrintWriter,而Servlet可以應用於速度更快的OutputStream。
JSP自訂的標籤庫可以封裝大量的、複雜的Java操作在一個Form裡面,這些預先定義好的標籤可以很容易的被那些沒有Java知識的人調用。因此,JSP自訂的標籤庫可以有效地實現Java程式員和Web設計人員工作的劃分。然而,在頁面上應用的每一個標籤,Web容器都必須建立一個新的標籤控制代碼對象或從標籤緩衝中提取它。因此,過多的應用自訂的標籤將會帶來不必要的資源浪費。
BodyTags是一種特殊的定製標籤,可以提取在它之間封裝的內容或者替換那些內容。BodyTags之間的內容一般會備份在記憶體中。由於BodyTags之間能夠嵌套和重複,因此,在程式中應用了多級的BodyTags會佔用大量寶貴的記憶體和系統資源。
實現WebMail的主要功能
該系統提供了擷取、閱讀、書寫、轉寄、回複、列印、刪除及使用者管理的功能。考慮到系統的跨平台性,採用Java及相關技術產品為開發工具,特別是採用JSP作為服務程式,這樣對用戶端也沒有其它要求,同時系統的效能在高負荷下得到進一步提高。整個WebMail系統全部採用純Java代碼,伺服器端每響應一個服務要求啟動一個線程,而不像CGI那樣啟動一個進程。這樣能夠節省系統資源,提高系統效能。
實現主要代碼
擷取使用者輸入的資訊
對於使用者輸入內容擷取功能是通過getParameter方法來實現的,對於輸入的常值內容,通過如下代碼就能在伺服器端擷取,程式碼如下:
String username=request.getParameter("login");
String password=request.getParameter("password");
Session session2=Session.getInstance(System.getProperties() ,null);
Store store=session2.getStore("pop3");
根據使用者輸入的資訊來串連伺服器,程式碼如下:
try{
store.connect(host,username+"%nyist.net", password);
}
catch(javax.mail.AuthenticationFailedException e)
{content="使用者名稱與密碼不匹配";}
內送郵件程式碼片段
根據擷取使用者輸入的資訊來串連伺服器,代碼為:
store.connect("nyist.net",-1,request.getParameter("username")+"%nyist.net",request
.getParameter("password"));
擷取伺服器端的資訊,代碼如下:
Folder folder = store.getFolder("INBOX");
Folder.open (Folder.READ_WRITE);
Message message[]=folder.getMessages();
FetchProfile fp=new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
fp.add("X-Mailer");
folder.fetch(message,fp);
根據伺服器上資訊的不同格式,使用不同的方式來讀取:
String contentbody="";
Object o=message[j].getContent();
若其Type為tex/plain就可直接讀出,代碼如下:
if (message[j].isMimeType("text/plain"))
{
contentbody=(String)+"</td>";
StringBuffer buf=new StringBuffer(contentbody.length()+6);
char ch=' ';
for(int p=0;p<contentbody.length();p++)//若遇到換行就轉為<br>
{ch=contentbody.charAt(p);
if(ch=='\n')buf.append("<br>");
else buf.append(ch);
}
contentbody=buf.toString();
}
如果資訊類型為text/html,不同的資訊類型處理的方式稍有不同(如下段代碼),由於篇幅有限不再一一說明。
else if (message[j].isMimeType("text/html"))
contentbody=(String)o+"</td>";
發送郵件程式碼片段
根據使用者輸入的內容,擷取郵件標頭資訊代碼如下:
String host = "nyist.net";
String from = request.getParameter("from");
String to = request.getParameter("to");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
Properties props = System.getProperties();
//設定郵件服務
props.put("mail.smtp.host", host);
Session session2 =Session.getInstance(props, null);
設定郵件標頭資訊代碼如下:
MimeMessage message =new MimeMessage(session2);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
message.setSubject(subject);
message.setSentDate(new Date());
// create the message part
MimeBodyPart messageBodyPart =new MimeBodyPart();
設定郵件內容,構建程式段如下:
messageBodyPart.setText(content);
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
使用者在發送郵件時常常帶有附件,就是將瀏覽器用戶端使用者本地的檔案傳送到POP用戶端,實現代碼如下:
for (int i=0;i<mySmartUpload.getFiles().getCount();i++)
{
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
if (!myFile.isMissing()) {
myFile.saveAs("/upload/" + myFile.getFileName());
count ++;
}
在上傳附件的同時,對上傳檔案的數量進行統計,並通過out.println("上傳了"+count + "個檔案")將其在螢幕上顯示出來。
在發送的信件中如果有附件,使用如下代碼進行發送:
for(int i=0;request.getParameter("file"+i)!=null;i++)
{
messageBodyPart = new MimeBodyPart();
File file=new File("/home/mengyu/ROOT/upload/",request.getParameter("file"+i));
DataSource source =new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(request.getParameter("file"+i));
multipart.addBodyPart(messageBodyPart);
}
// Put parts in message
message.setContent(multipart);
調用Transport的send方法,將構造好MIME Message對象發送出去,代碼如下:
Transport.send(message);
刪除電子郵件程式碼片段
在通過Web介面使用電子郵件過程中,經常要對接收到垃圾郵件或已檢視過的郵件進行刪除,這也是電子郵件中必不可少的一個功能,所以我們設計了Web介面中刪除電子郵件的相應功能,主要程式碼段如下:
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message message[]=folder.getMessages();
String msg[]=request.getParameterValues("msg");
for(int i=0,n=msg.length;i<n;i++)
message[Double.valueOf(msg[i]).intValue()].setFlag(Flags.Flag.DELETED,true);
folder.close(true);
使用者管理
在使用系統啟動並執行過程中,通過管理介面添加使用者,刪除不必要的使用者,修改使用者的密碼,這是程式運行過程中必要的模組,代碼如下:
//添加使用者
Runtime.getRuntime().exec("/home/vpopmail/bin/vadduser"+request.getParameter("user
name")+"@nyist.net "+request.getParameter("passwd"));
//刪除使用者
Runtime.getRuntime().exec("/home/vpopmail/bin/vdeluser"+request.getParameter("user
name")+"@nyist.net");
//修改使用者密碼
Runtime.getRuntime().exec("/home/vpopmail/bin/vpasswd"+request.getParameter("usern
ame")+"@nyist.net "+request.getParameter("passwd"));
總結
Java簡化了企業解決方案的開發、部署和管理等相關的複雜問題,它是物件導向的程式設計語言,同時也是具有平台獨立性、高效能的伺服器端程式設計語言。它提供的標準系統架構和服務適合團體開發,可控制性好,與其它資源的整合性好。採用Java為編程工具開發高效能、高可用性的WebMail伺服器具有非常重要的意義。