有时候,邮件在委托给MDA之后,MDA会发现该邮件其实应该寄送到另一个系统的另一个账户。比如说,当MDA在用户个人的forward文件发现了另一个地址时,就会发现这种情况。照理说,MDA可以直接使用Smtp Client(即Smtp Daemon)送出邮件。不过,由于同一封信可能有多位收件人,为了照顾到每一位收件人,同时也为了在邮件日志上留下完整记录,MDA应该依提交新邮件的方式,让邮件重新回到Postfix系统,由Postfix按照“来自本机的邮件”的程序来处理。
Postfix的队列管理器
邮件本身的处理工作主要是由队列管理器(Queue Manager)负责,每一个能收到邮件的Postfix组件,都有一个共同的目的地--队列管理器。邮件进入队列之前的关卡是Cleanup Daemon,因为只有经过清理的邮件,才有资格进入队列。Cleanup将邮件排入队列后,会通知Queue Manager去处理新邮件。每当Queue Manager察觉收信队列有新信到达时,就会使用Trivial-Rewrite来决定邮件路由信息,这些信息包括传输方法、下一站以及收件人地址。
Queue Manager总共维护四种队列:收件(Incoming)、活动(Active)、延迟(Deferred)、故障(Corrupt)。新邮件通过Cleanup之后的第一站是“收件队列”。假设系统资源空闲。Queue Manager会将邮件移入“活动队列”,然后调用适当的MDA来投递邮件,而投递失败的邮件则会被移入“耽搁队列”。
如果邮件被耽搁太久,或是被判定无法送达,则Queue Manager还要负责协调Bounce与Defer Daemons来产生一份递送状态报告,并传回给系统管理员或送信者(或两者)。在Postfix的队列目录下(默认位置是/var/spool/postfix/),除了上述四种邮件队列目录之外,还有bounce/与defer/目录。这些目录含有状态信息,解释特定邮件为何被耽搁或无法递送,Bounce与Defer Daemon就是利用这些目录下的状态信息来产生通知函。
投递操作
Postfix依据收件地址的类型,来判断是否要收下邮件以及如何进行投递操作。主要的地址类型有本地(Local)、虚拟别名(Virtual Alias)、虚拟邮件(Virtual Mailbox)以及转发(Relay)。如果收件地址不在这四种主要类型之中,则邮件会被交给Smtp Client,通过网络寄送出去(假设原信是来自有资格使用转发服务的客户端);否则,Queue Manager便依据地址的类型,选择适当的MDA来投递邮件。
本地邮件
如果收件人为Postfix本地系统的用户(在运行Postfix的那台服务器上有Shell账户的用户),则他们的邮件会被交给Local MDA处理,凡是收件地址的网域名称与mydestination参数列出的任一网域名称相符,这类邮件都算是本地邮件,对于送到任何mydestination网域的任何有效账户的邮件,Local MDA会先检查收件人是否有个人的.forward文件,如果没有,则邮件会被存入用户的个人邮箱;否则,则依据.forward文件的内容来进行投递操作(或转寄到其他地方,或是交给外部程序处理)。
对于需要转寄到他处的邮件,将会被重新提交会Postfix,以便传送到新地址。如果传送过程发生了暂时性问题,MDA会通知Queue Manager,而邮件会被保存在延迟队列等待下次的递送机会;如果发生永久性问题,则要求Queue Manager将信息退给发信者。
虚拟别名邮件
寄给虚拟别名地址的邮件,全部都需要转寄(Forward)到其真实地址,虚拟别名的网域名称列在virtual_alias_domains参数中,每一个虚拟网域都可以有自己的一组用户,不同的虚拟网域可以容许有同名的用户。用户与其真实地址之间对应关系,列在virtual_alias_maps参数所指定的查询表中。当Queue Manager发现邮件的收件地址的网域部分virtual_alias_domains所列出的网域之一,则会重新提交邮件,以便传到真实地址。
虚拟邮箱邮件
虚拟邮箱的网域名称列在virtual_mailbox_domains参数中。每一个网域都可以有自己的用户群,而且有各自独立的命名空间,换言之,即不同的虚拟邮箱网域可以有同名的用户。用户与邮箱之间的对应关系,定义在virtual_mailbox_maps参数所指定的查询表中,虚拟邮箱与系统上的Shell账户之间没有关联性,虚拟邮箱邮件的投递操作由Virtual MDA负责运行。
转发邮件
实际邮箱位于其他MTA控制管理的网域,但是Postfix愿意代收并转寄的邮件,称为转发邮件。这类网域的名称列在relay_domains参数中,其邮件由smtp MDA通过网络送到目标网域的MTA。当你假设邮件网关系统时,便可利用转发功能收下Internet寄到内部网域的邮件,并转寄到内部网络的邮件系统上。