2002-02-21 文章 张小龙谈如何写 E-mail 软件
|最后更新: 2023-10-16

2002-02-21 文章 张小龙谈如何写 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 等。
Loading...