Linux环境下邮件服务器软件的分析比较
2009-10-21 09:21:47 Administrator

几年以前,Linux环境下可以选择的可以免费邮件服务器软件只有Sendmail,但是由于Sendmail的缺陷,一些开发者先后开发了若干种其他的邮件服务器软件。当前运行在Linux环境下免费的邮件服务器,或者称为MTA(Mail Transfer Agent)有若干种选择,比较常见的Sendmail、Qmail、Postfix、Exim及Zmailer等等。

本文希望通过对几种影响相对来说比较大的主流Linux环境下的MTA的特点进行阐述,并对其优缺点一一精心分析比较,使用户在选择Linux环境下的免费MTA时有一个选择的依据。

Postfix
Postfix 是一个由IBM资助下由Wietse Venema 负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。Postfix力图做到快速、易于管理、提供尽可能的安全性,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初,Postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为Postfix。

主要设计目标
Postfix工程的目标是实现一个邮件服务器,提供给用户除sendmail以外的选择,其设计目标包括:
性能:Postfix要比同类的服务器产品速度快三倍以上,一个安装Postfix的台式机一天可以收发百万封信件。Postfix设计中采用了web服务器的的设计技巧以减少进程创建开销,并且采用了其他的一些文件访问优化技术以提高效率,但同时保证了软件的可靠性。

兼容性:Postfix设计时考虑了保持Sendmail的兼容性问题,以使移植变的更加容易,Postfix支持/var/spool/mail、/etc/aliases、NIS及 ~/.forward等文件。然而Postfix为保证管理的简单性,所以没有支持配置文件sendmail.cf。

健壮性:Postfix设计上实现了程序在过量负载情况下仍然保证程序的可靠性,当出现本地文件系统没有可用空间或没有可用内存的情况时,Postfix就会自动放弃,而不是重试使情况变的更糟。

灵活性:Postfix结构上由十多个小的子模块组成,每个子模块完成特定的任务,如通过SMTP协议接收一个消息、发送一个消息、本地传递一个消息、重写一个地址等等。当出现特定的需求时,可以用新版本的模块来替代老的模块,而不需要更新整个程序。而且它也很容易实现关闭某个功能。

安全性:Postfix使用多层防护措施防范攻击者来保护本地系统,几乎每一个Postfix守护进程都能运行在固定低权限的chroot之下,在网络和安全敏感的本地投递程序之间没有直接的路径—一个攻击者必须首先突破若干个其他的程序,才有可能访问本地系统。Postfix甚至不绝对信任自己的队列文件或IPC消息中的内容以防止被欺骗,Postfix在输出发送者提供的消息之前会首先过滤消息,而且Postfix程序没有set-uid。

Postfix 则并不一定要以root的身份运行,而只需要一个主(master)程序以root身份运行,其生成进程来处理接入、发出及本地邮件投递工作。通过使用一系列模块部件,每个任务由一个单独的程序来运行(这样使审计变的容易一些)。例如发出邮件被卸载到一个队列目录,在这里 “pcikup”程序取到该邮件然后将邮件传递给“cleanup”程序,其再将邮件传递给“trivial-rewrite”,其负责处理邮件头,最后若邮件目的是别的系统则将邮件传递给“smtp”程序。而且相对于Sendmail来说Postfix也更容易设置chroot‘ed环境。只要简单地通过编辑master.cf(一般位于/etc/postfix内)文件即可实现,并且Postfix将运行chroot‘ed,以限定在其定义的队列目录之下(通常位于/var/spool/postfix),同样可以在master.cf中对Postfix的单一模块设置进程限制。用户可以限制 Postfix以哪个用户的身份运行,一般来说是以“postfix”用户(概念上该用户和Apache的nobody类似)运行,该用户可以访问特定的队列目录。Postfix其他的主要优点是起配置文件的清晰易懂性。

其它特点
支持多传输域:sendmai支持在Internet、DECnet、X.400及UUCP之间转发消息,Postfix则灵活的设计为无须虚拟域(vistual domai)或别名来实现这种转发,但是在早期的发布里仅仅支持STMP和有限度地支持UUCP,但对于我国用户来说,多传输域的支持没有什么意义。

