張小龍談如何寫E-mail軟體

iteye_20683發表於2009-12-17

出處:《遠望資訊》 作者:張小龍 時間:2005-11-21 10:36:00

編者語:鼎鼎大名的Foxmail軟體製作者,你一定不會陌生吧!本刊第三期特刊還刊登過此君的生活照一張,可謂威風八面。小編此次突發奇想,“死纏爛打”,費了九牛二虎之力,終於約他寫了一篇有關寫E-mail軟體的文章,這可是大家之作喲!各位趕快來品嚐吧!
張小龍談如何寫E-mail軟體
《新潮電子》的編輯向我約稿,而我一向都是懶得寫文章的,但編輯說是寫關於怎樣寫郵件軟體的,因為很多讀者對開發郵件程式感興趣。我想這倒比其他內容好寫些,因為開發foxmail的緣故,畢竟積累了一些想法。但因為是面向大眾的文章,技術性又不能太強,因此主要從概念上說說我自己的看法。
首先要確定的是你要開發的郵件軟體的應用物件和範圍。分為三類吧,第一類,你的目標是通用的E-mail軟體,就像foxmail, outlook一樣。第二類,是E-mail的一些分支,如郵件監測器(POP3 Monitor,自動檢測伺服器上是否有郵件到來),批量郵件傳送器(bulk emailer)等。第三類,是將E-mail應用到某些軟體專案中,比如,你可能須要在一個MIS專案中用E-mail來傳輸資料,或在Web上提供傳送郵件的功能(如賀卡)。
關於三種型別,他們的實現方法和難度是不一樣的。為了講解方便,我們將上面三種型別稱為A類,B類和C類。其中A類因為使用者的覆蓋面最廣,須要考慮的因素最多,對程式的穩定性和適應性要求也最大,B類次之。
下面的內容主要集中在郵件相關知識上。我要強調的是,一個郵件軟體,更多的是非網路的處理。因為郵件軟體不同於其它的網路應用,郵件軟體要更貼近使用者,實際上是一個日常辦公應用。事實上,在Foxmail中,網路部分的處理可能只用了10%的精力。


一、瞭解TCP/IP網路程式設計方法
對於A類和部分B類應用,要求你自己程式設計實現基於TCP的郵件通訊。因此對TCP/IP程式設計的理解是必要的。而且一旦你掌握了TCP/IP的程式設計方法,你可以完成更多的網路程式,比如FTP, HTTP等。這裡沒法深入去討論,因為這是一本書或幾本書的內容。因此只能向你推薦我自己覺得必看的書目:
1.Internet的經典教材:
書名:Internetworking With TCP/IP。作者:Douglas E. Comer。出版:Prentice Hall。
中譯本:《用TCP/IP進行網際互連》。出版:電子工業出版社。
這套書共有三卷。清華大學出版社在國內發行英文版,因為價格比國外買便宜,前不久我還在廣州買了一套寄給在美國唸書的朋友(郵費比書還貴)。
2.一本很好的關於Winsock程式設計的書
書名:《Internet程式設計》,電子工業出版社,1996。
這是一本翻譯過來的書,詳細講解了TCP/IP程式設計的概念和方法。其中對Unix socket和Windows socket程式設計的區別,以及Windows下socket的同步和非同步,訊息和多執行緒等概念講解透砌。1996年我就是因為看了這本書,萌發了寫foxmail的想法。


二、瞭解電子郵件相關的標準
對A類和B類應用,有必要非常熟悉網路協議,特別是與E-mail相關的RFC協議。RFC是Request for Comments的簡稱,Internet的絕大部分協議都是通過RFC的方式提供與更新的,比如我們常用的HTTP協議,就是由RFC2068 定義的。與E-mail相關(通訊,郵件格式,附件編碼等)的協議有很多,以下是必須要看的RFC:
RFC 821 (SMTP,簡單郵件傳輸協議,定義了傳送郵件的機制)
RFC 822 (郵件格式定義)
RFC 1725 (POP3,郵局協議版本3,定義了從POP3伺服器收取郵件的機制)
RFC 1521 (MIME標準)
RFC 1522 (MIME 標準2)
在這裡,因為篇幅關係,沒有辦法深入講解,因此只能由讀者自己查閱這些文件。這些文件可以在Internet上很多站點找到,比如http://www.cis.ohio-state.edu/htbin/rfc/INDEX.rfc.html就列出了全部的RFC文件。
對於C類應用(和部分B類應用),可以不去關心這些協議,因為你可以採用一些現成的控制元件來完成郵件的功能,封裝得好的控制元件可以完全遮蔽掉這些實現細節。


