細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

          如何使用JSP開發(fā)WebMail系統(tǒng)

           

          電子郵件(E-mail)是Internet上使用最廣泛的服務(wù)之一,傳統(tǒng)的Email應(yīng)用模式基于C/S結(jié)構(gòu),即用戶使用客戶端的郵件收發(fā)工具(如Outlook、Foxmail等)與提供郵件服務(wù)的服務(wù)器(如163.net、263.net、371.net)通信,在使用客戶端郵件工具之前,用戶要進行一些必要的設(shè)置,如指定郵件服務(wù)器的主機地址和通信端口等,這些工作對剛開始上網(wǎng)的用戶會有一定的困難,如果把E-mail和Web結(jié)合在一起,即通過Web編程和適當(dāng)?shù)南到y(tǒng)設(shè)置,使用戶僅僅以訪問Web的方式就可以得到和使用完整的郵件服務(wù),這樣將極大地方便上網(wǎng)用戶,這種系統(tǒng)稱為WebMail。WebMail是目前Internet上最受歡迎的服務(wù)之一,也是很多網(wǎng)站必備功能之一。另外WebMail同樣也適用于企業(yè)或校園網(wǎng)的應(yīng)用。

          通常在后臺服務(wù)器的搭建和設(shè)置完成后實現(xiàn)WebMail系統(tǒng),而前臺的開發(fā)工作主要是開發(fā)工具與后臺數(shù)據(jù)庫和郵件服務(wù)器的交互問題。在Linux平臺上運行的各種服務(wù)器軟件穩(wěn)定性和可靠性一直很好,而且選擇跨平臺的Java開發(fā)工具使系統(tǒng)更穩(wěn)定,具有更高的伸縮性。


          JSP性能


          盡管JSP提供強大的功能是建立在Servlet之上,但JSP的性能和Servlet相差無幾。JSP首先要編譯成Servlet,這只會增加少量的代碼,僅需編譯一次且可以預(yù)編譯,這就消除了運行時花費不必要的負擔(dān)。JSP與Servlet性能上的差異僅僅表現(xiàn)在返回的數(shù)據(jù)是二進制的。這是因為JSP返回時用的是PrintWriter,而Servlet可以應(yīng)用于速度更快的OutputStream。

          JSP自定義的標(biāo)簽庫可以封裝大量的、復(fù)雜的Java操作在一個Form里面,這些預(yù)先定義好的標(biāo)簽可以很容易的被那些沒有Java知識的人調(diào)用。因此,JSP自定義的標(biāo)簽庫可以有效地實現(xiàn)Java程序員和Web設(shè)計人員工作的劃分。然而,在頁面上應(yīng)用的每一個標(biāo)簽,Web容器都必須創(chuàng)建一個新的標(biāo)簽句柄對象或從標(biāo)簽緩沖中提取它。因此,過多的應(yīng)用自定義的標(biāo)簽將會帶來不必要的資源浪費。

          BodyTags是一種特殊的定制標(biāo)簽,可以提取在它之間封裝的內(nèi)容或者替換那些內(nèi)容。BodyTags之間的內(nèi)容一般會備份在內(nèi)存中。由于BodyTags之間能夠嵌套和重復(fù),因此,在程序中應(yīng)用了多級的BodyTags會占用大量寶貴的內(nèi)存和系統(tǒng)資源。


          實現(xiàn)WebMail的主要功能


          該系統(tǒng)提供了獲取、閱讀、書寫、轉(zhuǎn)發(fā)、回復(fù)、打印、刪除及用戶管理的功能。考慮到系統(tǒng)的跨平臺性,采用Java及相關(guān)技術(shù)產(chǎn)品為開發(fā)工具,特別是采用JSP作為服務(wù)程序,這樣對客戶端也沒有其它要求,同時系統(tǒng)的性能在高負荷下得到進一步提高。整個WebMail系統(tǒng)全部采用純Java代碼,服務(wù)器端每響應(yīng)一個服務(wù)請求啟動一個線程,而不像CGI那樣啟動一個進程。這樣能夠節(jié)省系統(tǒng)資源,提高系統(tǒng)性能。


          實現(xiàn)主要代碼


          獲取用戶輸入的信息

          對于用戶輸入內(nèi)容獲取功能是通過getParameter方法來實現(xiàn)的,對于輸入的文本內(nèi)容,通過如下代碼就能在服務(wù)器端獲取,程序代碼如下:


          String username=request.getParameter("login");
          String password=request.getParameter("password");
          Session session2=Session.getInstance(System.getProperties() ,null);
          Store store=session2.getStore("pop3");

           


          根據(jù)用戶輸入的信息來連接服務(wù)器,程序代碼如下:


          try{
           store.connect(host,username+"%nyist.net", password);
          }
          catch(javax.mail.AuthenticationFailedException e)
          {content="用戶名與密碼不匹配";}

           


          接收郵件代碼段

          根據(jù)獲取用戶輸入的信息來連接服務(wù)器,代碼為:


          store.connect("nyist.net",-1,request.getParameter("username")+"%nyist.net",request
          .getParameter("password"));

           


          獲取服務(wù)器端的信息,代碼如下:


          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);

           


          根據(jù)服務(wù)器上信息的不同格式,使用不同的方式來讀取:


          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++)//若遇到換行就轉(zhuǎn)為<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>";

           


          發(fā)送郵件代碼段

          根據(jù)用戶輸入的內(nèi)容,獲取郵件頭信息代碼如下:


          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();
          //設(shè)置郵件服務(wù)
          props.put("mail.smtp.host", host);
          Session session2 =Session.getInstance(props, null);

           


          設(shè)置郵件頭信息代碼如下:


          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();

           


          設(shè)置郵件內(nèi)容,構(gòu)建程序段如下:


          messageBodyPart.setText(content);
          Multipart multipart = new MimeMultipart();
          multipart.addBodyPart(messageBodyPart);

           


          用戶在發(fā)送郵件時常常帶有附件,就是將瀏覽器客戶端用戶本地的文件傳送到POP客戶端,實現(xiàn)代碼如下:


          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 ++;
          }

           


          在上傳附件的同時,對上傳文件的數(shù)量進行統(tǒng)計,并通過out.println("上傳了"+count + "個文件")將其在屏幕上顯示出來。

          在發(fā)送的信件中如果有附件,使用如下代碼進行發(fā)送:


          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);

           


          調(diào)用Transport的send方法,將構(gòu)造好MIME Message對象發(fā)送出去,代碼如下:


          Transport.send(message);

           


          刪除電子郵件代碼段

          在通過Web界面使用電子郵件過程中,經(jīng)常要對接收到垃圾郵件或已查看過的郵件進行刪除,這也是電子郵件中必不可少的一個功能,所以我們設(shè)計了Web界面中刪除電子郵件的相應(yīng)功能,主要程序代碼段如下:


          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);

           


          用戶管理

          在使用系統(tǒng)運行的過程中,通過管理界面添加用戶,刪除不必要的用戶,修改用戶的密碼,這是程序運行過程中必要的模塊,代碼如下:


          //添加用戶
          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"));

           總結(jié)
          Java簡化了企業(yè)解決方案的開發(fā)、部署和管理等相關(guān)的復(fù)雜問題,它是面向?qū)ο蟮木幊陶Z言,同時也是具有平臺獨立性、高性能的服務(wù)器端編程語言。它提供的標(biāo)準(zhǔn)系統(tǒng)框架和服務(wù)適合團體開發(fā),可控制性好,與其它資源的集成性好。采用Java為編程工具開發(fā)高性能、高可用性的WebMail服務(wù)器具有非常重要的意義。

          posted on 2007-05-06 12:32 張金鵬 閱讀(128) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 蓝田县| 武城县| 志丹县| 呼伦贝尔市| 高邑县| 西昌市| 四平市| 瑞金市| 育儿| 克山县| 龙川县| 钦州市| 曲水县| 喀喇| 五台县| 新建县| 杭州市| 富裕县| 肃宁县| 徐水县| 安康市| 平阴县| 内乡县| 绩溪县| 北京市| 东明县| 五大连池市| 凯里市| 泉州市| 宁陕县| 牙克石市| 城口县| 安泽县| 福鼎市| 马龙县| 积石山| 凌海市| 随州市| 红原县| 九龙坡区| 金昌市|