《網際網路程式設計(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 //退出