虚拟域:在大多数通用情况下,增加对一个虚拟域的支持仅仅需要改变一个Postfix查找信息表,其他的邮件服务器则通常需要多个级别的别名或重定向来获得这样的效果。

UCE 控制(UCE,unsolicited commercial email):Postfix能限制哪个主机允许通过自身转发邮件,并且支持限定什么邮件允许接进。Postfix实现通常的控制功能:黑名单列表、RBL查找、 HELO/发送者DNS核实。基于内容过滤当前需要借助第三方软件实现。

表查看:Postfix没有实现地址重写语言,而是使用了一种扩展的表查看来实现地址重写功能,表可以是本地 dbm或 db文件等格式。

体系结构
Postfix是基于半驻留,互操作的进程的体系结构,每个进程完成特定的任务,没有任何特定的进程衍生关系(父子关系);而且,独立的进程来完成不同的功能相对于“单块”程序具有更好的隔离性。此外,这种实现方式具有这样的优点:每个服务如地址重写等都能被任何一个Postfix部件所使用、无须进程创建等开销、而仅仅需要重写一个地址、当然并不是只有postfix采用这种方式。

Postfix是按照这种方式实现的:一个驻留主服务器根据命令运行Postfix守护进程,守护进程完成发送或接收网络邮件消息,在本地递交邮件等等功能。守护进程的数目由配置参数来决定的,并且根据配置决定守护进程运行的次数(re-used times),当空闲时间到达配置参数指定的限度时,自动消亡。这种方法明显地降低了进程创建开销,但是单个进程之间仍然保持了良好的隔离性。

Postfix的设计目标就是成为Sendmail的替代者。由于这个原因,Postfix系统的很多部分,如本地投递程序等,可以很容易地通过编辑修改类似inetd的配置文件来替代。

Postfix的核心是由十多个半驻留程序实现的。为了保证机密性的原因,这些Postfix进程之间通过Unix的socket或受保护的目录之下的FIFO进行通信,即使使用这种方法来保证机密性,Postfix进程并不盲目信任其通过这种方式接收到的数据。

Postfix进程之间传递的数据量是有限制的。在很多情况下,Postfix进程之间交换的数据信息只有队列文件名和接收者列表,或某些状态信息。一旦一个邮件消息被保存进入文件,其将在其中保存到被一个邮件投递程序读出。

Postfix采用一些通常的措施来避免丢失信息。在收到确认以前通过调用flush和fsync()保存所有的数据到磁盘中,检查所有的系统调用的返回结果来避免错误状况。

Sendmail
大多数构建邮件服务器者都会选择sendmail,公平的来讲sendmail是一个不错的MTA(Mail Transfer Agent),最初开发时Eric Allman的设计考虑主要放在了邮件传递的成功性。不幸的是,Sendmai开发时没有太多的考虑Internet环境下可能遇到的安全性问题。Sendmail在大多数系统上只能以根用户身份运行,这就意味着任何漏洞都可能导致非常严重的后果,除了这些问题之外,在高负载的情况Sendmail 运行情况不是很好。

与 Sendmail的比较如sendmail之类的邮件系统是按照一个单块的结构设计实现的,该“单块”程序实现所有的功能。当然这种结构有利于在系统的不同部分之间共享数据。但是这种结构容易出现一些致命的错误。而如qmail的邮件系统上使用一种分层次的结构,按照固定得顺序运行不同功能的子模块进程,执行完毕之后就将其释放。这种方法有良好的“绝缘”性,但是增加了进程创建开销和进程间通信开销。但是通过合理的规划子模块进程的运行顺序可以将开销保持在可以接受的范围内。

使用其他的MTA替代Sendmail是一件非常麻烦的事情,用户往往又要花大量的时间去熟悉新的MTA的配置和使用。而使用Postfix,你可以利用很多以有的配置文件。如(access, aliases, virtusertable等等),只需要简单的在master.cf中定义一下即可。此外,Postfix在行为上也很象Sendmail,用户可以使用sendmail命令来启动Postfix。

