編寫可在線收發E-mail的Java Applet(2)

發表于:2007-07-14來源:作者:點擊數: 標簽:
(程序2) 接收 服務器 應答程序GetReply見程序3: void GetReply(DataInputStream dataIn1) { String string2; string2= ""; try { string2= dataIn1.readLine(); ta2.appendText(string2 + "\n"); } catch ( java .io.IOException IOException0) { ta2.app
(程序2)

   接收服務器應答程序GetReply見程序3:

   void GetReply(DataInputStream dataIn1)

   {

   String string2;

   string2= "";

   try

   {

   string2= dataIn1.readLine();

   ta2.appendText(string2 + "\n");

   }

   catch (java.io.IOException IOException0)

   {

   ta2.appendText("Error!\n");

   bu1.enable();

   return;

   }

   }

   (程序3)

   3.實例運行

   在http://person.zj.cninfo.net/~caveman上已經放了編譯好的SMTPtester.class和調用它的smtp.htm,圖1是該Applet在運行時的畫面,這時這封信已被發往caveman@nease.net了!

   圖

   三.基于POP3協議讀取E_mail的Java Applet

   1.POP3協議和服務器

   POP3(Post Office Protocol version 3)是一種常用的網絡協議,用于從遠程服務器的信箱里收取E_mail,它的常用命令根據連接時的不同狀態有:

   (1)授權狀態(AUTHORIZATION state)

   User<SP><name><CRLF> 用戶名

   Pass<SP><string><CRLF> 用戶密碼

   Quit<CRLF> 退出

   (2)執行狀態(TRANSACTION state)

   STAT<CRLF> 信箱狀態,即信箱內共有幾封信,總共大?。?進制表示)等。

   LIST<SP><msg><CRLF> 不用msg參數時顯示每封信的大小列表,用msg參數時顯示編號為msg的信件的長度(8進制表示)。

   TOP<SP><msg><SP><n><CRLF> 取編號為msg的信件的信頭(head)和部分信體(body),n=0時只取信頭,n≠0時取信頭和信體的前n行。該命令為可選命令,有些POP3服務器軟件不支持它。

   RETR<SP><msg><CRLF> 讀取編號為msg的信件。

   DELE<SP><msg><CRLF> 刪編號為msg的信件,其實只是作個標記,真正刪除要到更新狀態。

   (3)更新狀態(UPDATE state)

   QUIT<CRLF> 退出并把做過DELE標記的郵件刪掉。

   另外還有NOOP、LAST、RSET、RPOP等命令用得較少。

   與SMTP服務器的情況相似,除了ISP提供的POP3服務器外,國內的一些存放免費個人主頁的服務器也提供POP3服務(例如網易nease.net)。用戶在獲得免費主頁的同時也可以得到一個POP3信箱,例如我的信箱為caveman@nease.net,在服務器上放一個下面要編寫的Applet和調用它的htm文件,在線運行它,輸入正確的用戶名和密碼后就可以讀取E-mail了。

   2.POP3tester.java中的主要程序

   該Java Applet共用了三個文本條(TextField)部件tf1、tf2和tf3,它們分別用來供用戶輸入用戶名、密碼和要讀取的E-mail的編號(為0時,只取信箱狀態不讀信);還用了一個文本區(TextArea)部件ta2,用來顯示POP3服務器的應答信息、信件內容和出錯信息等;當然還用了一個按鈕(Button)部件bu1,用戶輸入正確的信息后,用鼠標點擊一下它,就可以讀取指定的信件了。

   事件捕獲處理程序與SMTPtester中的一樣,讀取E-mail程序bu1run見程序4:

   public void bu1run()

   {

   try

   {

   Socket socket1= new Socket(getCodeBase().getHost(), 110);

   /*連接POP3服務器*/

   DataOutputStream dataout2= new DataOutputStream(socket1.getOutputStream());

   DataInputStream dataIn3= new DataInputStream(socket1.getInputStream());

   GetReply(dataIn3);

   dataout2.writeBytes("USER" + tf1.getText() + "\r\n");

   GetReply(dataIn3);

   dataout2.writeBytes("PASS" + tf2.getText() + "\r\n");

   GetReply(dataIn3);

   dataout2.writeBytes("STAT\r\n");

   /*信箱狀態*/

   GetReply(dataIn3);

   dataout2.writeBytes("LIST\r\n");

   /*信件長度列表*/

   GetReply2(dataIn3);

   ta2.appendText("\n");

   if (tf3.getText().equals("0") == false)

   {

   dataout2.writeBytes("RETR" + tf3.getText() + "\r\n");

   /*讀取指定信件*/

   GetReply2(dataIn3);

   ta2.appendText("\n");

   }

   dataout2.writeBytes("QUIT\r\n");

   GetReply(dataIn3);

   socket1.close();

   bu1.enable();

   return;

   }

   catch (java.io.IOException IOException0)

   {

   ta2.appendText("Error!\n");

   bu1.enable();

   return;

   }

   }

   (程序4)

   接收服務器應答程序GetReply和GetReply2見程序5:

   void GetReply2(DataInputStream dataIn1)

   {

   String string2;

   string2= "";

   try

   {

   for (string2=dataIn1.readLine();

   (string2.equals(".")=false);

   string2=dataIn1.readLine())

   /*List和Retr命令的應答雖然有多行,但都用一句"."作為結束,可據此取應答信息*/

   {

   ta2.appendText(string2 + "\n");

   }

   }

   catch (java.io.IOException IOException0)

   {

   ta2.appendText("Error!\n");

   bu1.enable();

   return;

   }

   }

   (程序5)

   讀取單句應答的程序GetReply和SMTPtester中的相同,因為在與POP3服務器對話時,List和Retr的應答不只一句,因此又編了一個GetReply2程序來處理這個問題。

   3.實例運行

   在http://www.netease.com/~caveman上已經放了編譯好的POP3tester.class和調用它的POP3.html,圖2是該Applet運行時的畫面,剛才在person.zj.cninfo.net上用SMTPtester發出的那封信已到了我網易的信箱里了。

    四.程序的改進

   以上兩個Java Applet還很不完善,在加強錯誤捕獲、對郵件附件的支持等方面需要改進的地方還很多。另外,根據上面提到的一些基本方法,只需稍加變化,還可以用Java來實現其他網絡協議,如FTP、NEWS等。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97