Java網路編程:QQ郵件發送客戶端程式設計
- 2020 年 12 月 29 日
- 筆記
- JAVA, Socket編程, socket網路編程
目錄
一、目標介紹
這篇博文記錄學習使用Java實現類似QQ發送郵件的客戶端,打算分為上下兩篇完成,上篇從零開始學習,認識電腦網路郵件傳輸協議(SMTP、POP3),並開通QQ郵箱的smtp/pop3服務,為之後程式設計做準備,自行實現簡單的Java GUI,通過命令方式發送郵件;下篇基於前面的基礎,實現基本完整功能的,類似我們平時QQ郵件發送的客戶端,圖形化介面簡便了發送操作,另外增加了接收伺服器回饋資訊的功能,以後就可以使用自己寫的郵件發送程式給其他人發郵件啦,更快更方便๑乛◡乛๑
1、認識SMTP(郵件傳輸協議)
SMTP(簡單郵件傳輸協議,RFC821)是一種提供可靠且有效的電子郵件傳輸協議。SMTP是建立在FTP文件傳輸服務上的一種郵件服務,主要用於系統之間的郵件資訊傳遞,並提供有關來信的通知。
2、POP3(郵件接收協議)
POP3,全名為Post Office Protocol – Version 3,即郵局協議版本3。是TCP/IP協議族中的一員,由RFC1939 定義。本協議主要用於支援使用客戶端遠程管理在伺服器上的電子郵件。
二、基於Base64編碼郵箱及授權碼
服務郵件發送的伺服器其埠為25,服務郵件接收的伺服器埠為110。
郵箱設置開啟smtp/pop3服務,目前大部分郵箱開啟服務時,需要設置第三方客戶端使用的授權碼,該授權碼就是代替密碼使用,目的是防止密碼泄露。操作如下:
1、開通QQ郵箱SMTP/POP3服務
登錄郵箱,點擊設置—-賬戶。
往下拉,找到POP3/SMTP服務,點擊開啟,完成驗證之後點擊生成授權碼,記得複製保存,後續用到哦!
2、Java編寫BASE64編碼程式
要成功地發送和接收郵件,用戶名和密碼(郵箱和授權碼)需要BASE64編碼後才能有效傳輸。
/* * BASE64.java * Copyright (c) 2020-12-21 * author : Charzous * All right reserved. */ import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.IOException; public class BASE64 { public static void main(String[] args) throws IOException { String userName="你的郵箱"; String authCode="生成的授權碼"; //顯示郵箱名的base64編碼結果 System.out.println(encode(userName)); //顯示授權碼的base64編碼結果 System.out.println(encode(authCode)); } public static String encode(String str){ return new BASE64Encoder().encode(str.getBytes()); } }
最後生成類似字元串:
Y3poX2NoYXJ6ZXVzQHFxLmNvbQ==
三、telnet命令發送郵件
1、打開命令提示符,輸入
telnet smtp.qq.com 25
2、按順序輸入,舉例如下:
HELO hostname //回車,hostname可以是IP或其他隨意別名 AUTH LOGIN //回車後,先粘貼base64程式編碼的完整郵箱名並回車;再粘貼base64編碼的授權碼並回車 MAIL FROM:<[email protected]> //在這裡填寫自己的郵箱地址,用於發送郵件(注意冒號後面別有空格) RCPT TO:<[email protected]> //接收方的郵箱,在這裡暫時填寫和上面一樣的郵箱地址,即自己發送郵件給自己,驗證是否成功 DATA //回車,接下來開始發送郵件頭相關內容 Subject: the simple mail // 郵件的標題,回車 //在這裡再多發送一行空行,來分隔郵件內容,下面就是郵件正文內容 Hello,the mail content! 測試發送郵件! //控制台中中文會變成?的亂碼,但不影響接受者接收到中文內容 . //在郵件正文發送完畢後,單獨用一行輸入一個小圓點,作為結束標誌,然後回車 QUIT //結束通訊(含4次握手斷開)
發送成功結果:
四、Java圖形介面進行SMTP交互發郵件
使用終端發送時,存在許多不方便的地方,比如輸入錯誤,不能回退修改,只能回車輸入,所以編寫簡單的Java介面來避免這些誤操作帶來的麻煩。用自己的程式代替telnet,來驗證smtp發送給郵件的過程。
1、編寫客戶端類


/* * TCPMailClient.java * Copyright (c) 2020-12-09 * author : Charzous * All right reserved. */ import java.io.*; import java.net.Socket; public class TCPMailClient { private Socket socket; private PrintWriter pw; private BufferedReader br; /** * @param ip * @param port * @return * @author Charzous * @date 2020/12/9 11:19 * */ public TCPMailClient(String ip, String port) throws IOException{ //主動向伺服器發起連接,實現TCP三次握手 //不成功則拋出錯誤,由調用者處理錯誤 socket =new Socket(ip,Integer.parseInt(port)); //得到網路流輸出位元組流地址,並封裝成網路輸出字元流 OutputStream socketOut=socket.getOutputStream(); //參數true表示自動flush數據 pw=new PrintWriter(new OutputStreamWriter(socketOut,"utf-8"),true); //得到網路輸入位元組流地址,並封裝成網路輸入字元流 InputStream socketIn=socket.getInputStream(); br=new BufferedReader(new InputStreamReader(socketIn,"utf-8")); } public void send(String msg){ //輸出字元流,由socket調用系統底層函數,經網卡發送位元組流 pw.println(msg); try { //進行郵件交互,發送smtp指令之間應該暫停一段時間 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } public String receive(){ String msg=null; try { //從網路輸入字元流中讀取資訊,每次只能接受一行資訊 //不夠一行時(無行結束符),該語句阻塞 //直到條件滿足,程式往下運行 msg=br.readLine(); }catch (IOException e){ e.printStackTrace(); } return msg; } public void close(){ try { if (socket!=null) socket.close(); }catch (IOException e){ e.printStackTrace(); } } }
View Code
2、創建QQ郵件發送圖形介面
這裡很容易發現,與之前TCP通訊類似,只需要連接到QQ郵件的發送伺服器smtp.qq.com。
介面的創建使用JavaFx,可參考我的文章自行實現,相對簡單。
五、總結及下篇預告
本篇詳細記錄了使用Java網路編程的技術思想,初步實現QQ郵件發送客戶端。從零開始學習,認識電腦網路郵件傳輸協議(SMTP、POP3),並開通QQ郵箱的smtp/pop3服務,為之後程式設計做準備,自行實現簡單的Java GUI,通過命令方式發送郵件。
可以發現,現在只能通過命令發送請求,向伺服器發送資訊,所以還是不太方便,所以下篇將實現非命令模式發送郵件,更好的用戶體驗,避免的繁瑣的命令輸入,等待下一篇的內容更新!
如果覺得不錯歡迎「一鍵三連」哦,點贊收藏關注,有問題直接評論,交流學習!
我的部落格園://www.cnblogs.com/chenzhenhong/p/14168140.html
我的CSDN部落格://blog.csdn.net/Charzous/article/details/110913974