【轉(zhuǎn)貼】張小龍談如何寫E-mail軟件

轉(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é)得必看的書目:

  1. 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)比書還貴)绿语。

  1. 一本很好的關(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等垃沦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市用押,隨后出現(xiàn)的幾起案子肢簿,更是在濱河造成了極大的恐慌,老刑警劉巖蜻拨,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件池充,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缎讼,警方通過(guò)查閱死者的電腦和手機(jī)收夸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門休涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咱圆,“玉大人,你說(shuō)我怎么就攤上這事功氨⌒蛩眨” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵捷凄,是天一觀的道長(zhǎng)忱详。 經(jīng)常有香客問(wèn)我,道長(zhǎng)跺涤,這世上最難降的妖魔是什么匈睁? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮桶错,結(jié)果婚禮上航唆,老公的妹妹穿的比我還像新娘。我一直安慰自己院刁,他們只是感情好糯钙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著退腥,像睡著了一般任岸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狡刘,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天享潜,我揣著相機(jī)與錄音,去河邊找鬼嗅蔬。 笑死剑按,一個(gè)胖子當(dāng)著我的面吹牛疾就,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吕座,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虐译,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吴趴?” 一聲冷哼從身側(cè)響起漆诽,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锣枝,沒(méi)想到半個(gè)月后厢拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撇叁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年供鸠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨闹。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡楞捂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趋厉,到底是詐尸還是另有隱情寨闹,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布君账,位于F島的核電站繁堡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乡数。R本人自食惡果不足惜椭蹄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望净赴。 院中可真熱鬧绳矩,春花似錦、人聲如沸玖翅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烧栋。三九已至写妥,卻和暖如春拳球,著一層夾襖步出監(jiān)牢的瞬間审姓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工祝峻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魔吐,地道東北人扎筒。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酬姆,于是被迫代替她去往敵國(guó)和親嗜桌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在辞色,面了一些公司骨宠,掛了不少,但最終還是拿到小米相满、百度层亿、阿里、京東立美、新浪匿又、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,243評(píng)論 11 349
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,088評(píng)論 25 707
  • 1.1引言 很多不同的廠家生產(chǎn)各種型號(hào)的計(jì)算機(jī)建蹄,它們運(yùn)行完全不同的操作系統(tǒng)碌更,但TCP/IP協(xié)議族允許它們互相進(jìn)行通...
    張芳濤閱讀 1,235評(píng)論 1 12
  • 在輕彈里,我又再次聽(tīng)到母親說(shuō)你和別人不一樣洞慎,你總歸是缺了點(diǎn)什么痛单。我到底缺了什么?我不覺(jué)得拢蛋,我喜歡純凈的天空桦他,碧綠的...
    木晴的遠(yuǎn)方閱讀 139評(píng)論 0 0
  • 排比,接下去 只有啟程谆棱,才會(huì)到達(dá)理想和目的地快压;只有...
    小賢哥2017閱讀 255評(píng)論 9 1