安装软件系统
1)、安装MySQL4.0.x
为了与系统的软件系统区分开,这里将所有我们手动编译的服务器(DAEMON)软件安装在/usr/server中。
$ cd mysql-4.0.21
$ ./configure --prefix=/usr/server/mysql --localstatedir=/usr/server/mysql/db --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-user=mysql --with-charset=gb2312 --with-extra-charsets=all
$ make
$ su root
# make install
接下来安装mysql数据库
# pw useradd mysql -g mysql
# scripts/mysql_install_db
# chown -R mysql:mysql /usr/server/mysql/db
最后需要设置mysql的root口令
# /usr/server/mysql/bin/mysqladmin -uroot password 'your_password_goes_here'
口令设置完成后,暂时关闭mysql服务:
2)、安装Cyrus-sasl2
因为要查询MySQL数据库,所以我们需要在编译cyrus-sasl2时加上对MySQL的支持,同时我们打开了对plain和login两种验证方式的支持:
$ cd cyrus-sasl-1.2.19
$ ./configure --disable-anon -enable-plain --enable-login --enable-sql --with-mysql=/usr/server/mysql
$ make
$ su root
# make install
按照sasl的安装说明,需要建立一个symblink:
3)、安装Postfix2.1.x
首先,按照postfix的安装说明,建立postfix、postdrop组和postfix用户:
# pw groupadd postdrop
# pw useradd postfix -g postfix -G postdrop
用户和组建立好后,我们就可以开始编译Postfix了:
$ cd postfix-2.1.4
$ make tidy
$ make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/server/mysql/include/mysql -DUSE_SASL_AUTH -I/usr/local/include/sasl' 'AUXLIBS=-L/usr/server/mysql/lib/mysql -lmysqlclient -lm -lz -L/usr/local/lib -lsasl2'
$ make
$ su root
# make install
在执行make install的时候可能会得到如下的提示(如果没有就不用理会了:p):
这是因为我们的mysql不是安装在默认目录中的,所以需要告诉postfix应该到哪里去找libmysqlclient.so.12,使用ldconfig就可以达到这个目的:
然后再执行make install这里会出现很多问题,但postfix已经为我们设置好了默认的答案,直接使用这些答案就可以使postfix正常工作了,所以我们只要直接按回车就可以了。
到这里,支持mysql和sasl认证的postfix就已经安装成功了。
4)、安装Courier-imap
$ cd courier-imap-3.0.7
$ ./configure --prefix=/usr/server/courier-imap --with-authmysql --enable-unicode
configure: error: /usr/local/bin/bash './configure' failed for authlib
$ make
$ su root
# make install
配置系统
1)、建立用户数据表结构这里,我们直接使用postfixadmin-2.0.5的表结构,现在我们来解开postfixadmin:
$ cd postfixadmin-2.0.5
在postfixadmin-2.0.5.tgz中有一个DATABASE.TXT文件,其中描述了各个表的结构,它的内容如下:
# Postfix Admin Release 2.x #
#############################
#
# Copyright (c) 2002, 2003, 2004 High5!
# Created by: Mischa Peters
#
# This is the complete database structure for Postfix Admin.
# If you are installing from scratch you can use this file otherwise you
# need to use the TABLE_CHANGES.TXT or TABLE_BACKUP_MX.TXT that comes with Postfix Admin.
#
# There are 2 entries for a database user in the file.
# One you can use for Postfix and one for Postfix Admin.
#
# If you run this file twice (2x) you will get an error on the user creation in MySQL.
# To go around this you can either comment the lines below "USE MySQL" until "USE postfix".
# Or you can remove the users from the database and run it again.
#
# You can create the database from the shell with:
#
# mysql -u root [-p] < DATABASE.TXT
#
# Postfix / MySQL
#
USE mysql;
# Postfix user & password
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('postfix'));
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y');
# Postfix Admin user & password
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('postfixadmin'));
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'postfix', 'postfixadmin', 'Y', 'Y', 'Y', 'Y');
FLUSH PRIVILEGES;
GRANT USAGE ON postfix.* TO postfix@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfix@localhost;
GRANT USAGE ON postfix.* TO postfixadmin@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfixadmin@localhost;
CREATE DATABASE postfix;
USE postfix;
#
# Table structure for table admin
#
CREATE TABLE admin (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Admins';
#
# Table structure for table alias
#
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address),
KEY address (address)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';
#
# Table structure for table domain
#
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '-1',
mailboxes int(10) NOT NULL default '-1',
maxquota int(10) NOT NULL default '-1',
transport varchar(255) default NULL,
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain),
KEY domain (domain)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';
#
# Table structure for table domain_admins
#
CREATE TABLE domain_admins (
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';
#
# Table structure for table log
#
CREATE TABLE log (
timestamp datetime NOT NULL default '0000-00-00 00:00:00',
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
action varchar(255) NOT NULL default '',
data varchar(255) NOT NULL default '',
KEY timestamp (timestamp)
) TYPE=MyISAM COMMENT='Postfix Admin - Log';
#
# Table structure for table mailbox
#
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
maildir varchar(255) NOT NULL default '',
quota int(10) NOT NULL default '-1',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';
#
# Table structure for table vacation
#
CREATE TABLE vacation (
email varchar(255) NOT NULL default '',
subject varchar(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (email),
KEY email (email)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation';
现在将表结构导入到mysql中:
2)、配置postfix
首先需要更改/etc/postfix/main.cf中的一些基本参数,请按照自己的实际情况修改,本例以域名cnfug.org为例:
mydomain = cnfug.org
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost (这里没有使用$mydomain是因为我们将使用virtualhost)
inet_interfaces = all
alias_maps = hash:/etc/postfix/aliases
生成aliases表
在设置好以上基本参数后就需要设置支持virtualhost了,在本例中我们将所有的邮件全部存放在/var/mailbox中,同时因为iGENUS要在用户邮箱目录(Maildir)中建立文件和存放信息,所以就要求web服务器的用户要对用户邮箱目录有写的权限,所以我们在这里就将用户邮箱的uid和gid设置成web服务器的uid和gid以确保iGENUS正常工作,本例中web服务器的uid和gid都为80。在/etc/postfix/main.cf中加入:
virtual_mailbox_base = /var/mailbox/
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_mailbox_maps.cf
virtual_minimum_uid = 80
virtual_uid_maps = static:80
virtual_gid_maps = static:80
virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_alias_maps.cf
虚拟域名支持的配置比较简单,根据字意就可以看明白,不过有一点需要注意,/var/mailbox/最后的"/"字符不能省略。
在设置好虚拟域名的基本参数后,就需要设置每个MySQL查询配置文件了,我们将所有的MySQL查询配置文件统一存放在/etc/postfix/mysql中,每个查询配置文件的内容分别如下:
(1) /etc/postfix/mysql/mysql_mailbox_domains.cf
password = postfix
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and active='1'
(2) /etc/postfix/mysql/mysql_mailbox_maps.cf
password = postfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active='1'
(3) /etc/postfix/mysql/mysql_alias_maps.cf
password = postfix
dbname = postfix
table = alias
select_field = goto
where_field = address
additional_conditions = and active='1'
接下来开启sasl认证(为了与旧的MUA兼容所以加入broken_sasl_auth_clients的支持),在/etc/postfix/main.cf中加入:
smtpd_sasl_application_name = smtpd
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain = cnfug.org
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
最后我们需要建立/var/mailbox目录:
# chown www:www /var/mailbox
3)、配置sasl认证
在配置postfix的时候,我们设置了postfix使用的sasl配置文件为smtpd,所以现在我们需要配置sasl让它知道怎么从MySQL中读取认证信息:
pwcheck_method: auxprop
mech_list: plain login
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: SELECT password FROM mailbox WHERE username='%u@%r' and domain='%r' and active='1'
上面的选项中根本字意就可以了解它的意思,其中sql_select中的%u表示是用户名,%r表示是realm,通常为用户的域名(如果用户名中没有包含域名,则默认为服务器的域名),因为postfixadmin生成的用户名是user@domain.ltd的形式,而非标准的user形式,所以我们需要设置WHERE语句为username='%u$%r'即'用户名@域名'。
4)、配置courier-imap
要让courier-imap能够正确的读取MySQL中的认证信息,就需要配置authmysql的配置文件/usr/server/courier-imap/etc/authmysqlrc,本例中其内容如下:
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_USERNAME postfix
MYSQL_PASSWORD postfix
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_LOGIN_FIELD username
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD '80'
MYSQL_GID_FIELD '80'
MYSQL_HOME_FIELD '/var/mailbox/'
MYSQL_MAILDIR_FIELD maildir
MYSQL_NAME_FIELD name
MYSQL_QUOTA_FIELD quota
MYSQL_WHERE_CLAUSE active='1'
同postfix中的配置一样,/var/mailbox/最后的"/"字符不能省略。
接下来配置authdaemonrc:
因为我们这里只使用了authmysql模块,所以我们可以把其它验证模块去掉,编辑authdaemonrc文件,将其中的:
改成:
最后就是配置pop3d和imapd了,这里我们直接使用其默认设置:
# cp /usr/server/courier-imap/etc/pop3d-ssl.dist /usr/server/courier-imap/etc/pop3d-ssl
# cp /usr/server/courier-imap/etc/imapd.dist /usr/server/courier-imap/etc/imapd
# cp /usr/server/courier-imap/etc/imapd-ssl.dist /usr/server/courier-imap/etc/imapd-ssl
启动服务
1)、MySQL2)、Postfix
3)、Courier-imap
# /usr/server/courier-imap/libexec/pop3d.rc start
# /usr/server/courier-imap/libexec/imapd.rc start
如果你想系统在启动的时候自动运行以上这些服务,可以直接将上面的这些启动服务的命令加入到/etc/rc.local中(这里是以BSD UNIX为例子,如果是非BSD UNIX系统请自行将/etc/rc.local更改为相应系统自启动文件名)。
测试系统
在进行下一步前,我们可以先对后台系统进行一下测试,以确保后台系统已经正常工作。首先建立一个测试用户:mysql> use postfix;
mysql> insert into domain(domain,active) values('cnfug.org','1');
mysql> insert into mailbox(username,password,name,maildir,domain,active) values('test@cnfug.org','test','TESTER','cnfug.org/test/Maildir/','cnfug.org','1');
mysql> quit;
$ ls -al /var/mailbox
drwx------ 3 www www 512 Oct 16 23:15 cnfug.org
$ ls -al /var/mailbox/cnfug.org
drwx------ 3 www www 512 Oct 16 23:15 .
drwxr-xr-x 7 www www 512 Oct 16 23:24 ..
drwx------ 3 www www 512 Oct 16 23:15 test
$ ls -al /var/mailbox/cnfug.org/test
drwx------ 3 www www 512 Oct 16 23:15 .
drwx------ 3 www www 512 Oct 16 23:15 ..
drwx------ 5 www www 512 Oct 16 23:15 Maildir
$ ls -al /var/mailbox/cnfug.org/test/Maildir
drwx------ 5 www www 512 Oct 16 23:15 .
drwx------ 3 www www 512 Oct 16 23:15 ..
drwx------ 2 www www 512 Oct 16 23:15 cur
drwx------ 2 www www 512 Oct 16 23:18 new
drwx------ 2 www www 512 Oct 16 23:18 tmp
上面ls反回的结果可以看到,一个名为cnfug.org的目录已经被postfix建立,同时可以看到目录结构为/var/mailbox/DOMAIN.LTD/USERNAME/Maildir/,这与我们设置的完全相同。
测试SMTP认证:
$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.cnfug.org ESMTP Postfix
EHLO cnfug.org
250-mail.cnfug.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
AUTH LOGIN
334 VXNlcm5hbWU6
dGVzdEBjbmZ1Zy5vcmc=
334 UGFzc3dvcmQ6
dGVzdA==
235 Authentication successful
测试中使用的用户名是test@cnfug.org密码是test,我们的测试成功了。
测试pop3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
USER test@cnfug.org
+OK Password required.
PASS test
+OK logged in.
上面的提示表示我们的pop3登录也成功了 :)。
安装配置Postfixadmin-2.0.5和iGENUS_2.0.2
现在所有的后台服务已经正常工作了,现在我们就开始安装管理界面和用户界面。
1)、安装postfixadmin-2.0.5
postfixadmin可以在http://high5.net/postfixadmin处得到,下载后是一个名为postfixadmin-2.0.5.tgz的文件
$ mv postfixadmin-2.0.5 postfixadmin
$ cd postfixadmin
为了让postfixadmin正常工作,需要进行一些小的设置,将postfixadmin目录中的config.inc.php.sample复制为config.inc.php,然后编辑其中的参数:
$ vi config.inc.php
本例中的配置如下:
// Language files are located in './languages'.
$CONF['default_language'] = 'cn';
// Database Config
// 'database_type' is for future reference.
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfix';
$CONF['database_name'] = 'postfix';
$CONF['encrypt'] = 'cleartext';
// 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';
// Quota
// When you want to enforce quota for your mailbox users set this to 'YES'.
$CONF['quota'] = 'YES';
// When using maildrop use '102400' otherwise use '1048576'
$CONF['quota_multiplier'] = '1048576';
我们在这里使用明文口令方式($CONF['encrypt']='cleartext';),邮箱的存储格式使用domain.ltd/username的形式,所以设置:
$CONF['domain_in_mailbox'] = 'NO';
按照上面的设置,在postfixadmin建立新的虚拟用户的时候,其maildir的格式为domain.ltd/username,但iGENUS是在domain.ltd/username/Maildir中进行操作,所以我们需要对postfixadmin做一点小的修改以使其与iGENUS兼容。
首先修改postfixadmin目录中的create-mailbox.php,找到该文件中的:
{
if ($CONF['domain_in_mailbox'] == "YES")
{
$maildir = $fDomain . "/" . $fUsername . "/";
}
else
{
$maildir = $fDomain . "/" . $_POST['fUsername'] . "/";
}
}
else
{
$maildir = $fUsername . "/";
}
在其后面增加:
$maildir .= "Maildir/";
同时修改postfixadmin/admin目录中的create-mailbox.php,找到该文件中的:
{
if ($CONF['domain_in_mailbox'] == "YES")
{
$maildir = $fDomain . "/" . $fUsername . "/";
}
else
{
$maildir = $fDomain . "/" . $_POST['fUsername'] . "/";
}
}
else
{
$maildir = $fUsername . "/";
}
在其后面增加:
$maildir .= "Maildir/";
到这里我们的postfixadmin就修改基本完成,另外,在这里我们使用了postfixadmin的中文语言包($CONF['default_language'] = 'cn';),由于这个语言包是在postfixadmin2.0.4的基础上制作的,所以在2.0.5中使用需要做一个小的修改,以使其能够正确的显示中文编码:
找到该文件最前面的一行如下行:
在该行前面加入:
保存退出,到此,postfixadmin的修改就已经全部完成,现在可以将postfixadmin这个目录复制或上传到你的web目录中了,然后打开浏览器,进入postfixadmin的管理界面http://www.yourdomain.com/postfixadmin/admin/index.php,这里就可以新建域名和管理员了(注意,通过应该先建域名,再建立管理员)。然后用新建立的管理员登录到http://www.yourdomain.com/postfixadmin/index.php中就可以建立该域的邮箱了。
2)、安装iGENUS_2.0.2
从www.igenus.org处得到igenus_2.0.2_20040901_release.tgz,将其解开:
$ cd igenus
由于igenus使用了自己的表结构,所以要在postfix的基础上使用igenus的所有功能,还需要进行比较大的修改,这里我们就不再讨论,本文中我们就向大家介绍如何使用户能够登录到igenus中,并且正常的发邮件和收邮件,其它功能就不再介绍。
首先需要修改igenus的配置文件,让其它知道如何与MySQL连接:
$ vi config_inc.php
根据你的实际情况修改以下内容(配置中的中文为笔者说明):
// Mysql
$CFG_MYSQL_HOST = 'localhost';
$CFG_MYSQL_USER = 'postfixadmin'; //因为用户需要在igenus中更改密码等,所以需要使用对数据库具有写权限的postfixadmin用户,而非拥有只读权限的postfix用户
$CFG_MYSQL_PASS = 'postfix';
$CFG_MYSQL_DB = 'postfix';
// Temp directory for maildir listing,mail body decodeing etc.
$CFG_TEMP = $CFG_BASEPATH."/temp"; //这里我们将igenus的临时目录设置为igenus安装目录下的temp目录
现在需要建立temp文件夹,并使其可被web服务器的用户读写:
$ chmod 777 igenus/temp
同时要使igenus使用Postfixadmin的表结构,我们需要修改igenus目录中的login.php文件,以使用户能够正常登录。
修改其中的:
改为:
将:
$Post_passwd2 = $data['pw_passwd'];
$pw_id = $data['pw_id'];
$pw_shell = $data['pw_shell'];
$pw_gecos = $data['pw_gecos'];
$pw_gid = $data['pw_gid'];
$pw_domain = strtolower($data['pw_domain']);
$pw_name = strtolower($data['pw_name']);
修改为:
$Post_passwd2 = $data['password'];
$pw_shell = $data['quota'];
$pw_gecos = $data['name'];
$pw_domain = strtolower($data['domain']);
$pw_name = strtolower($data['username']);
其中$home = "/var/mail/" . $data['maildir'] . "../";是告诉iGENUS邮件存储的路径,"/var/mail/"为我们的邮件存放目录,同时因为iGENUS进行读写邮件时会在$home变量后面加上字符串"Maildir/",但我们的MySQL数据表mailbox中的maildir字段中已经包含"Maildir/",所以为了让iGENUS得到正确的路径,我们在最后加上了字符串"../"
将第100行:
改为:
注释或者删除:
保存修改,现在你就可以登录到igenus中了。
到这里,我们的Postfix Powered的邮件系统已经完成。