目錄
一、目標介紹
1、認識SMTP(郵件傳輸協議)
2、POP3(郵件接收協議)
二、基于Base64編碼郵箱及授權碼
1、開通QQ郵箱SMTP/POP3服務
2、Java撰寫BASE64編碼程式
三、telnet命令發送郵件
四、Java圖形界面進行SMTP互動發郵件
1、撰寫客戶端類
2、創建QQ郵件發送圖形界面
五、總結及下篇預告
一、目標介紹
這篇博文記錄學習使用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-09
* 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:<czh_charzeus@qq.com> //在這里填寫自己的郵箱地址,用于發送郵件(注意冒號后面別有空格)
RCPT TO:<czh_charzeus@qq.com> //接收方的郵箱,在這里暫時填寫和上面一樣的郵箱地址,即自己發送郵件給自己,驗證是否成功
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();
}
}
}
2、創建QQ郵件發送圖形界面

這里很容易發現,與之前TCP通信類似,只需要連接到QQ郵件的發送服務器smtp.qq.com,
界面的創建使用JavaFx,可參考我的文章自行實作,相對簡單,
參考文章:
1、《基于TCP協議網路socket編程(java實作C/S通信)》
2、《Java進階:基于TCP的網路實時聊天室(socket通信案例)》
五、總結及下篇預告
本篇詳細記錄了使用Java網路編程的技術思想,初步實作QQ郵件發送客戶端,從零開始學習,認識計算機網路郵件傳輸協議(SMTP、POP3),并開通QQ郵箱的smtp/pop3服務,為之后程式設計做準備,自行實作簡單的Java GUI,通過命令方式發送郵件,
可以發現,現在只能通過命令發送請求,向服務器發送資訊,所以還是不太方便,所以下篇將實作非命令模式發送郵件,更好的用戶體驗,避免的繁瑣的命令輸入,等待下一篇的內容更新!
如果覺得不錯歡迎“一鍵三連”哦,點贊收藏關注,有問題直接評論,交流學習!
Java實作socket通信網路編程系列文章:
- 基于UDP協議網路Socket編程(java實作C/S通信案例)【https://blog.csdn.net/Charzous/article/details/109016215】
- 基于TCP協議網路socket編程(java實作C/S通信)【https://blog.csdn.net/Charzous/article/details/109016215】
- Java多執行緒實作TCP網路Socket編程(C/S通信)【https://blog.csdn.net/Charzous/article/details/109283697】
- Java多執行緒實作多用戶與服務端Socket通信【https://blog.csdn.net/Charzous/article/details/109440277】
- Java進階:基于TCP的網路實時聊天室(socket通信案例)【https://blog.csdn.net/Charzous/article/details/109540279】
我的CSDN博客:https://blog.csdn.net/Charzous/article/details/110913974
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/232497.html
標籤:其他
上一篇:二叉排序/搜索樹類模板

