版权声明:本文可以任意转载,转载时请保持文章的完整性,并以超链接形式标明文章原始出处和作者信息及本声明。
http://geoffl.blog.163.com/
作者: 富贵猫
前阵子开始要做Postfix邮件服务器,网上搜了好多文章,不过大部分文章只是作者自己安装步骤的罗列,只能算授人以鱼,所以我看了之后还是需要去看Postfix的手册,还要看很多官方的参考书,看完之后颇有心得,所以就打算写一个“授人以渔”的系列安装设置的文章,让你知其然也知其所以然。
——————————————————————————–
Postfix作邮箱,有4种设置方式,分别是共享域名+系统帐户、独立域名+系统帐户、独立域名+虚拟帐户和虚拟域名+特殊格式邮箱。鉴于通常我们不可能给每个用户设置一个系统帐户,所以第一第二种就不考虑不介绍了。既然是用Postfix来建立我们自己地邮箱系统,所以也没必要去兜很多圈子设置特殊格式邮箱,所以第四种也不考虑。剩下只有一种方式,就是独立域名+虚拟邮箱。
所谓独立域名,就是即使用户名是一样的,但如果域名不同其邮件也将放置在不同的目录。譬如info@abc.com和info@def.com,这二个e-mail地址都以info为用户名,但域名不同,如果是共享域名,他们的mail将被放置在同一个目录下,而独立域名将放置在不同目录下。如果你们公司是很大的集团,下面分好几个公司,分别有独立的域名,这难免有重名的员工,这种情况下,后者显然是我们希望看到的。而所谓虚拟帐户,既然那些邮箱用户只是使用mail服务,我们当然没有必要去给每个用户在Linux下面开设一个个系统帐户,所以我们就用一些数据库之类的东西来保存这些帐户信息,譬如用哈希表、SQL数据库或者LDAP。我使用的是独立域名+虚拟LDAP帐户。
Postfix的安装我就不说了,非常简单。不过如果不会也没关系,后面我会写一篇关于Postfix+mail quota的,那时候需要下载、补丁和编译,等于是Postfix的安装。
LDAP也不说了,要完全掌握LDAP不是这篇能解决的,我只假设你的LDAP服务器里已经有mail这个字段。
下面开始说Postfix如何设置。Postfix的配置文件是/etc/postfix/main.cf,这是独立域名+LDAP的设置
# ===== Basic Setting =====
mail_owner = postfix
myhostname = pop.test.com
inet_interfaces = all
queue_directory = /var/spool/postfix
mynetworks = 127.0.0.0/8
home_mailbox =
# ===== Virtual Mailbox =====
virtual_mailbox_domains = hash:/etc/postfix/v_domains
virtual_mailbox_maps = ldap:/etc/postfix/v_mailbox_maps
virtual_mailbox_base = /var/spool/vhosts/
virtual_minimum_uid = 500
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = virtual
myhostname设置你的邮件服务器名字
inet_interfaces = all设置你在哪些网卡上监听
另外有几个是需要解释的:我们接受哪些域名的邮件?我们的域名下有哪些用户?他们的邮件存放在什么目录?
我们接受那些域名的邮件,这是由virtual_mailbox_domains来定义的。虽然我们可以直接使用
virtual_mailbox_domains = test.com, test2.com
这样的格式来定义这些域名,不过我还是建议如我这样使用一个表来存放,这样更方便日后的维护,表名是随意取的,有没有后缀都没关系,我用v_domains作为表的名字,在main.cf里定义是
virtual_mailbox_domains = hash:/etc/postfix/v_domains
v_domains的内容如下
test.com OK
test2.com OK
这是个text文件,仅仅包含域名,但为了满足哈希表的格式,所以在后面添加一个OK。然后我们还要把这个文件变成Postfix的数据库格式,因此用如下命令转变其格式
postmap v_domains
之后你会得到一个以db为后缀的文件v_domains.db。注意,每次修改完v_domains你都需要使用一次postmap。
我们有哪些用户,这是由virtual_mailbox_maps来决定。同样,你可以用哈希表,不过我还是用LDAP。为了方便你理解,我先说明一下如果用哈希表,它的格式应该是
user1@test.com test.com/user1_mailDirectory/
user2@test.com test.com/user2_mailDirectory/
user1@test2.com test2.com/user1_mailDirectory/
左边是用户的e-mail地址,空格之后是该用户的邮件存放目录。既然我们说了,独立域名代表info@abc.com和info@def.com的邮件放置在不同目录下,所以我们的定义里user1@test.com和user1@test2.com的目录是不同的。如果换成LDAP,我们要得到相同的结果,即用e-mail地址来搜索,得到其邮件存放目录
既然讲到邮件存放目录,就一并解释一下到底这个目录怎样定义的。邮件是存放在
virtual_mailbox_base\virtual_mailbox_maps\home_mailbox下,也就是说virtual_mailbox_base定义的目录下,postfix会根据virtual_mailbox_maps返回的用户目录自动创建该目录,然后如果home_mailbox也有定义,那么在用户目录下还会创建home_mailbox定义的名字。举例来说,按照上面的设置,邮件会存放在
/var/spool/vhosts/test.com/user1/下面。
如果home_mailbox不是空白而是Mail/,那么就会存放在
/var/spool/vhost/test/com/user1/Mail/下面。home_mailbox有什么用呢?举个例子,比方你已经有homeDirectory了,但那是你平时放文件的地方,那么再在同样目录下放邮件就变得很奇怪,所以需要home_mailbox来定义邮件放在你homeDirectory下的什么目录下
注意:地址的最后有没有”/”决定了使用mailbox格式还是maildir格式,没有”/”表示mailbox,有表示maildir。所以并不象大部分人认为的,home_mailbox定义为MailDir才表示使用maildir格式。再举几个例子
/var/spool/vhosts/test.com/user1/ 表示使用MailDir格式
/var/spool/vhosts/test.com/user1 表示使用MailBox格式
/var/spool/vhosts/test.com/user1/Mail/ 表示使用MailDir格式
/var/spool/vhosts/test.com/user1/MailDir/ 表示使用MailDir格式
/var/spool/vhosts/test.com/user1/MailDir 表示使用MailBox格式,即使home_mailbox是maildir,但没有最后的”/”,只能表示使用MailBox格式。同样道理
/var/spool/vhosts/test.com/user1/MailBox/ 表示使用MailDir格式,虽然home_mailbox是mailbox,但最后的”/”就说明了是使用MailDir格式。
回到virtual_mailbox_maps的LDAP定义,其格式是
virtual_mailbox_maps = ldap:/etc/postfix/v_mailbox_maps
v_mailbox_maps只是一个连接Postfix和LDAP的配置文件,同样文件名是随意取的。v_mailbox_maps的内容是
# LDAP Server的IP地址,我是设在和postfix同一电脑,所以是127.0.0.1
server_host = 127.0.0.1
# 下面这些关于LDAP Search的内容如果你不了解,请学习LDAP
search_base = ou=people,o=test
server_port = 389
bind = yes
bind_dn = cn=root,o=test
bind_pw = <rootpassword>
version = 3
# 下面是关键,我会额外解释
query_filter = (mail=%s)
result_attribute = mail
result_format = %d/%u/
query_filter = (mai=%s)里,query_filter表示搜索用的字段,mail是表示你LDAP里的字段名,%s表示要进入Postfix服务器的那封e-mail的收件人,mail=%s就是搜索LDAP里的mail字段等于收件人的结果。
result_attribute 是LDAP返回的字段,如果你已经在LDAP里定义了譬如homeDirectory或者mailDirectory这样的字段来存放邮件目录,那么你可以直接使用
result_attribute = homeDirectory
这样的格式来定义,那么它直接返回你定义的homeDirectory,而且不需要后面的result_format。我没有这个字段,但我想把用户邮件放在各自的域名下,就如user1@test.com在test.com/user1/下一样,所以我只需要它返回mail字段,然后用result_format来改变返回字段的格式。result_format顾名思义就是把结果format一下,其中%d表示e-mail地址@之后的域名,d应该是domain的首字母,%u表示e-mail地址@之前的用户名,想来u就是username之类的,所以返回的mail地址user1@test.com经过result_format之后就变成了test.com/user1/。注意,%d/%u/最后那个”/”表示我使用MailDir格式存放我的e-mail。
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
这2行表示邮件用什么身份的用户来存放,我定义了5000,所以你需要事先添加一个用户,并且其uid是5000
useradd postfixadmin –u 5000
名字是随意取的,只要注意uid和main.cf里这2行的定义相同就OK.
好了,如果一切顺利,你应该已经可以收到mail了,收件人没有存在在你LDAP里的那些邮件,会被退回。