邮箱文件的拥有权

Unix系统上的每一个文件都有主人,虚拟邮箱文件也不例外--虽然虚拟邮箱的“用户”没有系统账户。因此,用户如何访问邮箱文件,决定呢邮箱文件拥有权的归属。通常,POP/IMAP server的运行权限继承于某个专属的系统虚账户,并假设其权限足以访问所有邮箱文件。因此,邮箱文件的拥有者应该是POP/IMAP server所有的那个虚账户。但是,如果必要的话,postfix也容许你自己决定文件的拥有者。你可以让每个邮箱文件都有自己的拥有者或是让同网域的所有邮箱文件都同属于一个拥有者,但不同网域的邮箱分属不同的拥有者。

virtual_uid_maps于virtual_gid_maps参数决定了postfix的virtual MDA投递邮件到虚拟邮箱时,应该继承的系统账户。假设所有虚拟邮箱都属于同一个账户,则你可以使用static映射方式,直接指定virtual所要继承的UID与GID;

virtual_uid_maps = static:1003

virtual_gid_maps = static:1005

这会使得virtual MDA以UID 1003、GID 1005的身份来访问任何邮箱文件。如果你希望virtual以不同的UID身份来访问不同的邮箱文件,你必须另外准备一个查询表,定义各个虚拟邮箱地址与UID之间的对应关系,然后将virtual_uid_maps指向 此查询表;

virtual_uid_maps = hash:/etc/postfix/virtual_uids

如果大部分的虚拟邮箱文件属于固定的拥有者,但也有某些是属于不同的UID,你可以混合使用static与查询表:

virtual_uid_maps = hash:/etc/postfix/virtual_uids static:1003

virtual_gid_maps参数的用法与virtual_uid_maps完全相同。

定义邮箱文件与拥有者对应关系的/etc/postfix/virtual_uids文件,其索引键是邮箱文件所属的邮件地址,而对应值是邮箱文件拥有者的UID(或GID)。举例来说,如果我们希望ora.com网域的所有邮箱都属于同一个UID,而oreilly.com的邮箱属于另一个UID。

虚拟别名

即使是虚拟网域,postfix也能将其邮件投递到本地邮箱,或是转寄到其他站点。既然所有类型的收件地址都会被检查是否为虚拟别名,所以,只要把转寄地址放在virtual_alias_maps所指的文件即可。请确定virtual_alias_maps参数指向一个虚拟别名表:

virtual_alias_maps = hash:/etc/postfix/virtual_alias

/etc/postfix/virtual_alias文件包含了要被转寄到他处的虚拟地址:

kdent@oreilly.com kyle.dent@onlamp.com

不要将同一个网域同时列在virtual_mailbox_domains和virtual_alias_domains中。对于同时含有邮箱与别名的虚拟网域,请使用virtual_mailbox_domains。如果所有地址都是别名,请使用virtual_alias_domains。

无限别名地址

无论是虚拟别名还是虚拟邮箱,它们的查询表都可以含有一个“无限别名地址”--只有网域部分没有人名部分的邮件地址。无限别名地址所对应的邮箱(如果是虚拟邮箱的话)或转寄地址(如果是虚拟别名的话),用来承接外界寄到该网域的不明用户的邮件。无限别名地址应该谨慎使用,因为它们一定会收到大量垃圾邮件。发送垃圾邮件者常用“字典攻击法”来滥发垃圾邮件,所以你的邮件服务器会时常收到寄信给不明用户的要求。如果设定了无限别名地址,等于是让这些发送垃圾邮件者有机会塞爆你的邮箱。

无限别名虚拟邮箱

第一步是找出一个邮箱来承接所有寄给不明用户的邮件。你可以使用现有的邮箱,或是另外创建一个新邮箱。决定好邮箱之后,在virtual_mailbox_maps所指的查询表增加一笔无限别名地址记录;

@ora.com ora.com/service

无限别名虚拟别名

无限别名虚拟别名的设定步骤,很类似无限别名虚拟邮箱。第一步,先选定一个邮箱地址来接收所有寄到不明别名等邮件,然后在virtual_alias_maps所指的查询表定义无限别名所对应的地址:

@ora.com customer.service@onlamp.com

除非你的系统没有任何虚拟邮箱,否则不应该设置无限别名虚拟别名。因为postfix会先展开虚拟别名,然后才检查虚拟邮箱;如果你设置了无限别名虚拟别名,它将拦截掉所有的邮件,包括原本应该投递到虚拟邮箱的邮件。

在设置了无限别名的情况下,如果还希望虚拟邮箱能够收到邮件,唯一办法是将虚拟别名展开成虚拟邮箱地址。举例来说,假设下面是虚拟邮箱查询表的内容:

info@ora.com ora.com/info

info@oreilly.com oreilly.com/info

那么,含有无限别名的虚拟别名表,应该要含有上述虚拟邮箱的别名地址:

info@ora.com info@ora.com

info@oreilly.com info@oreilly.com

kdent@oreilly.com kyle.dent@onlamp.com

@ora.com customer.service@onlamp.com

如此一来,寄到info@oreilly.com的邮件,就不至于被@ora.com无限别名拦截掉了。

虚拟网域搭配特殊格式的邮箱

