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

發表于:2007-05-25來源:作者:點擊數: 標簽:java收發在線applete-mail
說起 Java ,有些人可能會想到一些用于修飾主頁的Applet,例如著名的水光倒影Lake.class等。其實這些Applet只是Java應用的很小一個方面。作為一種新興的 網絡 語言,Java用于編寫基于TCP/IP的應用才算用到了點子上。在編寫TCP/IP的應用方面,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連接。

    二?;赟MTP協議發送E-mail的Java Applet

    1.SMTP協議和服務器

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

    表1

    命 令 功 能

    HELO    與SMTP服務器握手,傳送本機域名

    MAIL  FROM: 傳送發信者的信箱名稱

    RCPT  TO:  傳送接收者的信箱名稱

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

    QUIT  退出與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 (?。ǎ╰f1.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;

    }

    }

    (程序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了!

    圖

    三?;赑OP3協議讀取E_mail的Java Applet

    1.POP3協議和服務器

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

    (1)授權狀態(AUTHORIZATION state)

    User 用戶名

    Pass 用戶密碼

    Quit 退出

    (2)執行狀態(TRANSACTION state)

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

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

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

    RETR 讀取編號為msg的信件。

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

    (3)更新狀態(UPDATE state)

    QUIT 退出并把做過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