Postfix有关Virtual、Aliases、虚拟表等概念之间的关系

来源:互联网 发布:杭州知味观礼盒 编辑:程序博客网 时间:2024/05/01 05:47

Postfix有关Virtual、Aliases、虚拟表等概念之间的关系 

作者:serial0 2005-02-01 11:30:57 来自:linuxforum.net

使用Postfix的别名、虚拟域、用MySQL数据库保存用户信息(Postfix+MySQL)等功能的用户,都会与Postfix中virtual、aliases、transport、本地投递、虚拟投递等相关概念打交道。这篇文档就是关于这些概念之间关系的论述。在文章最后,以若干Postfix+MySQL配置方案为例,说明这几个概念在方案中的应用。

1、首先是virtual。从左向右看这张图,首先遇到的是virtual。virtual是什么?virtual是一张重定向表,用于本地和非本地接收者或接收域的重定向操作。virtual的重定向是一个地址到地址的映射(map),它只是应用在邮件的接收者信封地址(recipient envelope address)部分,没有涉及到邮件的信息头和正文部分。这个重定向操作是在smtpd从网络上接收邮件后,由cleanup程序来完成的。Postfix的虚拟域支持就是通过它来实现的。
  virtual这张表,可以保存在数据库文件中,如/etc/postfix/virtual.db;也可以保存在数据库服务器上,如在MySQL库的一张表中;还可以保存在NIS、LDAP等等。具体的保存方式通过virtual_maps参数值来告诉Postfix。

2、然后我们继续向右看,接下来的是transport。在这里我们把transport看成一张表,Postfix根据这张表来决定哪些邮件由本地投递代理(local delivery agent)来执行,哪些邮件由虚拟投递代理(virtual delivery agent)来执行。至于这张表保存在什么地方,则由transport_maps参数来指定。
  注:这些邮件一般是根据它们的域进行区分,从而由不同的投递代理来处理。另外,我们不用这张表,完全由本地代理来投递,或是完全由虚拟代理来投递也都是可以的。

3、接着向右,图中给出的是本地投递代理。从图中可以看出,与本地投递代理相关的两个概念是aliases和.forward。 别名(alias)是由本地投递代理执行的一种系统内的邮件重定向机制,与virtual不同,别名是把整个邮件重定向到另外的一个或多个邮箱。aliases这张表,给出了别名和实际接收者的对应关系。
  aliases表的保存位置,由aliases_maps和aliases_database两个参数来指定。这两个参数互不相关,都发挥作用。aliases_database指定在本地上的别名数据库,是数据库文件形式。aliases_maps除了指定数据库文件外,还可以指定保存在nis或数据库服务器上的别名表。
  .forward则是在用户目录中的一个文件,也用于重定向邮件。但它和我们这里所讨论就没有关系了。这只是提一下。
  
4、虽然图上没有标出虚拟投递代理,但从transport部分描述,我们知道它是和本地投递代理处于同一级别(位置)的。virtual机制和本地投递代理最终都是把邮件投到系统中一个真实用户的邮箱,而虚拟投递代理所投的邮箱的主人(用户)不是系统真实用户。虚拟投递代理不支持aliases和.forward。它使用虚拟表(virtual table),这些表包括:

       virtual_mailbox_maps,指定保存虚拟用户邮箱的路径表在哪里。相关参数virtual_mailbox_base,指出邮箱路径的前缀;
       virtual_uid_maps,指出保存虚拟用户邮箱的uid的表在哪里,这是针对每个虚拟用户邮箱在系统中的uid都不一样的情况。虚拟用户的邮箱也可以共用一个uid值。
       virtual_gid_maps,这是关于虚拟用户邮箱的gid值。相关情况与uid相同。


最后,看几个Postfix+MySQL配置方案,看看这几个概念在其中是如何被应用的。(这些人水平都比我高多了,不敢妄加评论,只是用来验证一下自己的学习心得。)
(1)王兴宇的,http://www.cngnu.org/technology/Postfix_I.html

  main.cf配置“virtual_maps = hash:/etc/postfix/virtual,mysql:/etc/postfix/mysql-virtual.cf”,mysql库很简单,主要是username和FORWARD段。
  从以上可以看出,王先生的方案主要是用virtual表,向外提供多个虚拟域的邮箱,这些邮件地址最后都转向到本地邮箱上。

下面几个方案都是http://www.postfix.org/docs.html上提到的。

(2)Daniel V.Pedersen的,http://www.postfix.org/docs.html或http://kummefryser.dk/HOWTO/mail/postfix_mysql.html
这篇配置在main.cf中给出了多个映射表,但可以分成三类:
  1、virtual_maps,这是virtual表,保存在mysql库的remote_aliases表中,它完成从一个域名(邮箱地址)到另一个域名(邮箱地址)的转换,多域的支持就在这里完成了;
  2、transport_maps,对应mysql库中的transport表,它指出哪些域的邮件是交给投递代理(本地、虚拟),还是通过smtp转发给下一个中继主机;
  3、virtual_mailbox_maps、virtual_uid_maps、virtual_gid_maps,被虚拟投递代理使用,指出邮箱的路径、uid、gip值,这些信息都保存在mysql的aliases表中。
  这个方案中,用virtual表,完成邮箱地址的转换;用transport决定邮件的下一步投递方向(或处理者);用mysql中的一张表,来为虚拟投递代理服务。
  
