Java socket通過smtp協議 向郵箱服務器請求以實現發送郵件

今天有一個作業,是要用java通過socket,通過smtp協議向郵箱服務器發送請求, 然後郵箱服務器發送郵件。這裏記錄一下

總體步驟

  1. 通過socket連接到郵箱服務器
  2. 輸入相關信息以登錄
  3. 發送請求,服務器執行對應請求

申請郵箱授權碼

如果需要使用 smtp,需要到相關的郵箱,獲取授權碼,這裏以qq郵箱爲例,在設置裏面找到smtp服務,然後申請成功之後會給你一個授權碼
在這裏插入圖片描述

登錄服務器

郵件服務器發送步驟:

  1. 連接到服務器
  2. 問好
  3. 申請登錄
  4. 指定郵件發送者
  5. 指定郵件發送目標
  6. 輸入郵件內容
  7. \r\r.\r\n結束郵件內容 並且發送郵件 其實就是回車 點 回車

在使用socket連接到服務器之後,需要問好(我不知道爲啥要這麼做,可能是爲了打開輸入輸出流)

向服務器發送以下信息以問好

HELO a 

然後登錄郵件服務器,輸入auth login以登錄,之後的兩行,輸入

郵箱號的 Base64 加密後的字符串
郵箱申請碼 Base64 加密後的字符串

base64加密可以通過在線網站實現

輸入DATA服務器會認爲接下來你要輸入正文內容了

DATA
正文
...
以 \r\n.\r\n 結束 (回車 點 回車)

輸入QUIT斷開連接

代碼

import java.io.*;
import java.net.*;
import java.util.*;

public class EmailSender {
	
	public EmailSender() {
		
	}
	
	public void send(String host, String dest) throws Exception {
		
		// smtp是25端口
		Socket socket = new Socket(host, 25);
		
		InputStream is = socket.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
		OutputStream os = socket.getOutputStream();
		OutputStreamWriter writer = new OutputStreamWriter(os, "gbk");
		
		writer.write("HELO a\r\n");
		writer.write("auth login\r\n");
		writer.write("你的郵箱號的base64加密字符串\r\n");
		writer.write("你的郵箱申請碼base64加密字符串\r\n");
		writer.write("MAIL FROM: 填你的郵箱號\r\n");
		writer.write("RCPT TO: <" + dest + ">\r\n");	// 確認接收者
		writer.write("DATA\r\n");
		
		// 正文
		writer.write("這是一封自動發送的郵件\r\n");
		
		writer.write("\r\n.\r\n");	// 正文結束
		writer.write("QUIT\r\n");
		writer.flush();
		
		// 讀取回傳的信息
		String line;
		while((line=reader.readLine()) != null) {
			System.out.println(line);
		}
	}
	
	public static void main(String[] args) throws Exception {
		EmailSender sender = new EmailSender();
		sender.send("smtp.qq.com", "[email protected]");
		System.out.println("發送成功");
	}

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