当然,使用一个软件来替代另外一个软件需要解决特定的问题。部分原因是因为Postfix的安全特性,在配置Postfix时可能会遇到一些问题。最典型的问题是向root用户发送邮件。Postfix一般不提高自身的权限(向root用户发送邮件所必须的)来投递邮件。用户需要在别名文件中为 root定义别名,如:root: someuser。这同样会对若干个邮件列表模块发生影响,特别是SmartList。一般来说实现邮件列表最好使用Majordomo,它易于配置。

Sendmail 一个很突出的问题就是可扩展性和性能问题。例如用户若希望每天重新启动Sendmail来实现自动更新配置文件(如为虚拟主机重定向邮件)就会出现问题。 Sendmail生成新的进程来处理发送和接收邮件,这些进程会一直存在直到传输结束,之后Sendmail才能退出,这样你的脚本程序将不能正确的重起 Sendmail。而对于Postfix,用户则只需要发出命令postfix reload即可,Postfix将会重新加载其配置文件。

另外,对于有数以万计的用户的邮件服务器来说,使用文件来存储如匹配用户发出邮件地址(例如bob发出的信的发信人修改为 sales@example.org)。对于大量用户来讲,该文件就会变的很巨大,从而影响系统的运行效率。而Postfix则可以和一个数据库后台集成起来(当前只支持MySQL)来存放其配置信息,数据库方式要比文件方式在可扩展性方面强大很多。

遵从IBM的开放源代码版权许可证,用户可以自由地分发该软件,进行二次开发。其唯一的限制就是必须将对Postfix做的修改返回给IBM公司,因为IBM资助了Wietse的开发。

Qmail
Qmail的缺点就是配置方式和Sendmail不一致,不容易维护。而且Qmail的版权许可证含义非常模糊,甚至没有和软件一起发布。应用作者的话:若你希望分发自己修改版本的Qmail,你必须得到我的许可。

Qmail是有Dan Bernstein开发的可以自由下载的MTA,其第一个beta版本0.70.7发布于1996年1月24日,1997年2月发布了1.0版,当前版本是1.06。

Qmail的特点
安全性为了验证Qmail的安全性,Qmail的支持者甚至出资$1000悬赏寻找Qmail的安全漏洞,一年以后,该奖金没有被领取,而被捐献给自由软件基金会。目前,Qmail的作者也出资$500来寻求Qmail的安全漏洞。

速度:Qmail在一个中等规模的系统可以投递大约百万封邮件,甚至在一台486一天上能处理超过10万封邮件,起支持并行投递。Qmail支持邮件的并行投递,同时可以投递大约20封邮件。目前邮件投递的瓶颈在于SMTP协议,通过STMP向另外一台互联网主机投递一封电子邮件大约需要花费10多秒钟。Qmail的作者提出了QMTP(Quick Mail Transfer Protocol)来加速邮件的投递,并且在Qmail中得到支持,Qmail的设计目标是在一台16M的机器上最终达到每天可以投递大约百万级数目的邮件。

可靠性:为了保证可靠性,Qmail只有在邮件被正确地写入到磁盘才返回处理成功的结果,这样即使在磁盘写入中发生系统崩溃或断电等情况,也可以保证邮件不被丢失,而是重新投递。

特别简单的虚拟域管理,甚至有一个第三方开发的称为vpopmail的add-on来支持虚拟POP域。使用这个软件包,POP3用户不需要具有系统的正式帐户。

使用ezmlm支持用户自控制的邮件列表功能。
邮件用户和系统帐户隔离,为用户提供邮件帐户不需要为其设置系统帐户,从而增加了安全性。

Sendmail vs Qmail
首先:sendmail是发展历史悠久的MTA。当然,Sendmail在可移植性、稳定性及确保没有bug方面有一定的保证。但是Internet上有很多帖子都是关于如果攻击Sendmail,这对于管理员来说是一个噩梦。Sendmail在发展过程中产生了一批经验丰富的 Sendmail管理员,并且Sendmail有大量完整的文档资料,网络上有大量的tutorial、FAQ和其他的资源。这些大量的文档对于很好的利用Sendmail的各种特色功能是非常重要的,但是Sendmai当前来说是一个成熟的MTA。

