1. 程式人生 > >《網際網路程式設計(Java)》——課程筆記9:郵件傳送程式設計

《網際網路程式設計(Java)》——課程筆記9:郵件傳送程式設計

學會網路郵件傳送的程式設計技術。  

   網路程式設計的精髓是什麼?

   就是客戶端和伺服器的對話和響應契約(協議)。 簡單郵件傳輸協議SMTP可以很好地詮釋這一點。

   郵件傳輸協議包括SMTP(簡單郵件傳輸協議,RFC821)及其擴充協議MIME;

   郵件接收協議包括POP3和功能更強大的IMAP協議。

25埠(SMTP):25埠為SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)服務所開放的,是用於傳送郵件。

如今絕大多數郵件伺服器都使用該協議。當你給別人傳送郵件時,你的機器的某個動態埠(大於1024)就會與郵件伺服器的25號埠建立一個連線,你傳送的郵件就會通過這個連線傳送到郵件伺服器上,儲存起來。

110埠(POP3):110埠是為POP3(Post Office Protocol Version 3,郵局協議3)服務開放的,是用於接收郵件的。

   服務郵件傳送的伺服器其埠為25,服務郵件接收的伺服器其埠為110。

SMTP協議、POP2協議、POP3協議、IMAP協議都是不安全的協議

按SMTP過程,要成功地傳送和接收郵件,使用者名稱和密碼需要BASE64編碼後才能有效傳輸:

public  class BASE64Encoder.java{
       public static void main(String args[]){
    String username=“你的郵箱使用者名稱”;
    String password= “你的郵箱密碼”;
 
   username = new sun.misc.BASE64Encoder().encode(username.getBytes());
   password = new sun.misc.BASE64Encoder().encode(password.getBytes());
 
    System.out.println(username);//顯示使用者名稱的編碼結果
      System.out.println(userpass);//顯示密碼的編碼結果  
}
}
 

手動體驗SMTP協議過程

開啟作業系統的命令列視窗,鍵入:telnet smtp.163.com 25(完成三次握手連線),然後完成如下的對話過程,或者用我們以前的TCPThreadClient對話視窗程式,完成如下的對話過程,其中加粗字型是必須的且一致的.

HELO  hostname// hostname可以是IP或其他別名

AUTH LOGIN

 //在輸入AUTH LOGIN回車後,先貼上BASE64Encoder程式編碼的使用者名稱;

//再貼上編碼的使用者密碼;

//舊式郵件伺服器不需要身份驗證,可跳過

MAIL FROM:<your mail address>

//在這裡填寫自己的郵箱地址

RCPT TO:<your mail address>  //在這裡填寫自己的郵箱地址,便於接收和驗證

DATA       

 I am 李四.    //在輸入DATA回車後,接下來開始傳送郵件內容

.  //在郵件正文傳送完畢後,單獨用一行輸入一個小圓點,作為結束標誌,然後回車

QUIT   //結束通訊(含4次握手斷開)。

程式設計第二步:體驗SMTP協議過程2:

(1)使用原有的TCPClient.java程式;

(2)原TCPClientThreadJFrame.java對話視窗程式,複製並命名為TCPMailClientJFrame.java,並新增針對使用者名稱和密碼的Base64編碼功能。

(3)執行TCPMailClientJFrame.java程式,按照如下的對話順序,給自己成功傳送郵件。

TCPMailClient tmc = new TCPMailClient(ip,port);
            tmc.send("HELO abc");
            tmc.send("AUTH LOGIN");
            
            String username ="";
            String password = "";//"";
        
            String msg = new sun.misc.BASE64Encoder().encode(username.getBytes());
            tmc.send(msg);
            
            msg = new sun.misc.BASE64Encoder().encode(password.getBytes());
            tmc.send(msg);
            
            msg = "MAIL FROM:<" + jTextField3.getText() + ">";
            
            tmc.send(msg);
            
            msg = "RCPT TO:<" + jTextField4.getText() + ">";
            tmc.send(msg);
            
            msg = "data";
            tmc.send(msg);
            
            msg = "subject:"+jTextField5.getText();
            tmc.send(msg);
            
            msg = jTextArea1.getText();
            tmc.send(msg);
            
            tmc.send(".");
            
            tmc.send("quit");
            

記得telnet 也是啟用一個socket,所以是模擬了命令列的操作,每一步要sleep200ms。

  public void send(String msg)
    {
        pw.println(msg);//寫入網絡卡輸出流,由系統呼叫底層函式,經網絡卡輸出
        
        try
        {
            Thread.sleep(200);
            
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    

程式設計進階之二:POP3(110)電子郵件接收協議

  telnet   pop.qq.com 110

    user 放你的使用者名稱

    pass 放你的密碼 //一些安全級別高的郵箱已經不支援,需要加密通道SSL傳輸

    stat 或list //檢視郵件情況

retr 1 //看第一份郵件

quit //退出