轉(zhuǎn)貼自 http://www.coder51aa.pub/article/223027.html
《遠(yuǎn)望資訊》編者語(yǔ)
鼎鼎大名的Foxmail軟件制作者,你一定不會(huì)陌生吧!本刊第三期特刊還刊登過(guò)此君的生活照一張女仰,可謂威風(fēng)八面。小編此次突發(fā)奇想闽烙,“死纏爛打”每界,費(fèi)了九牛二虎之力,終于約他寫了一篇有關(guān)寫E-mail軟件的文章,這可是大家之作喲钱反!各位趕快來(lái)品嘗吧掖看!
《新潮電子》的編輯向我約稿,而我一向都是懶得寫文章的面哥,但編輯說(shuō)是寫關(guān)于怎樣寫郵件軟件的哎壳,因?yàn)楹芏嘧x者對(duì)開發(fā)郵件程序感興趣。我想這倒比其他內(nèi)容好寫些尚卫,因?yàn)殚_發(fā)foxmail的緣故归榕,畢竟積累了一些想法。但因?yàn)槭敲嫦虼蟊姷奈恼轮ㄉ妫夹g(shù)性又不能太強(qiáng)刹泄,因此主要從概念上說(shuō)說(shuō)我自己的看法。
首先要確定的是你要開發(fā)的郵件軟件的應(yīng)用對(duì)象和范圍怎爵。分為三類吧特石,第一類,你的目標(biāo)是通用的E-mail軟件疙咸,就像foxmail, outlook一樣县匠。第二類,是E-mail的一些分支撒轮,如郵件監(jiān)測(cè)器(POP3 Monitor乞旦,自動(dòng)檢測(cè)服務(wù)器上是否有郵件到來(lái)),批量郵件發(fā)送器(bulk emailer)等题山。第三類兰粉,是將E-mail應(yīng)用到某些軟件項(xiàng)目中,比如顶瞳,你可能須要在一個(gè)MIS項(xiàng)目中用E-mail來(lái)傳輸數(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等嫂丙。這里沒(méi)法深入去討論,因?yàn)檫@是一本書或幾本書的內(nèi)容规哲。因此只能向你推薦我自己覺(jué)得必看的書目:
- 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吕粹。
這是一本翻譯過(guò)來(lái)的書种柑,詳細(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é)議都是通過(guò)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)系,沒(méi)有辦法深入講解煮落,因此只能由讀者自己查閱這些文檔敞峭。這些文檔可以在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)成的控件來(lái)完成郵件的功能轿衔,封裝得好的控件可以完全屏蔽掉這些實(shí)現(xiàn)細(xì)節(jié)沉迹。
三、非網(wǎng)絡(luò)的因素
如前面所說(shuō)的害驹,你須要投入更大的精力到其它非網(wǎng)絡(luò)的部分的開發(fā)中胚股,因?yàn)樽鳛橐粋€(gè)應(yīng)用軟件,你要細(xì)致地處理每個(gè)細(xì)節(jié)裙秋。但這里說(shuō)的并不是各個(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)用中,問(wèn)題比較簡(jiǎn)單哼转,因?yàn)槭翘囟ǖ墓δ軐?shí)現(xiàn)就可以了桩砰。
四、Winsock的消息和多線程
對(duì)Winsock的異步機(jī)制的理解非常重要释簿,對(duì)多線程的理解也很重要。很多人以為多線程可以解決任何問(wèn)題硼莽,我想并不全是這樣庶溶。Windows下的socket編程與Unix下的一個(gè)很大差別是,你可以將socket的事件與Windows的消息機(jī)制緊密聯(lián)系起來(lái)懂鸵,寫出高效率的Winsock程序偏螺,這有賴與對(duì)Windows和Winsock的理解。如果須要用到多線程匆光,須要周密考慮好線程同步問(wèn)題套像,這不僅僅是對(duì)線程的理解,可能在規(guī)劃的時(shí)候终息,就要考慮線程同步問(wèn)題來(lái)夺巩。比如你有一個(gè)線程在從發(fā)件箱中發(fā)郵件,一個(gè)線程在接收郵件周崭,還有一個(gè)線程(主線程)在顯示或刪除郵件柳譬,這些線程可能同時(shí)對(duì)同一個(gè)郵箱文件進(jìn)行操作,如果不同步的話续镇,后果將是郵箱文件被破壞美澳。
采用Winsock的基于消息的異步機(jī)制是個(gè)很好的選擇,這樣只有當(dāng)有網(wǎng)絡(luò)消息到來(lái)時(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++更容易理解的語(yǔ)法峭弟。而且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)成的控件來(lái)做,一般是OCX的形式俯在,OCX可以在絕大多數(shù)開發(fā)平臺(tái)上使用竟秫。
對(duì)于開發(fā)工具,我還想說(shuō)的是跷乐,開發(fā)工具并不是最重要的肥败,因?yàn)槿魏我环N工具,必須用好它愕提,才能發(fā)揮它的功能馒稍,而用好一個(gè)工具的基本點(diǎn),是對(duì)編程的理解和掌握浅侨,與開發(fā)工具無(wú)關(guān)筷黔。
六、要不要熟悉TCP/IP和郵件協(xié)議仗颈?
看了上面的介紹佛舱,可能很多讀者會(huì)問(wèn)椎例,如果從頭去學(xué)習(xí)TCP/IP編程,并掌握關(guān)于email的協(xié)議请祖,會(huì)用去大量的時(shí)間订歪,有沒(méi)有更快速的方法呢?我想肆捕,同樣得看你的應(yīng)用目標(biāo)是什么刷晋。比如,你只是想在一個(gè)MIS項(xiàng)目中包含電子郵件功能慎陵,當(dāng)然沒(méi)必要從底層開發(fā)所有的東西眼虱,你可以借助一個(gè)商業(yè)(甚至免費(fèi))的OCX來(lái)完成郵件功能。比如Delphi中席纽,就包含了POP3和SMTP的OCX捏悬,可以直接應(yīng)用。有了這些OCX润梯,為什么還要自己從頭開發(fā)呢过牙?因?yàn)樯虡I(yè)的OCX并不能保證它是功能齊全和穩(wěn)定的,特別對(duì)于email來(lái)說(shuō)纺铭,有許多非標(biāo)準(zhǔn)(或準(zhǔn)標(biāo)準(zhǔn))的因素存在寇钉,比如漢字的編碼方法,這些國(guó)外出的OCX一般都沒(méi)有考慮到舶赔。而且從穩(wěn)定性上來(lái)說(shuō)扫倡,email軟件須要適應(yīng)不同的網(wǎng)絡(luò)和服務(wù)器,只有自己開發(fā)的竟纳,才能不斷地改進(jìn)撵溃。Internet上甚至還提供一些免費(fèi)的源代碼。這些代碼只能作為參考蚁袭,不要指望它們能解決所有問(wèn)題。
七石咬、小結(jié)
我擔(dān)心讀者看了上面的介紹揩悄,可能有些失望,因?yàn)橹皇切┲笇?dǎo)性的內(nèi)容鬼悠。但沒(méi)辦法删性,因?yàn)槿魏我粋€(gè)細(xì)節(jié)的深入探討都將超出本文的篇幅,我也不想以偏概全焕窝。另外你可能覺(jué)得工作量太大蹬挺,不過(guò),如上面說(shuō)的它掂,如果你只是將郵件功能應(yīng)用到一個(gè)小范圍巴帮,是不需要這樣專注的溯泣,但你對(duì)TCP/IP和E-mail標(biāo)準(zhǔn)的理解是有幫助的,而且也有助于你對(duì)其它網(wǎng)絡(luò)協(xié)議的理解榕茧,如HTTP, FTP等垃沦。