一封邮件一旦到达incoming queue队列,下一步就是进行投递。下图简要表示了Postfix投递器的主要组件。 带数字的名称代表Postfix的命令或服务程序,不带数字的名称代表Postfix的邮件队列。
队列管理器(图中的qmgr(8)服务)是Postfix邮件投递的核心,它直接与smtp(8), lmtp(8), local(8), virtual(8), pipe(8), discard(8) 或 error(8)投递代理打交道,并且为一个或多个发送邮件地址发送投递请求。其中, discard(8) 和 error(8) 投递代理比价特殊:它们丢弃或弹回所有的邮件(在上图中没有别列出)。
队列管理器维护一个邮件已经被打开准备投递的active queue(活动队列)。active queue在有可能非常大的incoming queue(入口队列) 或 deferred queues(延迟队列:上未发出的邮件队列)中充当了一个限制窗口的脚色,被限制的active queue防止了在重负荷情况下队列管理器产生内存溢出。
队列管理器同时维护着一个单独的不能被立即投递出去的邮件队列:deferred queue(延迟队列),因此大量邮件在服务器上的积压(backlog)不会减慢服务器对普通队列的访问。要设置队列管理器对被延迟投递的邮件再次投递的策略,请参看文档:QSHAPE_README 和 TUNING_README 。
trivial-rewrite(8) 服务根据它的本地和远程地址类的定义决定每个邮件地址的格式,地址类的定义请参看文档:ADDRESS_CLASS_README。附加的邮件路由信息可以可以使用可选的 transport(5) 表来指定。对于谁的邮件地址已经被改变,trivial-rewrite(8) 服务随时查询relocated(5) ,这样的(地址被改变的)邮件地址将被返回给发送者(服务器会给发送者发送一封说明邮件)。
smtp(8)客户程序查询一个目标主机的邮件交换器列表,并根据邮件交换器列表的优先级进行排序,然后从高优先级的服务器开始依次尝试以邮件交换器(目标服务器)连接,直到其中一个服务器回应为止。然后按照SMTP协议的要求封装邮件的发送者、接收者和邮件内容,这个过程包括将8-bit的MIME邮件内容转换为7-bit的编码。
lmtp(8)客户程序使用一种类似SMTP的已经被优化来递送邮件给邮箱服务器(例如cyrus)的协议。使用lmtp(8)的优势是:一台Postfix主机可以通过LMTP为多个邮箱服务器(pop3或imap服务器)服务,同样的,一台邮箱服务器可以被多台Postfix主机服务(接收多台Postfix主机发送来的邮件)。LMTP_README 文档中给出了一些如何使用lmtp(8)客户程序的例子。
local(8)投递代理(本地投递代理程序)能够识别标准的Unix邮箱格式mailboxes,Qmail的兼容邮箱格式maildir files,Sendmail风格的aliases(5) 数据库,sendmail风格的为每个用户设置的.forward文件。多个本地投递代理可以并行运行,但是并行投递到同一个用户通常是被限制的。
local(8)投递代理有两种本地投递方式:你可以配置它将本地邮件直接投递到用户主目录下的用户邮箱文件中;你也可以配置它将本地邮件递交给一个外部的程序(例如procmail)来处理,或者你可以指派它将本地邮件递交给其它的postfix投递代理来处理。
virtual(8)投递代理(虚拟域投递代理程序)是一个仅能投递到Unix风格的mailbox邮箱和Qmail风格的maildir邮箱的透明代理程序。这个投递代理可以为多个域投递邮件,特别适合在单一的主机上为很多域提供邮件服务的场合。关于虚拟域投递代理的配置,请参考文档:VIRTUAL_README
pipe(8)信封是邮件处理系统的外部接口(Postfix的sendmail(1)是内部接口)。该接口是Unix的兼容性接口:它在命令行和输入流中提供信息,并且等待在
【编辑推荐】