我们要讨论的最后一种操作模式,是在一个使用特殊邮箱格式的系统上假设虚拟网域。在这类系统上,postfix本身不做投递工作,而是使用LMTP协议将邮件托付给知道如何访问特殊邮箱的程序。

因为postfix必须先收下邮件后才转交给LMTP server,所以postfix必须知道它要收下哪些虚拟网域名称的邮件。请将这些网域的名称列于virtual_mailbox_domains参数:

virtual_mailbox_domains = ora.com, oreilly.com

你还必须逐一列出每一个邮件地址,这样postfix才能够知道哪些收件地址是有效的,并拒收不明用户的邮件。请将virual_mailbox_maps参数指向有效地址查询表:

virtual_mailbox_maps = hash:/etc/postfix/virtual

因为postfix只需要知道地址的有效性而不参与投递工作,所以/etc/postfix/virtual查询表只有索引键的部分有意义,对应值的部分没有作用。然而,查询表的格式不容许我们省略对应值,所以仍必须随便填入数据;

为了让postfix能将虚拟网域的邮件交给POP/IMAP server,我们还必须在main.cf的virtual_transport参数中指定正确的传送方法,也就是LMTP server的socket是何种形式。假设LMTP server与postfix都位于同一台机器,而且LMTP server使用unix-domain socket,其文件位置是/var/imap/socket/lmtp,则virtual_transport应该这样设定:

virtual_transport = lmtp:unix:/var/imap/socket/lmtp

现在,每当postfix收到寄给virtual_mailbox_domains所列的任一网域的邮件,都会通过LMTP协议交给同机器上的POP/IMAP server来执行投递操作。

投递到外部程序

先前说过,virtual MDA不能处理系统别名文件与个人的.forward文件。虽然使用virtual_alias_maps可弥补虚拟网域的地址别名问题,但是.forward文件的一项重要功能--传递邮件内容给外部程序,还没解决。这表示虚拟网域的地址没有自动回信功能,也不能假设邮递列表管理系统。本节将示范如何利用postfix的其他机制,让寄到虚拟地址的邮件也可以传给外部程序。第一个例子示范如何投递邮件到一个自动回复程序,第二个例子以majordomo MLM来做示范。

自动回信程序的作用,主要是在没有任何人员接入操作的情况下,自动处理外来邮件、储存或处理来信信息,然后回信给原寄信人。回信程序可以是简单的脚步,也可以是以C或任何语言写成的复杂程序。

假设我们要提供一个供客户请求信息的服务,只要客户寄信到特定地址,就回复一封含有请求信息的回信。我们不希望使用人工处理这种千篇一律的机械工作,所以,最好的办法是写一个自动回复程序。

将虚拟网域的邮件传给自动回信程序

虚拟网域的邮件不能通过.forward机制传给外部程序,因此,若想让自动回信程序能收到虚拟地址的邮件,我们必须在master.cf中增加一个能投递邮件到外部程序的特殊MDA,然后使用传输表将特定地址的邮件交给这个特殊的MDA处理。

许多自动回信程序一次只能处理一封来信,而且一次只能回一封信。对于每一种MDA,都有一个限制收件人数量的mda_destination_recipient_limit参数,其中的mda是MDA在master.cf里的服务名称。

自动回信程序的设计

如果你想设计自己的自动回信程序,有些重要考虑事项必须注意。首先,同时也可能是最重要的事项,就是程序的数据来源是网络--一种不可信赖的数据源。千万别假设你要处理的数据一定会是什么样子,除了它们被可以安排成能征服你的系统之外。无论任何情况,都不应该调用shell来处理不可信的外来数据,让外界有机会夺取你的系统的访问权。

另一个要考虑的事项,是礼节教养问题。想像一下,如果自动回信程序的回信对象是一个含有几千人的邮箱列表,将客户请求的信息泄漏给几千人,或是让几千人收到不相干的邮件,应该都不是你原意见到的事。因此,在实际回信之前,最好先检查寄件人地址是否为owner-list或list-request之类的形式。此外,还有一些地址恐怕也是你不想回复的,像postmaster、daemon、majordomo等。你的程序应该将自己的信封地址设成空字符串,以免造成邮件循环。

许多邮件列表会利用precedence:标题栏来注明它自己。它们通常使用bulk之类的值来表示邮件的性质。你的回信程序应该要检查precedence:标题栏的值,如果发现bulk、list或junk之类的字样,就不必回信了。

最后,确定你的程序能记录每封来信的处理状况。一旦postfix将邮件托付给你的程序,你的程序就有检查错误的责任,并为管理员提供可以在事后追查问题的线索。

在虚拟网域假设邮件列表管理系统

第二各例子,我们要示范如何在虚拟网域上设置一个邮件列表。

postfix与MLM之间的连接是通过别名文件:利用别名文件的:include;机制来展开列表,并将管理用途的别名对应到实际地址与MLM管理程序。然而,只有local MDA才会处理系统的别名文件,virtual MDA没有这方面的功能。

虚拟邮件列表的原理,是在本地网域下创建列表的相同版本,这各本地版本仅供系统内部使用,外界用户所用的仍是虚拟地址,他们并部知道本地版本的存在。在决定本地版本的名称时,我们可设法将虚拟名称包含在内,以便容纳同系统上的其他虚拟网域列表。

通过上述文章的描述,我们可以清楚对Postfix虚拟网络域名有个了解,希望大家在以后的学习、办公中都能用到!


相关内容