当然,Sendmail具有一些缺点,其特色功能过多而导致配置文件的复杂性。当然,通过使用m4宏使配置文件的生成变的容易很多,但要掌握所有的配置选项是一个很不容易的事情。Sendmail在过去的版本中出现过很多安全漏洞,所以使管理员不得不赶快升级版本。而且Sendmail的流行性也使其成为攻击的目标,这有好处也有坏处:这意味着安全漏洞可以很快地被发现,但是同样使Sendmail更加稳定和安全。另外一个问题是Sendmail一般缺省配置都是具有最小的安全特性,从而使Sendmail往往容易被攻击。如果使用Sendmail,应该确保明白每个打开的选项的含义和影响。一旦你理解了Sendmail的工作原理,就Sendmail的安装和维护就变的非常容易了,通过Sendmail的配置文件,用户实现完成一切可以想象得到的需求。

Qmail是一个选择,其在设计实现中特别考虑了安全问题。如果你需要一个快速的解决方案如,一个安全的邮件网关,则Qmail是一个很好的选择。Qmail和Sendmail的配置文件完全不同,而对于Qmail,其有自己的配置文件,配置目录中包含了5-30个不同的文件,各个文件实现对不同部分的配置(如虚拟域或虚拟主机等)。这些配置说明都在man中有很好的文档,但是Qmail的代码结构不是很好。

Qmail 要比Sendmail小很多,其缺乏一些现今邮件服务器所具有的特色功能。如不象Sendmail,qmail不对邮件信封的发送者的域名进行验证,以确保域名的正确性。自身不提供对RBL的支持,而需要add-on来实现,而Sendmail支持RBL。同样Qmail不能拒绝接收目的接收人不存在信件,而是先将邮件接收下来,然后返回查无此用户的的邮件。Qmail最大的问题就出在发送邮件给多个接收者的处理上。若发送一个很大的邮件给同一个域中的多个用户,Sendmail将只向目的邮件服务器发送一个邮件拷贝。而Qmail将并行地连接多次,每次都发送一个拷贝给一个用户。若用户日常要发送大邮件给多个用户,使用Qmail将浪费很多带宽。可以这么认为:Sendmail优化节省带宽资源,Qmail优化节省时间。若用户系统有很好的带宽,Qmail将具有更好的性能,而如果用户系统的带宽资源有限,并且要发送很多邮件列表信息,则Sendmail效率更高一些。Qmail不支持.forward(.forward在很多情况下对用户很有用处);不使用/var/spool/mail,而是将邮件存放在用户home目录。下面是一些使用Qmail不容易完成的工作,要使用Qmail完成这些工作,可能需要用户自己动手实现或者使用第三方提供的不够可靠的模块。

Qmail的源代码相对于Sendmail来说要更加容易理解,这对于希望深入到内部了解MTA机制的人员来说是一个优点,Qmail在安全性方面也要稳定一些,Qmail有很好的技术支持,但是没有象Sendmail那样被广泛地应用和大量的管理员用户群。Qmail的安装不象Sendmail那样自动化,需要手工步骤,而且Qmail的文档不如Sendmail那样完整和丰富。

Qmail的add-ons比Sendmail要少一些。一般来说对于经验稍微少一些的管理员,选择Qmail相对要好一些,Qmail要简单一些,而且其特色功能能满足一般用户的需求。Sendmail类似于office套件,80%的功能往往都不被使用。这就使Qmail在一些场合可能被更受欢迎一些,其具有一些Sendmail所没有的更流行和实用的特色功能,如:Qmail具有内置的pop3支持。Qmail同样支持如主机或用户的伪装、虚拟域等等。Qmail的简单性也使配置相对容易一些。

Qmail被认为相对于Sendmail更加安全和高效,运行Qmail的一台pentium机器一天可以处理大约200,0000条消息。

