轉(zhuǎn)貼自 http://www.coder51aa.pub/article/223027.html
《遠(yuǎn)望資訊》編者語
鼎鼎大名的Foxmail軟件制作者,你一定不會(huì)陌生吧!本刊第三期特刊還刊登過此君的生活照一張,可謂威風(fēng)八面。小編此次突發(fā)奇想,“死纏爛打”,費(fèi)了九牛二虎之力,終于約他寫了一篇有關(guān)寫E-mail軟件的文章,這可是大家之作喲!各位趕快來品嘗吧!
《新潮電子》的編輯向我約稿,而我一向都是懶得寫文章的,但編輯說是寫關(guān)于怎樣寫郵件軟件的,因?yàn)楹芏嘧x者對(duì)開發(fā)郵件程序感興趣。我想這倒比其他內(nèi)容好寫些,因?yàn)殚_發(fā)foxmail的緣故,畢竟積累了一些想法。但因?yàn)槭敲嫦虼蟊姷奈恼?,技術(shù)性又不能太強(qiáng),因此主要從概念上說說我自己的看法。
首先要確定的是你要開發(fā)的郵件軟件的應(yīng)用對(duì)象和范圍。分為三類吧,第一類,你的目標(biāo)是通用的E-mail軟件,就像foxmail, outlook一樣。第二類,是E-mail的一些分支,如郵件監(jiān)測(cè)器(POP3 Monitor,自動(dòng)檢測(cè)服務(wù)器上是否有郵件到來),批量郵件發(fā)送器(bulk emailer)等。第三類,是將E-mail應(yīng)用到某些軟件項(xiàng)目中,比如,你可能須要在一個(gè)MIS項(xiàng)目中用E-mail來傳輸數(shù)據(jù),或在Web上提供發(fā)送郵件的功能(如賀卡)。
關(guān)于三種類型,他們的實(shí)現(xiàn)方法和難度是不一樣的。為了講解方便,我們將上面三種類型稱為A類,B類和C類。其中A類因?yàn)橛脩舻母采w面最廣,須要考慮的因素最多,對(duì)程序的穩(wěn)定性和適應(yīng)性要求也最大,B類次之。
下面的內(nèi)容主要集中在郵件相關(guān)知識(shí)上。我要強(qiáng)調(diào)的是,一個(gè)郵件軟件,更多的是非網(wǎng)絡(luò)的處理。因?yàn)猷]件軟件不同于其它的網(wǎng)絡(luò)應(yīng)用,郵件軟件要更貼近用戶,實(shí)際上是一個(gè)日常辦公應(yīng)用。事實(shí)上,在Foxmail中,網(wǎng)絡(luò)部分的處理可能只用了10%的精力。
一、了解TCP/IP網(wǎng)絡(luò)編程方法
對(duì)于A類和部分B類應(yīng)用,要求你自己編程實(shí)現(xiàn)基于TCP的郵件通訊。因此對(duì)TCP/IP編程的理解是必要的。而且一旦你掌握了TCP/IP的編程方法,你可以完成更多的網(wǎng)絡(luò)程序,比如FTP, HTTP等。這里沒法深入去討論,因?yàn)檫@是一本書或幾本書的內(nèi)容。因此只能向你推薦我自己覺得必看的書目:
- Internet的經(jīng)典教材:
書名:Internetworking With TCP/IP。作者:Douglas E. Comer。出版:Prentice Hall。
中譯本:《用TCP/IP進(jìn)行網(wǎng)際互連》。出版:電子工業(yè)出版社。
這套書共有三卷。清華大學(xué)出版社在國(guó)內(nèi)發(fā)行英文版,因?yàn)閮r(jià)格比國(guó)外買便宜,前不久我還在廣州買了一套寄給在美國(guó)念書的朋友(郵費(fèi)比書還貴)。
- 一本很好的關(guān)于Winsock編程的書
書名:《Internet編程》,電子工業(yè)出版社,1996。
這是一本翻譯過來的書,詳細(xì)講解了TCP/IP編程的概念和方法。其中對(duì)Unix socket和Windows socket編程的區(qū)別,以及Windows下socket的同步和異步,消息和多線程等概念講解透砌。1996年我就是因?yàn)榭戳诉@本書,萌發(fā)了寫foxmail的想法。
二、了解電子郵件相關(guān)的標(biāo)準(zhǔn)
對(duì)A類和B類應(yīng)用,有必要非常熟悉網(wǎng)絡(luò)協(xié)議,特別是與E-mail相關(guān)的RFC協(xié)議。RFC是Request for Comments的簡(jiǎn)稱,Internet的絕大部分協(xié)議都是通過RFC的方式提供與更新的,比如我們常用的HTTP協(xié)議,就是由RFC2068 定義的。與E-mail相關(guān)(通訊,郵件格式,附件編碼等)的協(xié)議有很多,以下是必須要看的RFC:
RFC 821 (SMTP,簡(jiǎn)單郵件傳輸協(xié)議,定義了發(fā)送郵件的機(jī)制)
RFC 822 (郵件格式定義)
RFC 1725 (POP3,郵局協(xié)議版本3,定義了從POP3服務(wù)器收取郵件的機(jī)制)
RFC 1521 (MIME標(biāo)準(zhǔn))
RFC 1522 (MIME 標(biāo)準(zhǔn)2)
在這里,因?yàn)槠P(guān)系,沒有辦法深入講解,因此只能由讀者自己查閱這些文檔。這些文檔可以在Internet上很多站點(diǎn)找到,比如http://www.cis.ohio-state.edu/htbin/rfc/INDEX.rfc.html就列出了全部的RFC文檔。
對(duì)于C類應(yīng)用(和部分B類應(yīng)用),可以不去關(guān)心這些協(xié)議,因?yàn)槟憧梢圆捎靡恍┈F(xiàn)成的控件來完成郵件的功能,封裝得好的控件可以完全屏蔽掉這些實(shí)現(xiàn)細(xì)節(jié)。
三、非網(wǎng)絡(luò)的因素
如前面所說的,你須要投入更大的精力到其它非網(wǎng)絡(luò)的部分的開發(fā)中,因?yàn)樽鳛橐粋€(gè)應(yīng)用軟件,你要細(xì)致地處理每個(gè)細(xì)節(jié)。但這里說的并不是各個(gè)特性細(xì)節(jié)的堆砌。比如對(duì)于A類應(yīng)用,你須要做好合理的系統(tǒng)設(shè)計(jì),然后對(duì)設(shè)計(jì)中的每個(gè)大模塊找到好的實(shí)現(xiàn)方法。比如電子郵件的存儲(chǔ),我稱它為郵箱文件系統(tǒng),事實(shí)上是個(gè)基于索引的變長(zhǎng)記錄系統(tǒng)。如收件箱,由兩個(gè)文件組成,In.ind是索引文件,記錄了每個(gè)郵件的摘要信息(發(fā)件人,主題,日期等),更重要的是,每個(gè)郵件在數(shù)據(jù)文件中的位置;數(shù)據(jù)文件是in.box,簡(jiǎn)單地記錄了每個(gè)郵件的原始內(nèi)容。郵箱文件系統(tǒng)的原理并不難理解,難的是要保證其非常高的穩(wěn)定性,因?yàn)猷]箱文件的設(shè)計(jì)錯(cuò)誤將直接導(dǎo)致郵件的丟失。
就像瀏覽器的開發(fā)一樣,瀏覽器的HTTP網(wǎng)絡(luò)協(xié)議處理并不復(fù)雜,但HTML的顯示要復(fù)雜得多。電子郵件也一樣。但是在B類和C類應(yīng)用中,問題比較簡(jiǎn)單,因?yàn)槭翘囟ǖ墓δ軐?shí)現(xiàn)就可以了。
四、Winsock的消息和多線程
對(duì)Winsock的異步機(jī)制的理解非常重要,對(duì)多線程的理解也很重要。很多人以為多線程可以解決任何問題,我想并不全是這樣。Windows下的socket編程與Unix下的一個(gè)很大差別是,你可以將socket的事件與Windows的消息機(jī)制緊密聯(lián)系起來,寫出高效率的Winsock程序,這有賴與對(duì)Windows和Winsock的理解。如果須要用到多線程,須要周密考慮好線程同步問題,這不僅僅是對(duì)線程的理解,可能在規(guī)劃的時(shí)候,就要考慮線程同步問題來。比如你有一個(gè)線程在從發(fā)件箱中發(fā)郵件,一個(gè)線程在接收郵件,還有一個(gè)線程(主線程)在顯示或刪除郵件,這些線程可能同時(shí)對(duì)同一個(gè)郵箱文件進(jìn)行操作,如果不同步的話,后果將是郵箱文件被破壞。
采用Winsock的基于消息的異步機(jī)制是個(gè)很好的選擇,這樣只有當(dāng)有網(wǎng)絡(luò)消息到來時(shí),Winsock才發(fā)消息通知程序處理,程序不會(huì)停頓在等待或循環(huán)中。利用異步機(jī)制,須要構(gòu)造好一個(gè)“狀態(tài)機(jī)”,即你要讓程序清楚知道目前處理到什么階段了,當(dāng)網(wǎng)絡(luò)(服務(wù)器)需要數(shù)據(jù)時(shí),程序才能知道下一步要發(fā)送什么數(shù)據(jù)出去。
五、開發(fā)工具的選擇
對(duì)于A類和部分B類應(yīng)用,我想Visual C++和Delphi是比較好的選擇。我個(gè)人在開發(fā)Foxmail的時(shí)候決定用Delphi,是因?yàn)樗梢詭臀沂∪ピS多設(shè)計(jì)界面的時(shí)間。而且Delphi具備C++的絕大部分優(yōu)點(diǎn),如真正的面向?qū)ο?,運(yùn)行的效率等,同時(shí)具有比C++更容易理解的語法。而且Internet上有許多Component可以參考,我常去的一個(gè)Delphi站點(diǎn)是http://sunsite.icm.edu.pl/delphi。
對(duì)于部分B類和C類應(yīng)用,開發(fā)工具的選擇面大很多,VC++, Delphi, VB, PowerBuilder,甚至Java等都是考慮的對(duì)象,就看你的應(yīng)用方向了。如果基于現(xiàn)成的控件來做,一般是OCX的形式,OCX可以在絕大多數(shù)開發(fā)平臺(tái)上使用。
對(duì)于開發(fā)工具,我還想說的是,開發(fā)工具并不是最重要的,因?yàn)槿魏我环N工具,必須用好它,才能發(fā)揮它的功能,而用好一個(gè)工具的基本點(diǎn),是對(duì)編程的理解和掌握,與開發(fā)工具無關(guān)。
六、要不要熟悉TCP/IP和郵件協(xié)議?
看了上面的介紹,可能很多讀者會(huì)問,如果從頭去學(xué)習(xí)TCP/IP編程,并掌握關(guān)于email的協(xié)議,會(huì)用去大量的時(shí)間,有沒有更快速的方法呢?我想,同樣得看你的應(yīng)用目標(biāo)是什么。比如,你只是想在一個(gè)MIS項(xiàng)目中包含電子郵件功能,當(dāng)然沒必要從底層開發(fā)所有的東西,你可以借助一個(gè)商業(yè)(甚至免費(fèi))的OCX來完成郵件功能。比如Delphi中,就包含了POP3和SMTP的OCX,可以直接應(yīng)用。有了這些OCX,為什么還要自己從頭開發(fā)呢?因?yàn)樯虡I(yè)的OCX并不能保證它是功能齊全和穩(wěn)定的,特別對(duì)于email來說,有許多非標(biāo)準(zhǔn)(或準(zhǔn)標(biāo)準(zhǔn))的因素存在,比如漢字的編碼方法,這些國(guó)外出的OCX一般都沒有考慮到。而且從穩(wěn)定性上來說,email軟件須要適應(yīng)不同的網(wǎng)絡(luò)和服務(wù)器,只有自己開發(fā)的,才能不斷地改進(jìn)。Internet上甚至還提供一些免費(fèi)的源代碼。這些代碼只能作為參考,不要指望它們能解決所有問題。
七、小結(jié)
我擔(dān)心讀者看了上面的介紹,可能有些失望,因?yàn)橹皇切┲笇?dǎo)性的內(nèi)容。但沒辦法,因?yàn)槿魏我粋€(gè)細(xì)節(jié)的深入探討都將超出本文的篇幅,我也不想以偏概全。另外你可能覺得工作量太大,不過,如上面說的,如果你只是將郵件功能應(yīng)用到一個(gè)小范圍,是不需要這樣專注的,但你對(duì)TCP/IP和E-mail標(biāo)準(zhǔn)的理解是有幫助的,而且也有助于你對(duì)其它網(wǎng)絡(luò)協(xié)議的理解,如HTTP, FTP等。