Postfix 之 Milter

在整三年前,我负责亿邮反垃圾邮件网关的开发,在辛苦 Patch MTA 的同时,感到处理 SMTP 业务的代码和实现过滤的部分耦合的太紧密,而同时别的小组也在根据客户的需求时不时的修改 MTA 程序,这样长期下去势必会造成代码的不统一和高昂的维护成本。当时就开始设想一种 MTA 和 AntiSpam Engine 之间的通信机制,这样我们两个团队可以并行的高效开发,可惜在此方面一直没有琢磨太清楚,即使知道了 Milter 这个名次也没能把两个东西想到一起去,很快到了 04 年 9 月份我就离开了这个项目,也没有机会继续深入,实在是很遗憾。

Milter 就是一个 MTA 和 Filter 通信的协议。MTA 在会话的各个阶段不断把从客户端来的信息(IP、并发连接数)和数据传给 Filter,然后再根据 Filter 返回的结果返回给客户端,甚至修改信件内容!

Sendmail 不但定义了 Milter 协议,而且提供了 libmilter,它封装了一个多线程 Milter Daemon 的常规流程,帮助开发人员把更多精力放在实现过滤上。

使用 Milter 还有一个好处,就是能实现 before-queue 的过滤。这意味着我们能在 SMTP 会话处理阶段就把垃圾邮件拒绝,而不是接受下来后再弹回。

Postfix 2.4 对 Milter 已经支持的很完善,而且它还可以配置多个 Milter 的过滤,我们可以把网上那些开源的 Milter 和我们自己的 Milter 混合在一起实现更全面的防护。

这里透露一个信息:如果反垃圾邮件厂商希望在搜狐这里做测试,那提供一个 Milter 而不是 Gateway 我可是会给加分的,:)

因为要实现自定义白名单功能的话,Gateway 显然有潜在的问题。

另一方面我们也正在计划开发 SMTP-Milter,就是把防垃圾邮件网关封装成一个标准的 Milter Daemon(很奇怪,我满世界找了一圈,没有找到有这样的开源项目)。但这样也给 Gateway 提出了要求——首先是要能做到 before-queue 的过滤,另外就是最好能实现 Postfix 的 XCLIENT 扩展,如果你有自己的一套 IP 黑名单或者 HELO/EHLO 过滤机制的话。

加上 Postfix 之 tcp_tablePostfix 之 Dovecot Authencication Protocol,我们针对 Postfix 的开发就只包括这三方面,这是不是简单的有些难以置信?