qmail相对于其他的MTA要简单很多,主要体现在:
(1)、其他的MTA的邮件转发、邮件别名和邮件列表都是采用相互独立的机制,而qmail采用一种简单的转发(forwarding)机制来允许用户处理自己的邮件列表。

(2)、其他的MTA都提供快速而不安全的方式及慢的队列方式的邮件投递机制;而 qmail发送是由新邮件的出现而触发的,所以其投递只有一种模式:快速的队列方式。

(3)、其他的MTA实际上包括一个特定版本的inetd来监控MTA的平均负载,而qmail设计了内部机制来限制系统负载,所以qmail-smtpd能安全地从系统的inet来运行。

sendmail有很多的商业支持,而且由于大量的用户群,在互联网上有大量的潜在技术支持,而Qmail只有很有限的技术支持。有家公司 inter7.com提供对Qmail的支持,该公司同样提供了免费的add-ons,包括一个基于web的管理工具-QmailAdmin及一个通过 vpopmail的对虚拟域的支持,甚至具有一个基于web的客户借接口—SqWebMail。

Qmail还具有一些其他的缺憾。如它不是完全遵从标准,它不支持DSN,作者认为DSN是一个即将消亡的技术,而Qmail的VERP可以完成同样的工作,而又不象DSN依赖于其他主机的支持。Qmail另外一个问题是其不遵从支持7bit系统标准,而每次都发送8bit,若邮件接收一方不能处理这种情况,就会出现邮件乱码的情况。

从安全性来讲,Sendmail要比Qmail差一些,Sendmail在发展中出现过很多很著名的安全漏洞;而Qmail相对要短小精悍,但是仍然提供了基本的STMP功能,而Qmail的代码注释要少一些。Qmail的一个很好的特色是其支持一种可选的基于目录的邮件存储格式,而不是使用一个很大的文件来存储用户所有的邮件。若用户的邮件服务器进行很多的POP3服务,则这种邮件存储格式可以提高效率,但是遗憾的是Pine自身并不支持这种存储格式,如果需要可以使用一些补丁来达到这个目的。

Qmail的优点是:每个用户都可以创建邮件列表而无须具有根用户的权限,如用户foo可以创建名为foo-slashdot,foo-linux,foo-chickens 的邮件列表,为了提供更好的功能,有一个叫ezmlm(EZ Mailing List Maker)的工具可以支持自动注册和注销、索引等Majordomo所具有的各种功能,但是都是CLI驱动的,只需要编辑很少的文件。Qmail非常适合在小型系统下工作,一般只支持较少的用户或用来管理邮件列表。Qmail速度快并且简单,Qmail是当你希望安全切容易配置的最佳的选择,Qmail 可以在2个小时内搞定配置,而Sendmail可能在两天内都搞不定。

rocketmail internic 等都使用qmail来构建。

ZMailer
ZMailer 是一个高性能、多进程的Unix系统邮件程序。[ a.k.a. MTA per X.400 parlance ],其可以从下面的服务器ftp://ftp.funet.fi/pub/unix/mail/zmailer/ 自由下载。其也是按照单块模式设计的,如Hotmail等邮件系统就是用Zmailer构建的。

Exim
Exim是由Cambridge 大学开发的遵从GPL的MTA,其风格上类似与Smail3,但是比Smail3更加完善。当前最新版本是4.72,其主站点为http://www.exim.org/。其最大的特点就是配置简单性,但是其安全性不如Qmail及 Postfix。不过它是作为Debian类操作系统内默认的邮件系统,应该值得推荐。

下面是对几种MTA的特点的比较,综合的来讲,Qmail和Postfix都是很不错的MTA,选择的标准往往是个人的喜好问题,Postfix发展历史要比Qmail迟一些。

MTA 成熟性 安全性 特色 性能 Sendmail兼容性 模块化设计
qmail medium high high high addons yes
Sendmail high low high low x no
Postfix low high high high yes yes
exim medium low high medium yes no