(3)Kirby Menzel and LucasPeet的,http://www.postfix.org/docs.html或http://kirb.insanegenius.net/postfix.html
与上相同,在mysql提供三个表:
  Virtual表,用来提供多域邮箱地址的转换,虚拟域;
  Transport表,提供如何处理邮件投递:本地代理来做,还是虚拟代理来做;
  Users表,指出与邮件地址相对应的邮箱的位置、uid、gid。
  当然这篇配置中表的选项比上一篇丰富多了。但就我们这篇文章所讨论的问题来说,是一样的。

(4)Mischa Peters的,http://www.postfix.org/docs.html或http://high5.net/howto/
这个配置方案中:
  transport表不存在,这一块已经指定由虚拟投递代理来完成;
  mysql中的mailbox表,为虚拟投递代理指出邮箱的位置。至于邮箱的uid和gid都固定了,没在表中列出。
  前三个配置方案中的virtual表这一块,都是mysql中提供一个表,在main.cf中用一个virtual_maps参数来指示它。但在这个方案中,virtual_maps参数被“virtual_alias_maps”参数取代。在介绍这两个参数之前,首先对postfix的虚拟域的基本概念和方法做个简单的介绍,这是为了让阅读者在思路上更加顺利些。当然更详细参考/etc/postfix/virtual。
  postfix配置虚拟域时,需要告诉postfix两个东西:一是虚拟域的域名;二是虚拟域电子邮件地址的映射表,将一个虚拟域的邮件地址名映射到另一个邮件地址。
  从/etc/postfix/virtual文件告诉我们,postfix支持有两种风格(style)的虚拟域。一是sendmail风格,它将虚拟域邮件地址的映射表保存在/etc/postfix/virtual库中,而虚拟域的域名在main.cf的$mydestination参数中指出。王兴宇先生的做法就是这样的,只不过它把邮件地址的映射表保存到了mysql库中。二是postfix风格,将虚拟域的域名以及邮件地址映射表都保存在/etc/postfix/virtual中。每个虚拟域表的组织结构都一样,先是一行指出虚拟域名,接着是若干行的邮件地址映射表。
  现在开始说说这两个参数。virtual_maps是老版本postfix中的参数。sendmail风格时,虚拟域名和virtual表分别由$mydestination和$virtual_maps分别指出;postfix风格时,虚拟域名和virtual表都包含在一起了,由virtual_maps指出。而新版本postfix中,虚拟域名和virtual表被拆分到两个单独的文件(库)中,由两个参数分别指定。$virtual_alias_domains指出虚拟域名,$virtual_alias_maps指出virtual表。但为了和旧版本兼容,默认情况下,两者还都合并到一个文件中,由$virtual_alias_maps指出。
  新版本中使用$virtual_alias_domains和$virtual_alias_maps显然是方便了对于多虚拟域的支持。旧版中,如果是sendmail风格,虚拟域名要加到$mydestination参数中,几个虚拟域时还可以,如果是几十个上百个,这样的做法显然是不行了;如果是postfix风格,那两者混合在同一个文件中,那用数据库服务器来保存这表的话,好象有点问题吧(这样的做法,我没试验过能不能行,所以不能完全确定,有没有人这样做过的?)。讲过旧版的不足,那新参数的优点也就不用说了。
  讲了半天,再回到这个配置方案来,它并没有用到$virtual_alias_domains,而mysql_virtual_alias_maps.cf也只用到mysql中alias表的“goto”和“address”两个字段,那看来它是用新版本的默认方式,用$virtual_alias_maps来指出映射表。(但alias表中的“domain”字段又是用来做什么的?没看明白)
  在这个方案中,还多了一项“virtual_mailbox_domains =mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf”。首先,我们要明确virtual_mailbox_domains这个参数是用在虚拟投递代理的。它指出了一个域名列表,拥有这些域名的电子邮件才能够被postfix的虚拟投递代理处理。它也是代替在$mydestination参数指出一长串的域名。virtual_mailbox_domains参数所服务的方向(问题)应该和$virtual_alias_domains一样。
  在解读过本方案后,可以看出和前面三个方案相比,本方案在支持多个虚拟域方面做得更好一些。当然方案的好与坏,要看它们所针对的目标。

  写着写着,发觉自己所写的应该是postfix中邮件的重定向吧。除了以上提到的,postfix中的邮件重定向好象还有几个地方(参数),比如地址扩展的概念,$mailbox_transport等。