程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 編寫可在線收發E-mail的Java Applet

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

編輯:JAVA編程入門知識

  說起Java,有些人可能會想到一些用於修飾主頁的Applet,例如著名的水光倒影Lake.class等。其實這些Applet只是Java應用的很小一個方面。作為一種新興的網絡語言,Java用於編寫基於TCP/IP的應用才算用到了點子上。在編寫TCP/IP的應用方面,Java是我所用過的編程語言中最簡潔、最快速的。本文將討論如何用Java來編寫可根據SMTP和POP3協議來收發E-mail的Java Applet。

  一.Java網絡編程初步

  1.建立TCP/IP連接

  Socket類中的構造函數Socket(String host,int port)用於創建一個Socket,並與指定的主機(host)及端口(port)連接。由於受到Java Applet安全機制的限制,主機名不可以任意指定,而應和被調用的Applet所在主機的名字相同。因此,可先由GetCodeBase方法取得浏覽器當前讀取的CLASS文件所在的URL,再通過GetHost方法從該URL返回用字符串表示的該主機的名稱。例如從http://person.zj.cninfo.net/~caveman/這個URL中可以返回用字符串表示的主機名"person.zj.cninfo.net"。

  關於標准端口地址的值一般是:SMTP為25、POP3為110、FTP為21等,當然也有的主機用的是非標准的端口,在使用之前最好先確定一下。

  2.數據的發送與接收

  使用Socket類中的GetOutputStream方法可以取得與當前Socket對應的輸出數據流,用DataOutputStream類中的WriteBytes方法可以逐個字符地將數據寫入到輸出數據流中。

  使用Socket類中的GetInputStream方法可以取得與當前Socket對應的輸入數據流,用DataInputStream類中的ReadLine方法可以逐行地讀取輸入數據流中的數據。

  3.關閉TCP/IP連接

  可以用Socket類中的close方法來關閉TCP/IP連接。

  二.基於SMTP協議發送E-mail的Java Applet

  1.SMTP協議和服務器

  SMTP(Simple Mail Transfer Protocol)協議是目前網上流行的發送E-mail的協議,SMTP協議共有14條命令。不過,發一封E-mail只需用如下5條命令就足夠了(見表1)。

  表1

  命 令 功 能

  HELO <SP> <domain> <CRLF> 與SMTP服務器握手,傳送本機域名

  MAIL <SP> FROM:<reverse-path> <CRLF>傳送發信者的信箱名稱

  RCPT <SP> TO:<forward-path> <CRLF> 傳送接收者的信箱名稱

  DATA <CRLF> 發送信件數據(包括信頭和信體)

  QUIT <CRLF> 退出與SMTP服務器的連接

  除了ISP提供的SMTP服務器以外,國內一些存放免費個人主頁的服務器的SMTP端口也是打開的,如果該服務器對外來的E-mail沒有增加RELAY限制(例如網易nease.net就有此限制),那麼也可以把它當作SMTP服務器來用。如Person.zj.cninfo.net等,在這些服務器上放一個下面要編的Java Applet和調用它的htm文件,用戶就可以實現在線發送E-mail了。

  2.SMTPtester.java中的主要程序

  該Java Applet用了三個文本條(TextField)部件tf1、tf2和tf3,它們分別用來供用戶輸入發信者的信箱名稱、接收者的信箱名稱和信件的標題;還用了兩個文本區(TextArea)部件ta1和ta2,ta1供用戶輸入信體內容,ta2用來顯示Smtp服務器的應答信息和出錯信息等;當然還用了一個按鈕(Button)部件bu1,用戶輸入正確的信息後,用鼠標點擊一下它,信件就可以被發出去了。

  事件捕獲處理程序見程序1:

  

  public boolean handleEvent(Event event1)
   {
   if ((event1.target != bu1) || (event1.id != 1001))
   /*如果不是按鈕bu1被鼠標按下*/
   {
   return false;
   }
   if (!((tf1.getText().length() == 0) || (tf2.getText().length() == 0)))
   /*如果發信者和收信人的信箱名稱都填好了,執行發信程序Bu1run*/
   { bu1.disable();
   bu1run();
   return true;
   }
   ta2.appendText("Please give me enough information to send your email!\n");
   return true;
   }

  (程序1)

  發送E-mail程序bu1run見程序2:

  

  public void bu1run()
   {
   try
   {
   Socket socket1= new Socket(getCodeBase().getHost(),25);
   /*建立與smtp服務器的連接*/
   DataOutputStream dataout2= new DataOutputStream(socket1.getOutputStream());
   DataInputStream dataIn3= new DataInputStream(socket1.getInputStream());
   GetReply(dataIn3);
   dataout2.writeBytes("HELO person.zj.cninfo.net\r\n");
   /*開始按SMTP協議發信*/
   GetReply(dataIn3);
   dataout2.writeBytes("MAIL FROM: " + tf1.getText() + "\r\n");
   GetReply(dataIn3);
   dataout2.writeBytes("RCPT TO: " + tf2.getText() + "\r\n");
   GetReply(dataIn3);
   dataout2.writeBytes("DATA\r\n");
   GetReply(dataIn3);
   dataout2.writeBytes("From: " + tf1.getText() + "\r\n");
   dataout2.writeBytes("To: " + tf2.getText() + "\r\n");
   dataout2.writeBytes("Subject:"+tf3.getText()+"\n\n"+ta1.getText()+"\r\n.\r\n");
   GetReply(dataIn3);
   dataout2.writeBytes("QUIT\r\n");
   GetReply(dataIn3);
   socket1.close();
   /*退出連接*/
   bu1.enable();
   return;
   }
   catch (java.io.IOException IOException0) /*捕獲IO錯誤*/
   {
   ta2.appendText("Error!\n");
   bu1.enable();
   return;
   }
   }

  • 首頁
  • 上一頁
  • 1
  • 2
  • 下一頁
  • 尾頁
  • 共2頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved