一步一步從原理跟我學郵件收取及發送 1.網絡命令的發送
多年前我寫過一個叫 eemail 的郵件客戶端,原因是當時筆者的姐姐是位小有名氣的作家需要通過郵件發稿子給她的編輯.而當時的 foxmail 等客戶端都需要配置 smtp/pop3 地址,這對於普通用戶來說簡直就是無法逾越的鴻溝,在給 foxmail 開發組數次建議無果后(就是沒理我的意思..),我決定自己寫一個.而且當時 html 病毒流行,編輯部要求來稿是純文本. 你讓一個作家怎樣知道什么是純文本 ... 所以這個 eemail 有兩個特色,1. 是自動配置了各大郵箱的 smtp/pop3 配置並且是網絡同步更新的; 2.是只使用純文本的郵件內容編輯. 這個軟件一度是姐姐部門的 "御用" 郵件發送軟件,直到我離開深圳無力再負擔 eemail 的服務器為止.又過了很多年,感覺自己也快"退休"了,還是總結一下吧,把原理盡我所知說一下,也許有后來者需要呢?
記得當年還是學生時看過記者采訪張小龍請教怎樣開發一個郵件客戶端,張先生嗶哩嗶哩說了一堆術語,列舉了一堆 rfc 協議 ... 記者表示沒聽懂,小龍說過程就是這樣了郵件程序的開發過程是比較麻煩的...
作為二流軟件開發專業學生的我和同學們面面相覷也是沒聽懂.
之后我是看了很多網絡編程方面的書,學校圖書館的編程書毫不誇張地說都翻遍了也是沒頭緒,當時的書籍主要說的是 windows 的各種 api,java 當時也有了,但就是沒有網絡應用開發相關的,這當然也和當時網絡剛出現有
關(98年). 最后我漸漸了解了還是通過 ftp 協議的某本書的示例,沒開發過網絡應用的同學一定會覺得奇怪,怎么學習開發 ftp 還能學會開發電子郵件?
這是因為當初的各種網絡協議都是基於網絡命令行演變而來的,不光是 ftp/smtp/pop3 如此,就是大家最常用的網頁 http 協議也是如此,它們基於網絡命令行也是有原因的,那就是早期的電腦都是命令行的,后來蘋果出現了...
所以要學習電子郵件開發第一步不是去看什么協議,而是要了解什么是網絡命令行.
開始前讓我們先申請一個郵箱: "newbt.net 的臨時郵箱" 或者 "163.com 的正式郵箱". (163 現在好象要綁定手機什么的,臨時用用的話用 newbt 的好了,賬號秒開.)
既然是命令行,那么就來看看命令行是什么樣的,按下 WIN + R 鍵會打開 windows 的 "運行" 對話框,輸入 cmd 然后點擊確定,這時 windows 的命令行就出來了,它會先給你顯示 windows 的版本和當前的路徑.(用 mac 的土豪
和用 linux 的..非土豪請使用命令行工具) 然后我們輸入一個命令 dir ,這時命令行窗口會顯示當前目錄下的文件名列表(用 mac 的土豪和用 linux 的..非土豪請使用 ls 命令,其實差不多的,所以后面就是 windows 下為例了,不再寫 mac/linux 對應的命令).
好了,這就是命令行,一般還會有人給它起個名稱叫本機命令行,總之就是讓自己正在使用的這台機器執行一個命令的東東. 好了,現在網絡出現了,我還要命令網絡上的另外一台機器也干點啥 ... 好,網絡有先驅們想那弄個網絡版本的命令環境好了.
重復上面的步驟,不過把 "cmd" 換成 "telnet newbt.net 25", 執行后神奇的一幕出現了,命令行顯示了 "220 newbt.net ESMTP eEmail-Server 2.0". 然后執行命令 ehlo , 這時服務器會回兩條信息回來...
這里必須要停一停了,因為會出現很多問題...
1.擦... telnet 是啥玩意,我這里提示不存在.
現在新的 windows 版本不一定帶有 telnet 客戶端,需要在 windows 功能模塊中打開. "點我查看如何開通"
2.telnet 我知道, newbt.net 是啥,我要 163 郵箱.
好吧,把命令換成 "telnet smtp.163.com 25". 你會說,為啥有個 stmp ... 好吧,這就是我前面用 newbt.net 的原因,
后面再解釋.
(圖1.要輸入的 telnet newbt.net 25 命令)
(圖2.連接成功后的服務器回應,及 ehlo 命令的回應)
如果連接的不是 newbt.net 郵箱而是 163 郵箱,那么還會有兩個坑要爬:
1.咦,我輸入了 ehlo 然后回車,163 說我 "500 Error: bad syntax"
這個,咳咳,忘了說了網絡程序雖然有協議但各個程序實現起來是有些差異的,因為協議不可能面面俱到,現實中兼容性是個大問題... 好了,具體到這個那是因為 163 郵箱要求命令英文(最好是)大寫,因為協議中沒有說是大寫還是小寫啊(其實是有的,不太明顯而已)
2.好吧,我換成大寫命令了... 怎么還是不行啊.
這... 我也無語,因為 163 郵箱要求 ehlo 命令后要帶上它 163 的名稱,這個名稱還不能亂寫,它必須是 "163.com",
所以如果用 163 郵箱來學習這些命令的話那么要輸入的是 "EHLO 163.com"
(圖3. 因為對協議實現的不同 163 的命令格式要求更嚴格. 因為現在國內還用不了 gmail 所以不能給大家看 gmail 的實現了)
好了,經過這番掉一層皮的折騰,我終於過了網絡編程的第一關: 使用及認識什么是網絡命令. 但是這網絡命令中還有一個大坑,我們下編文章再說. 碼字好辛苦,休息下先.
--------------------------------------------------
附1: newbt.net 的郵箱可以在 這里 申請,過程很簡單.
附2: win7 及以上版本的 windows 可能沒有打開 telnet 功能,請查看 這里 . (注:打開 telnet 客戶端就可以了,開 telnet 服務端的話不太安全)
--------------------------------------------------
版權聲明:
本文已授權百家號 "clq的程序員學前班" .