当然除了这里介绍的几种MTA以外,还有 Smail、Post.Office、the Sun Internet Mail Server (SIMS)、 MMDF、CommuniGate、PMDF、Netscape Messaging Server、Obtuse smtpd/smtpfwdd、Intermail、MD Switch等其他商业或者免费的MTA可以选择。

相关话题
似乎mail是Linux上面最复杂的系统之一,在网上看到的各种高手写的攻略,没有任何两个是结构完全一致的,似乎一个mail服务系统简单的说有以下几大块儿,是否完整?
1、postfix或sendmail,就是Linux系统上mail服务的核心组件,任何其它的mail组件都要配置来与sendmail或postfix来共同工作。

2、网络界面前端服务,比如openwebmail就是一个,其它的也有很多,提供了mail用户从流览器访问使用邮件更方便。

3、数据库组件,如果搭建实用性的mail服务器,是要有大量的帐户信息,和各帐户的专有的邮件库,这就是要拿一个数据库软件来帮助它,比如大部分linux系统自带的mysql或postgresql。

4、网页服务器,网络界面前端程序必须要依赖于服务器本身开启的网页服务器来运行,比如apache或tomcat

5、连接验证组件,规定什么范围的什么权限的用户可以什么协议登陆mail服务器进行什么样的操作。

6、其它可能的组件,比如杀毒程序、邮件过滤程序等其它的支持组件不计其数。

那我要做一个完整的单位的邮件服务器,比如某个幼儿园、或某个地方电视台这样的百十来人的单位做的化,我的邮件服务器究竟要包含哪些东西?要做多大?

我在网上搜罗了很多资料,关于mail服务器的各种软件工具程序多如牛毛,常见的程序组件就有下面这些,稍微整理了一下,我写错的赶紧给我纠正啊,这么多软件,一时根本不可能完全明白都是做什么用的。

cyrus-sasl,用来进行smtp口令验证使用,使用cyrus-sasl的saslauthd来进行,cyrus-sasl使用pam-mysql实现用mysql针对虚拟用户认证。

pam-mysql,实现用mysql做mail的虚拟用户库的组件。

mysql,虚拟用户数据库。

courier-imap,用来imap/pop验证,由courier-imap的authdaemon支持本地和虚拟用户信息验证。

Courier-authlib,Courier验证程序。

Courier-maildrop,Courier Mail Server所使用的邮件过滤程序。

Courier-sqwebmail,Courier mail server所提供的web界面程序。

Postfix Admin,这是postfix的一个基于网页界面的管理工具。

dovecot,另外一个用户数据库选择?好像是imap/pop验证方式的选择。

CGI,就是perl-CGI包,支持用perl做的openwebmail所必须的依赖包,如果系统有了mysql也可以不需要cgi包。

mime,也就是mime-base64,支持mime邮件格式必须的模块。

clamav,一款开源杀毒软件,可以装在mail服务器上做mail服务的杀毒服务。

extmail,一款国产的mail外壳程序,现在被收购后就不知所踪了。

mailscanner,一款mail的信件过滤程序,过滤有毒的和广告信件。

SquirrelMail,又是一款mail的web界面程序。

spamassassin,apache出的邮件反垃圾过滤器程序。

openldap,轻量级目录访问程序,一种简化了的数据库软件。

Apache,还有tomcat,是web服务器,为web界面程序提供服务支持。

perl,很多组件是用perl做的,所以perl在很多邮件服务器中不可缺少。

Ispell,拼写检查工具软件,如果想要添加这些不是必须的功能的化,不是必须的。

hc,这是一个 BIG5 及 GB 编码的转换程序。

procmail,是一个强大得惊人的过滤进入邮件的应用程序。

----------------------------------------
qmail、sendmail、postfix – 三种MTA的比较
关于sendmail/qmail/postfix孰优孰劣,以及部署邮件系统的时候该选哪一个的讨论已经重复了千百次了。但事实往往并不是A好B坏,或B好A坏,必须根据场合和应用的要求来定。但虽然如此,大多数人还是需要一个相对公平的评价,以引导邮件系统的部署。

