原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://haolloyin.blog.51cto.com/1177454/351256
我們都習慣了用郵件客戶端軟件或者登錄到電子郵件站點進行收發郵件,現在嘗試一下使用 Windows 自帶的 Telnet 程序手工地發送一封簡單的郵件,以此來稍微明白關於郵件發送的一些知識。
現在 E-mail 的傳輸一般都使用了 ESMTP (擴展的簡單郵件傳輸協議),SMTP 中定義了 18 條命令,用於發送一封郵件。但是作爲一個測試實驗的話,我們只需要其中最基本的6條命令。
如下(其中的<Space>代表一個空格,<CRLF>代表回車加換行,即寫代碼時的 \r\n ):
ehlo<Space>主機名<CRLF>
SMTP 郵件發送程序與SMTP郵件接收程序建立連接的第一條必須的命令,主機名是當前郵件發送者的主機名;
auth<Space>login<CRLF>
現在一般的郵箱都需要進行用戶名、密碼驗證,而且SMTP 郵件服務器一般都使用 Login 驗證方式,因此就不用考慮其他兩種驗證方式了;
mail<Space>from:發送人郵箱地址<CRLF>
從命令中很明顯地看出來 mail 命令用於指定郵件發送者的郵箱地址;
rcpt<Space>to:收件人郵箱地址<CRLF>
同理,rcpt 命令用於指定郵件接收人的郵箱地址;
data<CRLF>
data 命令用於表示該命令之後的所有內容、數據都將被作爲郵件的相關內容,直到遇到<CRLF>.<CRLF>標識符,即一個句號“.”結束郵件的發送內容;
quit<CRLF>
該命令結束郵件發送過程,關閉本機與SMTP 郵件服務器的網絡連接。
在該測試中,我在mail.163.com 和 mail.sina.com 分別註冊了 [email protected] 和 [email protected] 兩個郵箱,密碼都是 123456 。由於這兩個郵件服務器都需要進行用戶名、密碼進行身份驗證,而且需要將我們的用戶名、密碼進行 BASE64 編碼之後在進行發送驗證,故我們使用 Java 中的 sun.misc.BASE64Encoder 類寫一個 BASE64 轉碼程序,源代碼如下:
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- //import sun.misc.BASE61Encoder;
- public class BASE64Util
- {
- public static void main(String [] args) throws IOException
- {
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- System.out.println("轉碼前:");
- System.out.print("用戶名 = ");
- String userName = in.readLine();
- System.out.print("密碼 = ");
- String pwd = in.readLine();
- sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
- System.out.println("\n轉碼後:");
- System.out.println("用戶名 : " + encoder.encode(userName.getBytes()));
- System.out.println("密碼 : " + encoder.encode(pwd.getBytes()));
- }
- }
注:由於 BASE61Encoder 類是 JDK 自帶的,編譯時會出現警告,我們忽略則可。現在將我們的郵箱用戶名、密碼進行 BASE64 編碼,如下:
準備好這一些之後,可以開始發送郵件了,假設我們將郵件從 163 發送到 sina ,步驟如下(最好將以下一行一行的命令預先寫在文本中,否則一旦輸入錯誤就要重新來過了):
1、使用 Telnet 程序連接到 163 的郵件服務器的 25 端口(該端口是默認的),如下圖:
2、上面第一步完成按下 Enter 一般就會連接得上了,我們再按照上面所說的 6 條最基本的命令來發送郵件,輸入ehlo hao (這個主機名自己取一個),返回一系列響應狀態碼,如下:
3、使用 auth 命令進行身份驗證,先輸入 auth login ,然後再分兩步地輸入轉碼後的用戶名、密碼,其中加了方框的是我們的輸入,如下:
4、輸入郵件發送人郵箱地址、收件人郵箱地址,如下:
6、此時可以開始輸入郵件內容了,使用 data 命令,再輸入內容,如下:
7、此時,郵件發送成功了,去查看一下,如下圖:
雖然發送成功了,但是上面的郵件正文不應該包含from 、to 、subject 的相關內容的,我當我從 163 發送到 qq 郵箱時,這些內容被 qq 郵件服務器解析得比較正確,格式很好,這似乎也說明不同的郵件服務器的功能服務有所差別…
使用 Telnet 手工發送郵件的過程到此結束,感受一下,覺得還真的挺麻煩的…