◆运行环境
操作系统是centos 5,其下载地址为www.centos.org,它是redhat as 5最佳的替代品(原因:开源且免费下载);postfix使用的版本是postfix-2.2.10.tar.gz,postfix(www.postfix.org)当前的稳定版本是2.4,由于2.4不支持SASL,所以我选了老一点的版本。其他所需的软件在下表列出:
名称 | 用途 | 下载地址 |
Apache (httpd- | Web方式管理邮件 | www.apache.org |
Php (php- | Php 解释器,与apache一起使用 | www.php.org |
Mysql (mysql- | 用数据库存储用户信息 | www.mysql.com |
Postfixadmin(postfix- | 邮件帐号后台web管理工具 | http://sourceforge.net/projects/postfixadmin/ |
SASL(cyrus-sasl- | 验证方法 | http://ftp.andrew.cmu.edu/pub/cyrus-mail/ |
Authlib(courier-authlib- | 与SASL一起做验证 | http://www.courier-mta.org/download.php |
Postfix | 邮件系统主程序 | http://www.postfix.org |
Courier-imap (courier-imap- | Pop3及IMAP服务 | |
Perl (perl- | 解释器 | http://www.cpan.org |
Maildrop (maildrop- | 邮件投递代理,直观的讲就是把收到的邮件转发到用户的邮箱目录 | |
Clamav (clamav-0.91.2.tar.gz) | 杀毒软件 | |
amavisd-new(amavisd-new- | 扫描邮件病毒 | http://www.ijs.si/software/amavisd |
Spamassassin(SpamAssassin | 防垃圾邮件 | http://spamassassin.apache.org/ |
Pcre (pcre-7.2.tar.bz2) | 安装Imap需要-- Perl兼容正则表达式 | http://www.pcre.org |
Extmail (extmail- | webmail |
◆准备工作
1、下载所需的软件:照上面给出的地址找到下载URL,然后用wget下载。由于服务器一般不安装xwindow这样的桌面环境,那怎样知道下载文件的url呢?用windows呢,通过securecrt这样的ssh工具连接和管理远程linux服务器,这样就很容易办到了。在实际的工作中,我习惯把文件下载到/root目录,原因是普通用户看不见我下载的东西。
![]() |
| 图 1 |
2、清理系统:不管你喜不喜欢,安装系统时sendmail这个邮件服务软件已经安装上去了,可是一山不容二虎,既然我们选定了功能强大的postfix,那么sendmail就一边歇着吧。运行命令 rpm -e -nodeps sendmail 就达到这个目的了。第2个需要卸载的软件是SASL,为什么要卸载它呢?因为系统自带的版本不太容易与authlib正常配合,所以需要把它删除掉。第3个要删除的是perl.本打算用系统自带的perl,可是在执行命令 perl -MCPAN -e shell时居然出现"segment fault",导致很多功能不能使用,看来也只好删了重装一个。下面总结一下这个过程:
1、SASL (1)列出包 rpm -qa | grep sasl cyrus-sasl- cyrus-sasl-gssapi- cyrus-sasl-devel- cyrus-sasl-ntlm- cyrus-sasl-md5- cyrus-sasl-sql- cyrus-sasl-plain- (2)删除包 rpm –e –nodeps cyrus-sasl- 然后进目录/usr/lib查一下 ls –al /usr/lib | grep sasl 应该没有目录sasl及sasl2了。 2、Perl (1)列出包 rpm -qa | grep perl perl-DateManip perl-XML-Encoding-1.01-26 perl-LDAP-0.31-5 perl-XML-LibXML-Common-0.13-7 groff-perl- openssl-perl- …………(省略若干) perl-suidperl- (2)删除包 rpm –e –nodeps perl-DateManip 执行完删除命令后,再运行命令perl –v,如果出现“-bash: perl: command not found”则表明已经把perl清理掉了。 |
3、创建邮件系统运行时所需的用户和组:创建用户和组绝不仅仅是为了练习userad和groupadd这两个命令,因为安全方面的原因,一些软件不能以root用户来运行,甚至在安装过程中,如果没有为该软件预先创建用户,安装将不能进行下去,因此,我们在这里先创建这些运行postfix系统所需的用户和组。对centos或redhat等发行版而言,用命令useradd创建用户时也就创建了一个同名的组,而另外一些linux发行版(如debian)或unix(如solaris 10),创建用户时并不会同时创建同名的组,这需要手动执行命令单独创建所需的组。下面我用表格的方式列出postfix系统所需要创建的用户及组的情况:
用户名 | 组名 | 作用 | 备注 |
mysql | Mysql | 数据库mysql运行用户 | |
vmail | Vmail | Postfix虚拟邮件帐号所使用的用户及组 | uid,gid:1001,1001 |
postfix | Postfix | Postfix主程序使用的帐号和组 | |
Postdrop | Postfix setgid_group | setgid_group=postdrop | |
amavis | Amavis | 邮件扫描 | |
clamav | Clamav | 病毒扫描 |
这里有2个值得注意的地方,它们是vmail用户、组及postdrop组。在postfix邮件系统中,有好几个程序是以vmail来运行的(这些情况将在后面逐个说明);postdrop这个组,我看了很多人写的文档,无一例外的都有创建这个组的操作,但没有任何人说明这个组是干什么用的,给人很突兀的感觉,因此我在这里特别把它列出来了-它的作用是setgid_group-在postfix的主配置文件main.cf里标明了的。
[root@mail ~]# grep postdrop /etc/postfix/main.cf setgid_group = postdrop |
◆安装apache,mysql和php
1、apache
tar zxvf httpd-2.2.0.tar.gz
cd httpd-2.2.0
./configure -prefix=/usr/local/apache -enable-so //选项prefix,enanle前面是两个"-"
make
make install
上述步骤执行完毕后,将生成目录/usr/local/apache,进入这个目录检查一下,看相关的文件和目录是否存在?下图是一个正确安装apache后的目录结构:
![]() |
| 图 2 |
执行命令 /usr/local/apache/bin/httpd -l检查编译进来的模块有哪些。最主要的是mod_so模块。即下面最后一个mod_so.c。这样做的目的是为了以模块方式加载php.现在我们先不忙着配置apache,等到后面再做这个工作。
2、mysql
tar zxvf mysql-5.0.41.tar.gz
cd mysql-5.0.41
./configure -prefix=/usr/local/mysql
make,make install //安装完成
useradd mysql
cp support-files/my-medium.cnf /etc/my.cnf
cd /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql //初始化数据库
chown -R root .
chown -R mysql var
chgrp -R mysql .
3、php
cd //进/roor目录
tar zxvf php-5.2.3.tar.gz
cd php-5.2.3
./configure -prefix=/usr/local/php -with-apsx2=/usr/local/apache/bin/apxs -with-mysql=/usr/local/mysql //如果不先安装mysql,这一步将不能进行下去
make;make install
cp php.ini-dist /usr/local/php/lib/php.ini
在配置过程中,除了指定安装目录外,还有-with-apxs2和-with-mysql这两个选项。-with-apxs2的作用是与apache的工具apxs配合,产生模块文件到目录/usr/local/apache/modules/,同时在apache的配置文件中写入一行"LoadModule php5_module modules/libphp5.so";
[root@myest modules]# ll total 12212 -rw-r--r-- 1 root root 8873 Jul 30 14:55 httpd.exp -rwxr-xr-x 1 root root 12473318 Jul 31 09:29 libphp5.so |
选项-with-mysql的作用非常重要,如果不加这个,以后在使用web管理工具postfixadmin时将出现不能连接数据库的错误。接着我们需要把php与apache整合在一起,这个过程很简单,由于在安装php时已经完成了一部分工作,接下来只要在apache的配置文件httpd.conf加上"AddType application/x-httpd-php .php"这么一行就行了(注意:.php前面有一个空格)。在目录/usr/local/apache/htdocs下创建一个最简单的php测试文件,其内容为:
vi test.php phpinfo(); ?> |
检查一下apache配置文件是否正确(/usr/local/apache/bin/apachectl -t),输出"Syntax OK"后就可以启动apache服务(/usr/local/apache/bin/apachectl start)。在别的机器的浏览器输入我们配置的这个服务器的url,正常的话,将得到类似下图的页面:
![]() |
| 图 3 |
上面几个软件的安装相对来说还是比较容易操作的,这里我全是用GNU源码定制安装,这相对于2进制包的安装方式而已,有几个好处:①软件的相互依赖性较小(安装过rpm包的人对这个应该有深刻的认识)。②跨平台。这样的安装方式适用各种unix/linux系统。③维护方便。使用了选项-prefix指定安装目录,所有的文件目录都集中在这个安装目录里,维护起来非常方便。因此,在这里强烈推荐大家适用GNU源码方式安装。
◆安装和配置SASL、Authlib
最好先安装courier-authlib。为什么呢?因为后面配置 SASL验证smtp时需要authlib的socket路径。
1、安装和配置courier-authlib
1)安装
tar jxvf courier-authlib-0.59.3.tar.bz2
cd courier-authlib-0.59.3
./configure --with-redhat --with-authmysql=yes --with-mailuser=vmail\ --with-mailgroup=vmail --with-mysql-libs=/usr/local/mysql/lib/mysql\ --with-mysql-includes=/usr/local/mysql/include/mysql\
--prifix=/usr/local/authlib --without-stdheaderdir
make
make install
make install-configure
一般情况下,anthlib的安装应该是容易完成的。安装完成后,我们先找出配置文件中authdaemonvar的设置,这个值是干什么用的呢?它是后面SASL验证SMTP所必须的,因此需要先把它找出来,以便后面的配置能够准确无误。关于这个问题的教训,在配置sasl的时候再做说明。在我的安装中,authdaemonvar的设置如下:
[root@mail ~]# grep "authdaemonvar" /usr/local/authlib/etc/authlib/authdaemonrc ##NAME: authdaemonvar:2 # authdaemonvar is here, but is not used directly by authdaemond. It's authdaemonvar=/usr/local/authlib/var/spool/authdaemon |
(2)配置authlib.在目录/usr/local/authlib/etc/authlib中,修改文件authdaemonrc及authmysqlrc。
vi /usr/local/authlib/etc/authlib/authdaemonrc 修改上面3项,其他的项保持不便。这个修改前2行表示用mysql认证模块;把DEBUG_LOGIN的值有默认的“0”改成“2”的用意是运行postfix时有更多的信息输出,通过生成的日志以帮助排错。 |
vi /usr/local/authlib/etc/authlib/authmysqlrc MYSQL_DATABASE postfix MYSQL_SOCKET /tmp/mysql.sock DEFAULT_DOMAIN sery.com MYSQL_LOGIN_FIELD username MYSQL_NAME_FIELD name 照上面的格式修改,这是比较容易出错的地方,要特别小心。我曾经把MYSQL_USER_TABLE mailbox这一项的mailbox写成mailbov导致sasl验证一直没法通过!特别注意MYSQL_UID_FIELD和MYSQL_GID_FIELD字段的值,这里是‘1001’,也可以是其它的,但一定要与vmail用户及组相一致(id vmail可以得出这2者的值) |
2、安装和配置SASL.
(1)安装
tar zxvf cyrus-sasl-2.1.21.tar.gz
cd cyrus-sasl-2.1.21
./configure --disable-anon -enable-plain --enable-login --enable-sql --with-mysql=/usr/local/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --with-mysql-libs=/usr/local/mysql/lib/mysql --with-authdaemond
make
make install
如果在编译过程(make)出现错误,如“client.c:64: error: static declaration of 'global_callbacks' follows non-static declaration saslint.h:112…”,需要加一个补丁程序,然后再执行编译过程。
用vi在当前位置创建补丁文件,起名为sasl.patch,其内容包括:
--- cyrus-sasl- +++ cyrus-sasl- @@ -61,7 +61,7 @@ static cmech_list_t *cmechlist; /* global var which holds the list */ -static sasl_global_callbacks_t global_callbacks; +sasl_global_callbacks_t global_callbacks; static int _sasl_client_active = 0; |
ln -s /usr/local/lib/sasl2 /usr/lib/sasl2 //sasl的安装目录是/usr/local/lib/sasl
echo "/usr/local/lib" >> /etc/ld.so.conf //指定动态连接库的位置
ldconfig //共享动态链接库生效
(2) 配置
创建文件 /usr/local/lib/sasl2/smtpd.conf,并加入如下内容:
pwcheck_method: authdaemond mech_list: PLAIN LOGIN log_level: 3 authdaemond_path: /usr/local/authlib/var/spool/authdaemon/socket |
最后一行authdaemond_paeth的设置来自anthlib 的配置文件authlibdaemonrc,千万不要把这个弄错了,我当初的smtp验证一直通不过就是由于这个原因。通过查看进程也可以知道这个路径(前提是authlib正常运行了),如下图所示:
![]() |
| 图 4 |
Sasl2需要使用文件/usr/local/authlib/var/spool/authdaemon/socket,但默认情况下,其属性是744,需要把它加上执行权限,以便文件属组(主)而外的其它用户可以执行。运行命令
chmod +x /usr/local/authlib/var/spool/authdaemon
即可,如果不这样处理,smtp验证无一例外会失败的。那么这里所说的其它用户是什么用户呢?答:postfix。
◆安装和配置postfixadmin
Postfixadmin是postfix邮件系统的web管理工具,有了这个工具,管理和维护用户帐号就方便多了。假如不用工具,就需要手动修改数据库,谁愿意这样做?安装postfixadmin比较简单,解压包postfix-2.2.11.tar.gz,然后把它移动到某个目录下,其过程如下:
cd /root tar zxvf postfixadmin- mv postfixadmin- |
现在postfixadmin的目录是/var/www/postfixadmin,为了能够让它按照我们的意愿工作,需要用命令 chown -R vmail:vmail /var/www/postfixadmin 更改属主。这样,postfixadmin的安装就算完成了。接着我们来配置它,这个过程要复杂一点,我在这里分几步进行。
(1)修改相关的配置文件。Postfixadmin第一个需要修改配置文件是config.inc.php,但事实上却没有这个文件,不要紧,把config.inc.php.sample搬过来就是了(cp config.inc.php.sample config.ini.php),再来看一下目录结构:
[root@mailserv2 postfixadmin]# pwd /mail/www/postfixadmin [root@mailserv2 postfixadmin]ll total 236 drwxr-xr-x 2 vmail vmail 4096 Sep 16 16:06 ADDITIONS drwxr-xr-x 2 vmail vmail 4096 Sep 16 19:31 admin -rw-r--r-- 1 vmail vmail 1195 Sep 16 16:06 BACKUP_MX.TXT -rw-r--r-- 1 vmail vmail 10155 Sep 16 16:06 CHANGELOG.TXT -rw-r----- 1 vmail vmail 4700 Sep 16 16:14 config.inc.php -rw-r--r-- 1 vmail vmail 4694 Sep 16 16:06 config.inc.php.sample -rw-r----- 1 vmail vmail 3774 Sep 16 16:06 create-alias.php -rw-r----- 1 vmail vmail 7379 Sep 16 19:24 create-mailbox.php -rw-r--r-- 1 vmail vmail 4910 Sep 16 16:06 DATABASE_MYSQL.TXT -rw-r--r-- 1 vmail vmail 4955 Sep 16 16:06 DATABASE_PGSQL.TXT -rw-r----- 1 vmail vmail 2497 Sep 16 19:30 delete.php -rw-r----- 1 vmail vmail 1727 Sep 16 16:06 edit-active.php -rw-r----- 1 vmail vmail 3013 Sep 16 16:06 edit-alias.php -rw-r----- 1 vmail vmail 4026 Sep 16 16:06 edit-mailbox.php -rw-r----- 1 vmail vmail 25031 Sep 16 16:06 functions.inc.php drwxr-xr-x 2 vmail vmail 4096 Sep 16 16:06 images -rw-r----- 1 vmail vmail 3994 Sep 16 16:06 index.php -rw-r--r-- 1 vmail vmail 2655 Sep 16 16:06 INSTALL.TXT drwxr-xr-x 2 vmail vmail 4096 Sep 16 16:06 languages -rw-r--r-- 1 vmail vmail 1651 Sep 16 16:06 LANGUAGE.TXT -rw-r--r-- 1 vmail vmail 5375 Sep 16 16:06 LICENSE.TXT -rw-r----- 1 vmail vmail 1743 Sep 16 16:06 login.php -rw-r----- 1 vmail vmail 494 Sep 16 16:06 logout.php -rw-r----- 1 vmail vmail 869 Sep 16 16:06 main.php -rw-r--r-- 1 vmail vmail 981 Sep 16 16:06 motd-admin.txt.orig -rw-r--r-- 1 vmail vmail 262 Sep 16 16:06 motd.txt -rw-r--r-- 1 vmail vmail 262 Sep 16 16:06 motd-users.txt -rw-r----- 1 vmail vmail 4827 Sep 16 16:06 overview.php -rw-r----- 1 vmail vmail 2314 Sep 16 16:06 password.php -rwxr-xr-x 1 vmail vmail 392 Sep 16 16:08 postfix_chmod.sh -rw-r----- 1 vmail vmail 3233 Sep 16 16:06 search.php -rw-r----- 1 vmail vmail 2119 Sep 16 16:06 sendmail.php -rw-r----- 1 vmail vmail 5506 Sep 16 16:06 setup.php -rw-r----- 1 vmail vmail 4204 Sep 16 16:06 stylesheet.css -rw-r--r-- 1 vmail vmail 456 Sep 16 16:06 TABLE_BACKUP_MX.TXT -rw-r--r-- 1 vmail vmail 3737 Sep 16 16:06 TABLE_CHANGES.TXT drwxr-xr-x 2 vmail vmail 4096 Sep 16 16:06 templates -rw-r--r-- 1 vmail vmail 2303 Sep 16 16:06 UPGRADE.TXT drwxr-xr-x 2 vmail vmail 4096 Sep 16 16:06 users -rw-r----- 1 vmail vmail 1949 Sep 16 16:06 variables.inc.php -rw-r----- 1 vmail vmail 1965 Sep 16 16:06 viewlog.php drwxr-xr-x 2 vmail vmail 4096 Sep 16 16:06 VIRTUAL_VACATION |
在上面的目录输出中,我将要处理的文件或目录用了粗字体来标识了,先从config.ini.php动手吧。
[root@mailserv2 postfixadmin]# more config.inc.php // // Postfix Admin // by Mischa Peters // Copyright (c) 2002 - 2005 High5! // License Info: http://www.postfixadmin.com/?file=LICENSE.TXT // // File: config.inc.php // if (ereg ("config.inc.php", $_SERVER['PHP_SELF'])) { header ("Location: login.php"); exit; } // Postfix Admin Path // Set the location to your Postfix Admin installation here. $CONF['postfix_admin_url'] = ''; $CONF['postfix_admin_path'] = ''; // Language config // Language files are located in './languages'. $CONF['default_language'] = 'cn'; // Database Config // mysql = MySQL 3.23 and 4.0 // mysqli = MySQL 4.1 // pgsql = PostgreSQL $CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfixadmin'; $CONF['database_password'] = 'postfixadmin'; $CONF['database_name'] = 'postfix'; $CONF['database_prefix'] = ''; …………………………省略若干………………………………………. // Mailboxes // If you want to store the mailboxes per domain set this to 'YES'. // Example: /usr/local/virtual/domain.tld/username@domain.tld $CONF['domain_path'] = 'YES'; // If you don't want to have the domain in your mailbox set this to 'NO'. // Example: /usr/local/virtual/domain.tld/username $CONF['domain_in_mailbox'] = 'NO'; …………………………省略若干………………………………………. // Default Domain Values // Specify your default values below. Quota in MB. $CONF['aliases'] = '1000'; $CONF['mailboxes'] = '1000'; $CONF['maxquota'] = '1000'; …………………………省略若干………………………………………. // Quota // When you want to enforce quota for your mailbox users set this to 'YES'. $CONF['quota'] = 'NO'; // You can either use '1024000' or '1048576' $CONF['quota_multiplier'] = '1024000'; …………………………省略若干………………………………………. ?> |
被改动过的内容用红色粗体标记出来了,这些值可根据实际情况作修改。下一个需要修改的文件是create-mailbox.php: