Postfix Policy Delegation
比较新的版本的 postfix 除了 milter 之外还可以用 policy delegation 做 content filtering;后者的优势在于简单容易实现,但是只能读取有限的 email attributes。
policy delegation 实现上也有三种:
- 基于 tcp 的 policy server
- 基于 unix domain socket 的 policy server
- 基于 master daemon spawn 的 policy server
第三种实现上最简单,并且虽然文档上说它也是基于 unix domain socket 实现通信,但是这部分通信实际上对 policy server 是透明的。
第三种情况下,只需要提供一个简单的 binary,能够读写 stdin/stdout 即可完成通信:
- 从 stdin 读出 request attributes
- 将判断结果往 stdout 写
文档上虽然没有明确写出这点,但是通过附带的 example 用例可以证实。
不过使用这种方式要注意一个坑:stdin/stdout 的读写必须不能使用 fread()/fwrite()
std::cin/std::cout
这种带有应用层缓存的 IO 设施。
虽然这里是对 stdin/stdout 读写,但是实际上底下通讯还是会经过 unix domain socket,使用带应用层缓存的库函数读写时会导致阻塞。
相应的,这里要么使用 read(2)/write(2)
这种 syscall,要么手动屏蔽标准库的应用层缓存。
对于没有经验的人来说,这里是一个很容易掉的坑