Java網絡編程:實現QQ郵件發送客戶端

目錄

一、目標介紹

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:<[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();
        }
    }
}

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通信網絡編程系列文章:

  1. 基於UDP協議網絡Socket編程(java實現C/S通信案例)https://blog.csdn.net/Charzous/article/details/109016215
  2. 基於TCP協議網絡socket編程(java實現C/S通信)https://blog.csdn.net/Charzous/article/details/109016215
  3. Java多線程實現TCP網絡Socket編程(C/S通信)https://blog.csdn.net/Charzous/article/details/109283697
  4. Java多線程實現多用戶與服務端Socket通信https://blog.csdn.net/Charzous/article/details/109440277
  5. Java進階:基於TCP的網絡實時聊天室(socket通信案例)https://blog.csdn.net/Charzous/article/details/109540279

我的CSDN博客:https://blog.csdn.net/Charzous/article/details/110913974

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章