轉貼自 http://www.coder51aa.pub/article/223027.html
《遠望資訊》編者語
鼎鼎大名的Foxmail軟件制作者,你一定不會陌生吧!本刊第三期特刊還刊登過此君的生活照一張,可謂威風八面。小編此次突發奇想,“死纏爛打”,費了九牛二虎之力,終于約他寫了一篇有關寫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等。這里沒法深入去討論,因為這是一本書或幾本書的內容。因此只能向你推薦我自己覺得必看的書目:
- Internet的經典教材:
書名:Internetworking With TCP/IP。作者:Douglas E. Comer。出版:Prentice Hall。
中譯本:《用TCP/IP進行網際互連》。出版:電子工業出版社。
這套書共有三卷。清華大學出版社在國內發行英文版,因為價格比國外買便宜,前不久我還在廣州買了一套寄給在美國念書的朋友(郵費比書還貴)。
- 一本很好的關于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等。