当一封邮件进入Postfix邮件系统后,首先被放入incoming queue(入口队列). 下图体现了处理一封新邮件涉及的主要进程和顺序。 带数字的名称代表Postfix的命令或服务程序,不带数字的名称代表Postfix的邮件队列。
网络邮件通过 smtpd(8) 或 qmqpd(8) 服务器进入Postfix,这两个服务删除邮件的SMTP或QMQP协议封装(去掉协议头,又叫解封),并且强制进行一些邮件健康检查(sanity checks)来保护Postfix,然后将邮件的发送者、接收者地址和邮件内容交给cleanup(8)服务处理。可以通过配置 smtpd(8)服务来阻塞服务器不想接收的邮件,具体的配置方法可以参看:SMTPD_ACCESS_README 。
本机发送的邮件是由Postfix自带的 sendmail(1)兼容性命令来处理,并且被特权命令postdrop(1) 放入 maildrop queue队列中进行排队,这种方式使得即使Postfix邮件系统没有运行也能正常工作(本机能够发送邮件,只不过发送完的邮件必须在maildrop queue中,直到Postfix邮件系统启动才能被发送出去。但对用户来讲,不必关心邮件什么时候被发送出去。)。 本地的 pickup(8)服务从maildrop queue中读取本机发送的邮件,并且强制进行一些邮件健康检查(sanity checks)来保护Postfix,然后将邮件的发送者、接收者地址和邮件内容交给cleanup(8)服务处理。
内部(Postfix邮件系统本身)发送来的邮件直接被提交给cleanup(8)服务来处理,这部分没有包括在上面的图示中。所谓内部发送的邮件主要包括:被local(8)投递代理转发的邮件(参看下一小节)、被bounce(8)服务(参看下一小节)返回给发送者的邮件以及postmaster关于Postfix系统问题的通知。
cleanup(8)服务进行邮件进入队列(incoming queue)前的最后一次处理,它将增加一些丢失的消息头、按照地址转换规则(参看 ADDRESS_REWRITING_README)重写邮件地址。另外,cleanup(8)服务可以使用正则表达式配置为轻量级的内容检查器,请参看:BUILTIN_FILTER_README 。 cleanup(8)服务将处理完的邮件以单个文件的方式放入 incoming queue队列,并通知队列管理器有新邮件到达。
trivial-rewrite(8)服务将邮件地址(发送者)重写为标准的邮件地址格式:"user@fully.qualified.domain",参看:ADDRESS_REWRITING_README 。Postfix当前版本本身不执行地址重写语言(rewriting language),但是大多数情况下我们可以通过表查找或正则表达式来实现。
【编辑推荐】