今天有一個作業,是要用java通過socket,通過smtp協議向郵箱服務器發送請求, 然後郵箱服務器發送郵件。這裏記錄一下
總體步驟
- 通過socket連接到郵箱服務器
- 輸入相關信息以登錄
- 發送請求,服務器執行對應請求
申請郵箱授權碼
如果需要使用 smtp,需要到相關的郵箱,獲取授權碼,這裏以qq郵箱爲例,在設置裏面找到smtp服務,然後申請成功之後會給你一個授權碼
登錄服務器
郵件服務器發送步驟:
- 連接到服務器
- 問好
- 申請登錄
- 指定郵件發送者
- 指定郵件發送目標
- 輸入郵件內容
- 以
\r\r.\r\n
結束郵件內容 並且發送郵件 其實就是回車 點 回車
在使用socket連接到服務器之後,需要問好(我不知道爲啥要這麼做,可能是爲了打開輸入輸出流)
向服務器發送以下信息以問好
HELO a
然後登錄郵件服務器,輸入auth login
以登錄,之後的兩行,輸入
郵箱號的 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("發送成功");
}
}