自己一直很慎重于回答这类问题,以免引发不必要的争论甚至矛盾,但还是必须面对这个问题做一定的分析和比较的,否则很多朋友经常会问“到底用哪个好?”,却拿不出完整的答案。

首先看看三个MTA的历史...

Sendmail
毫无疑问,sendmail是最古老的MTA之一。它比qmail和postfix要古老得多。最早它诞生的时候,Internet还没有被标准化,当时主机之间使用的是UUCP技术来交换邮件。它被设计得比较灵活,便于配置和运行于各种类型的机器。

Qmail
qmail是新生一代的MTA代表,它以速度快、体积小、易配置安装等特性而著称。作者D. J. Bernstein(djb)是一个数学教授,富有传奇色彩。djb于1995年开发qmail,1996年发布0.70版,并使用了多种当时比较先进的技术,包括Maildir,与sendmail单个binary不同的模块化设计,权限分离,以及使用了大量由djb编写的配套工具,如 daemontools,ucsip-tcp等。这也让它迅速成为了Internet上最有名的MTA,使用者众。

Postfix
Postfix作者是Wietse Venema,一名著名的安全专家。最早postfix起源于1996年,当时venema 在美国IBM研究中心负责研究更安全的邮件系统,当时称为Vmailer。后因为商标问题于1998年11月正式更名为Postfix。

Postfix以替代sendmail为目的,并提供了一个更安全、更高性能的灵活的体系。它同样也采用模块化设计,使用了大量优秀的技术,以达到安全的目的。由于作者的设计理念独到,经过7,8年时间,Postfix现今已发展成为功能非常丰富,扩展性和安全性强的优秀MTA。

概括的比较

sendmail
sendmai功能非常强大,很多先进功能在sendmail上都最先有实现。sendmail里的Milter技术是一个非常好的框架,目前postfix及qmail仍然没有官方发布的方案比milter要好。

但sendmail也有典型的历史问题,只有一个binary程序,需要sid权限,m4配置文件复杂难懂。这些是是阻碍sendmail更好发展的一些客观问题。客观来说,调教得好的sendmail,其性能也是相当不俗的,据一个国外的Unix杂志称,在solaris+内存文件系统+带电池的 raid系统下,sendmail能达到惊人的287封/秒的注入速度!

目前sendmail比较适合那些老用户,因为他们习惯了sendmail的应用环境和配置。

qmail
qmail体积非常小巧,source的gz包大概只有260多K,是三大MTA中最小的!模块化设计,避免了sid问题,基本功能齐全。配置相对 sendmail而言,简单了很多,而且用户非常广泛。而且补丁和插件非常多,例如著名的vpopmail,netqmail,以及qmail-ldap 等。

但qmail有几个问题,一是djb已经5、6年没有继续开发了,补丁的良莠不齐及版本依赖是非常麻烦的事,这对初学者极为不利。二是功能扩充需要补丁来完成,扩展能力不足。

总体上qmail依然是个非常不错的选择。对于希望了解mta原理,或希望修改mta代码的爱好者,qmail是值得推荐的,对于需要建立中小型邮件系统的用户也同样适合。而对于需要丰富功能却不想面对补丁困难,或者需要建立大型的系统,qmail不太合适,需要更丰富的经验和技术。

postfix
postfix如今已经独树一帜,流水线、模块化的设计,兼顾了效率和功能。灵活的配置和扩展,使得配置postfix变得富有趣味。其主要的特点是速度快、稳定,而且配置/功能非常强大,并和sendmail类似,提供了与外部程序对接的API/protocol。尤其是配置部分,可以说是一扫 qmail和sendmail的各自缺点。

但postfix管理及配置的入门依然需要一定的工夫,必须仔细阅读官方文档,postfix另一个优势是至今依然保持活跃的开发工作,而且稳步发展,适合高流量大负载的系统,扩充能力较强。

大规模应用例子
国内若干个大型email ISP(如163.net/tom.com/126.com及sohu等)过去都使用qmail,后来全部更换成postfix。新浪使用qmail,yahoo使用qmail,但这些已经不是普通的qmail了。