三、非網路的因素
如前面所說的,你須要投入更大的精力到其它非網路的部分的開發中,因為作為一個應用軟體,你要細緻地處理每個細節。但這裡說的並不是各個特性細節的堆砌。比如對於A類應用,你須要做好合理的系統設計,然後對設計中的每個大模組找到好的實現方法。比如電子郵件的儲存,我稱它為郵箱檔案系統,事實上是個基於索引的變長記錄系統。如收件箱,由兩個檔案組成,In.ind是索引檔案,記錄了每個郵件的摘要資訊(發件人,主題,日期等),更重要的是,每個郵件在資料檔案中的位置;資料檔案是in.box,簡單地記錄了每個郵件的原始內容。郵箱檔案系統的原理並不難理解,難的是要保證其非常高的穩定性,因為郵箱檔案的設計錯誤將直接導致郵件的丟失。
就像瀏覽器的開發一樣,瀏覽器的HTTP網路協議處理並不複雜,但HTML的顯示要複雜得多。電子郵件也一樣。但是在B類和C類應用中,問題比較簡單,因為是特定的功能實現就可以了。


四、Winsock的訊息和多執行緒
對Winsock的非同步機制的理解非常重要,對多執行緒的理解也很重要。很多人以為多執行緒可以解決任何問題,我想並不全是這樣。Windows下的socket程式設計與Unix下的一個很大差別是,你可以將socket的事件與Windows的訊息機制緊密聯絡起來,寫出高效率的Winsock程式,這有賴與對Windows和Winsock的理解。如果須要用到多執行緒,須要周密考慮好執行緒同步問題,這不僅僅是對執行緒的理解,可能在規劃的時候,就要考慮執行緒同步問題來。比如你有一個執行緒在從發件箱中發郵件,一個執行緒在接收郵件,還有一個執行緒(主執行緒)在顯示或刪除郵件,這些執行緒可能同時對同一個郵箱檔案進行操作,如果不同步的話,後果將是郵箱檔案被破壞。
採用Winsock的基於訊息的非同步機制是個很好的選擇,這樣只有當有網路訊息到來時,Winsock才發訊息通知程式處理,程式不會停頓在等待或迴圈中。利用非同步機制,須要構造好一個“狀態機”,即你要讓程式清楚知道目前處理到什麼階段了,當網路(伺服器)需要資料時,程式才能知道下一步要傳送什麼資料出去。


五、開發工具的選擇
對於A類和部分B類應用,我想Visual C++和Delphi是比較好的選擇。我個人在開發Foxmail的時候決定用Delphi,是因為它可以幫我省去許多設計介面的時間。而且Delphi具備C++的絕大部分優點,如真正的物件導向,執行的效率等,同時具有比C++更容易理解的語法。而且Internet上有許多Component可以參考,我常去的一個Delphi站點是http://sunsite.icm.edu.pl/delphi。
對於部分B類和C類應用,開發工具的選擇面大很多,VC++, Delphi, VB, PowerBuilder,甚至Java等都是考慮的物件,就看你的應用方向了。如果基於現成的控制元件來做,一般是OCX的形式,OCX可以在絕大多數開發平臺上使用。
對於開發工具,我還想說的是,開發工具並不是最重要的,因為任何一種工具,必須用好它,才能發揮它的功能,而用好一個工具的基本點,是對程式設計的理解和掌握,與開發工具無關。


六、要不要熟悉TCP/IP和郵件協議?
看了上面的介紹,可能很多讀者會問,如果從頭去學習TCP/IP程式設計,並掌握關於email的協議,會用去大量的時間,有沒有更快速的方法呢?我想,同樣得看你的應用目標是什麼。比如,你只是想在一個MIS專案中包含電子郵件功能,當然沒必要從底層開發所有的東西,你可以藉助一個商業(甚至免費)的OCX來完成郵件功能。比如Delphi中,就包含了POP3和SMTP的OCX,可以直接應用。有了這些OCX,為什麼還要自己從頭開發呢?因為商業的OCX並不能保證它是功能齊全和穩定的,特別對於email來說,有許多非標準(或準標準)的因素存在,比如漢字的編碼方法,這些國外出的OCX一般都沒有考慮到。而且從穩定性上來說,email軟體須要適應不同的網路和伺服器,只有自己開發的,才能不斷地改進。Internet上甚至還提供一些免費的原始碼。這些程式碼只能作為參考,不要指望它們能解決所有問題。


七、小結
我擔心讀者看了上面的介紹,可能有些失望,因為只是些指導性的內容。但沒辦法,因為任何一個細節的深入探討都將超出本文的篇幅,我也不想以偏概全。另外你可能覺得工作量太大,不過,如上面說的,如果你只是將郵件功能應用到一個小範圍,是不需要這樣專注的,但你對TCP/IP和E-mail標準的理解是有幫助的,而且也有助於你對其它網路協議的理解,如HTTP, FTP等。

相關文章