技术层面的分析
这里仅探讨一些典型的技术特点,从这些特点可以看出每个MTA设计的异同,主要讨论的焦点是qmail和postfix。

磁盘I/O
从队列文件的读写来看,qmail处理每一封邮件时,都至少需要建立3个文件:mess、intd、info等,而Postfix使用的是单队列文件设计,因此磁盘I/O的开销要比qmail小得多,如果仅仅从这个方面考虑,postfix的队列是 qmail的2-4倍那么快。

数据同步
如果从MTA对待操作系统的文件是否安全写入磁盘的策略来看,qmail和postfix也是不同的。Postfix使用的是随机写,并且需要写入完成并安全同步到磁盘后才算完成。而qmail的写入则是即刻执行的,因此它将等待数据安全写入磁盘后才返回。对于高流量的系统而言,这将导致性能问题。

此外,Postfix的队列对于FreeBSD的softupdate是安全的,而qmail则是不安全的,qmail作者明确警告用户不要使用softupdate,除非是有磁盘后写电池。

扩充能力
sendmail有着非常好的扩充能力,支持众多的特性,功能可谓豪华,包括频率控制到集群支持应有尽有;而milter API则更加使sendmail的灵活性发挥至极,通过milter,用户可以对邮件几乎所有的参数进行控制!但是在存储方面,由于只支持mbox,会有一定的问题。

qmail在系统容量扩展上有着独到的设计,配合qmail-ldap补丁,可以充分利用qmqp及分布存储的优势。现今已有各式各样的qmail扩展方案,最著名的是qmail-ldap,但qmail缺乏类似milter的设计,功能扩展需要各种补丁,而补丁的设计水平参差不齐,配置能力有限,实施起来相对是最复杂的。

Postfix同样有着非常好的容量扩充能力,利用LMTP或transport的/alias的方法,可以分布式的存储邮件,扩充容量。同时 postfix的功能扩展也非常强,通过灵活的配置即可实现复杂的功能,这是其最突出的优点之一,是qmail望尘莫及的。此外,类似sendmail的 milter,postfix拥有content_filter和policy 两个与外部程序/应用对接的接口,但不如milter那样功能集中和灵活,也没有完整实现qmail的qmqp及类似qmail-ldap的机制。

可配置性
sendmail 使用m4语法,单一的主配置文件(sendmail.cf)是三个mta中最难使用的,但是如果熟悉使用的话却能实现复杂的功能。

qmail使用的是大量小配置文本,格式最简单,每个配置一个文件,存放在/var/qmail/control目录里。
postfix也使用单一的主配置文件(main.cf),同时还有对应master主服务进程的配置文件master.cf,但使用的是简明易懂的key = value 格式。

总体而言,qmail的配置文件较易管理(格式最简单)但配置文件多(10个以上),而postfix的格式简单只有2个配置文件,并配备强大的postconf工具,sendmail的配置文件最复杂。

数据库支持
sendmail通过一些插件/补丁,可以支持mysql/pgsql/oracle等,ldap及小型的dbm/cdb等数据存储格式。
qmail默认只支持cdb,需通过补丁才可支持ldap,mysql,pgsql及oracle等。

postfix可以支持的数据库应该是最多的,默认就包括了mysql/pgsql/ldap及dbm/cdb和cidr/nis*/btree等一堆。还支持特殊的tcp_table(仅在snapshot里支持)

稳定性/负载能力
sendmail、qmail、postfix都比较稳定。在高负载下,配置不佳或没有打足够补丁的qmail容易被DOS攻击打跨,而postfix在遇到超过配置的限制时会降低处理能力,但系统依然有一定资源可用。

作者介绍
sendmail - Eric Allman Unix专家、学者

qmail - DJB 数学教授,科学家

Postfix - wietse venema 安全专家 学者

Recommentaion - 建议
我建议在使用Postfix MTA,无论是小型系统,还是大中型系统,能带来最高的性价比。

该文章最后由 阿炯 于 2012-05-07 11:28:52 更新,目前是第 6 版。