全面介绍了利用postfix建立一套完整的邮件服务器的方法,包括了smtp认证、imap认证以及webmail等相关技术问题,文章完整翔实全面,可即看即用。
1. 概述
1.1. 目的
本文试图介绍如何在一个linux平台上安装一套功能完整的邮件系统。这里我们以postfix做smtp服务器、cyrus-imap做pop3/imap4服务器、通过cyrus-sasl对存储在mysql数据库中的用户进行验证和授权,并且使用imp来提供一个完善的webmail界面。
这个邮件系统的设计目标是提供一个可扩充的、具备大多数功能的邮件系统。
本文的最新版本可以在这里找到:
格式 url
简体中文/html http://www.cngnu.org/technology/postfix_i.html
繁体中文/html http://www.cngnu.org/technology/postfix_i.tw.html
简体中文/text http://www.cngnu.org/technology/postfix_i.txt
繁体中文/text http://www.cngnu.org/technology/postfix_i.tw.txt
有关本文所涉及的技术问题,请到http://www.chinaunix.net/forum/viewforum.php?f=14的mail版讨论,我会尽快回复的。
本文的版权遵循gpl,可以在不删除版权信息和注明修改的情况下任意传播。
1.2. 更新历史
2002-05-21 第一次发布,版本0.20。
2002-08-13 修正一些错误,版本0.21。
2002-08-23 修正一些错误,版本0.22。
2002-09-12 在redhat linux advance server v2.1上进行了测试,修正了一些错误,版本0.30。
2002-12-12 修正了一些错误,添加了imp部分的内容,版本0.31。
2003-01-30 修正了一些错误,添加了非明文密码部分的内容,版本0.32。
2003-02-05 修正了一些错误,版本0.33
2003-03-26 使用了sasl v2和cyrus-imap 2,支持使用db4的新的linux发行版,如redhat 8.0和mandrake 9.0,并以redhat 8.0为示范平台。修正了一些错误,版本0.40。
2003-03-28 修正了一些错误,特别感谢bjchenxu,版本0.41。
1.3. todo
增加邮件列表功能
增加ssl部分的内容
增加虚拟域部分的内容
翻译:希望有能力的朋友可以翻译这篇文章为英文,这样国外的朋友也可以看到
1.4. 鸣谢
谢谢lesson.ward、yunping zhu、temp、bjchenxu的指正。
参考文档:http://www.delouw.ch/linux/postfix-cyrus-web-cyradm-howto/html/index.html。在这篇文章撰写之初,参考过该文章,目前该文章也在不断更新,大家也可以看看。
2. 系统功能
系统逻辑结构:
+---------------------------------------------------+
| |
| 25/25 25/25 110/993 143/995 80/443 |
| incoming outgoing pop3 imap web-mail |
| / / / / / |
| || || || || || |
| / / / / / |
+-------------------+---------------+---------------+
| postfix | | imp |
| | +---------------+
| | cyrus-imap |
| +-----------+-------------------------------+
| | cyrus-sasl |
| +-------------------------------------------+
| | saslauthd |
| +-------------------------------------------+
| | pam |
| +-------------------------------------------+
| | pam_mysql |
+-------+-------------------------------------------+
| mysql |
+---------------------------------------------------+
整个系统对外的界面包括几个部分,用来发信的smtp、用来收信的pop3和imap、以及一个web界面的邮件使用系统。这里没有提供web界面的管理工具,需要大家自行依据实际需要开发。
mysql作为系统中存储数据的核心,它存储了用户的信息。这个信息不但用于pop3/imap和smtp auth的认证需要,而且也为postfix提供了本地接收者的列表和转发功能。
认证流程比较繁琐。整个认证是通过cyrus-sasl来做的,通过运行一个守护进程saslauthd来监听认证需求。saslauthd这里使用了pam认证方式通过pam_mysql插件对mysql数据库进行查找。
3. 系统基本前提
本文以linux系统为目标平台,支持多数的linux平台如redhat 7.x/8.x、mandrake 8.x/9.x等,理论上也会支持其他的linux发行版,甚至其他的unix系统。
这里以redhat linux v 8.0为说明平台。
该说明平台除了基本的操作系统部分外,系统中还安装了如下的rpm:
一、gcc:
1. gcc-3.2-7
2. gcc-c++-3.2-7
二、db3:
1. db4-devel-4.0.14-14
2. db4-4.0.14-14
3. db4-utils-4.0.14-14
三、pam:
1. pam-0.75-40
2. pam-devel-0.75-40
四、mysql:
1. mysql-3.23.52-3
2. mysql-server-3.23.52-3
3. mysql-devel-3.23.52-3
五、imp相关:
1. httpd-2.0.40-8
2. httpd-devel-2.0.40-8
2. gettext-0.11.4-3
3. imap-devel-2001a-15
4. krb5-libs-1.2.5-6
5. krb5-devel-1.2.5-6
6. openssl-0.9.6b-29
7. openssl-devel-0.9.6b-29
如果系统中没有,请自行安装rpm包或编译安装。除此之外,其他需要的部分将以源码方式编译。
4. 配置mysql
4.1. 运行
启动命令如下:
[root@mail root]# /etc/init.d/mysqld start
4.2. 测试
启动mysql后,首先检查日志/var/log/messages有无错误信息,然后检查进程,应该有如下进程存在:
[root@mail root]# pstree | grep mysqld
|-safe_mysqld---mysqld---mysqld---2*[mysqld]
接着检查端口,应该有如下端口打开:
[root@mail root]# netstat -an | grep listen
tcp00 0.0.0.0:33060.0.0.0:*listen
4.3. 配置
mysql安装配置好以后,在mysql中创建邮件用户数据库,并添加一个测试用户“tester”:
[root@mail root]# mysql mysql
reading table information for completion of table and column names
you can turn off this feature to get a quicker startup with -a
welcome to the mysql monitor. commands end with ; or g.
your mysql connection id is 1 to server version: 3.23.52
type help; or h for help. type c to clear the buffer.
mysql> create database mail;
query ok, 1 row affected (0.00 sec)
mysql> grant all on mail.* to mail@localhost
-> identified by "secret";
query ok, 0 row affected (0.00 sec)
mysql> flush privileges;
query ok, 0 row affected (0.00 sec)
mysql> use mail;
database changed
mysql> create table user (
-> username varchar(32) not null default ,
-> password varchar(64) not null default ,
-> forward varchar(128) not null default ,
-> patition varchar(32) not null default default,
-> quote int not null default 1024,
-> status tinyint not null default 1);
query ok, 0 rows affected (0.00 sec)
mysql> create index user on user (username,password,forward,status);
query ok, 0 rows affected (0.00 sec)
records: 0 duplicates: 0 warnings: 0
mysql> insert into user (username,password,forward)values
-> (tester,$1$pi.wvgbx$a3duczbnby76jnzlqwqcq/,tester);
query ok, 1 row affected (0.01 sec)
mysql> q
bye
上面的mail数据库的user表用来保存用户信息:
username和password字段就是用户名和md5-crypt密码。这里采用了加密密码是为了更好的安全性。
forward字段默认情况下与username一样,在此情况下,邮件递交到本地邮箱(由于postfix区分邮箱的大小写,所以通过这样的一个转发,正好可以消除大小写的区别);如果forward字段是另外一个用户名或者邮件地址,则该邮件被转发到别的用户或其它邮件地址。
status字段用来指示该用户是否有效,可以通过修改该值为0来临时禁止某个用户。
5. 安装pam_mysql
5.1. 下载
http://sourceforge.net/projects/pam-mysql/
[root@mail root]# cd /usr/src
[root@mail src]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.4.7.tar.gz
注:如果不能访问该网站取得pam_mysql,请自行使用代理服务器访问。
5.2. 编译与安装
编译pam_mysql:
[root@mail src]# tar -zxf pam_mysql-0.5.tar.gz
[root@mail src]# cd pam_mysql
修改pam_mysql.c的源代码,去掉调试消息:
[root@mail pam_mysql]# vi +54 pam_mysql.c
将如下一行:
#define debug
修改为:
/* #define debug */
然后编译:
[root@mail pam_mysql]# make
[root@mail pam_mysql]# cp pam_mysql.so /lib/security
有些情况下,这个编译会报错,但是如果编译能生成pam_mysql.so模块,还是可以用的。
5.3. 配置
创建/etc/pam.d/mail,它用来支持cyrus-imap的imap认证、pop认证和postfix的smtp认证:
[root@mail pam_mysql]# cd /etc/pam.d
[root@mail pam.d]# echo auth sufficient pam_mysql.so user=mail passwd=secret
> host=localhost db=mail table=user usercolumn=username passwdcolumn=password
> crypt=1> /etc/pam.d/mail
[root@mail pam.d]# echo account required pam_mysql.so user=mail passwd=secret
> host=localhost db=mail table=user usercolumn=username passwdcolumn=password
> crypt=1>> /etc/pam.d/mail
[root@mail pam.d]# echo auth sufficient pam_unix_auth.so >> /etc/pam.d/mail
[root@mail pam.d]# echo account sufficient pam_unix_acct.so >> /etc/pam.d/mail
这里前面两行是指通过mysql数据库来认证用户,后面两行指是通过unix的基本方式认证用户(即系统用户)。这里我们之所以保留unix系统认证模式,是因为我们下面要通过系统用户cyrus来管理cyrus-imap邮箱。不过你也可以选择将这个管理帐号cyrus放入mysql认证数据库里面,只需要你在上面的数据库里面添加一个cyrus用户。
通过给上面的crypt赋予不同的值可以使用多种密码存储方式:
crypt=0:表示使用明文来存储密码。这样存储的好处是简单,但是不够安全。
crypt=1:表示使用unix系统的des加密密码方式来存储。即通常的unix的/etc/passwd(老式系统加密口令存储在这里)或/etc/shadow(较为新的系统加密口令存放在这里)中存储的加密口令。加密口令有两种,一种是普通的des加密的,也叫crypt(),这种密码是13位长,前面两个字符是加密种子;还有一种是使用了md5算法增强了的,也叫md5 crypt(),这种密码的加密种子是以$1$开头的12个字符,密码长度不定。
crypt=2:表示使用mysql的sql函数password()加密方式来存储。
crypt=3:表示使用md5的散列方式来存储。这种方式和md5 crypt()是不一样的。
一般如果从系统用户迁移到使用数据库的虚拟用户时,可以使用crypt=1方式,系统会自动辨别两种加密口令。如果需要开发用户修改口令的功能时,c和perl里面的crypt函数不能支持md5 crypt()口令,需要使用额外的编程或模块来支持。
做个符号链接/etc/pam.d/imap,它用来支持cyrus-imap的imap认证:
[root@mail pam.d]# [ -f imap ] && mv imap imap.orig
[root@mail pam.d]# ln -s mail imap
同样创建/etc/pam.d/pop ,它用来支持cyrus-imap的pop3认证:
[root@mail pam.d]# [ -f pop ] && mv pop pop.orig
[root@mail pam.d]# ln -s mail pop
同样创建/etc/pam.d/smtp ,它用来支持postfix的smtp auth认证:
[root@mail pam.d]# [ -f smtp ] && mv smtp smtp.orig
[root@mail pam.d]# ln -s mail smtp
系统上可能已经存在了这些文件,请将原来的改名或者删除。
6. 安装cyrus-sasl
6.1. 下载
http://asg.web.cmu.edu/cyrus/download/
[root@mail pam.d]# cd /usr/src
[root@mail src]# wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.12.tar.gz
6.2. 编译与安装
编译cyrus-sasl,只支持需要的plain和login认证方式:
[root@mail src]# tar -zxvf cyrus-sasl-2.1.12.tar.gz
[root@mail src]# cd cyrus-sasl-2.1.12
[root@mail cyrus-sasl-2.1.12]# ./configure --disable-sample
> --disable-pwcheck --disable-cram --disable-digest
> --disable-krb4 --disable-gssapi --disable-anon
> --with-saslauthd=/var/run/saslauthd
> --enable-plain --enable-login
[root@mail cyrus-sasl-2.1.12]# make
[root@mail cyrus-sasl-2.1.12]# make install
[root@mail cyrus-sasl-2.1.12]# [ -d /usr/lib/sasl2 ] && mv /usr/lib/sasl2 /usr/lib/sasl2.orig
[root@mail cyrus-sasl-2.1.12]# ln -s /usr/local/lib/sasl2 /usr/lib/sasl2
系统上如果已经安装了sasl 2,请先删除这些rpm或/usr/lib/sasl2这个目录。
加载链接库:
[root@mail cyrus-sasl-2.1.12]# echo /usr/local/lib >> /etc/ld.so.conf
[root@mail cyrus-sasl-2.1.12]# echo /usr/local/lib/sasl2 >> /etc/ld.so.conf
[root@mail cyrus-sasl-2.1.12]# ldconfig
6.3. 配置
设置postfix使用sasl的saslauthd认证守护进程来支持smtp auth认证:
[root@mail cyrus-sasl-2.1.12]# echo pwcheck_method: saslauthd > /usr/lib/sasl2/smtpd.conf
cyrus-imap的sasl配置不使用标准的sasl语法,它的配置文件放在/etc/imapd.conf中,详细配置在cyrus-imap部分说明。
6.4. 运行
运行saslauthd守护进程,并使其使用pam认证模式来提供认证信息:
[root@mail cyrus-sasl-2.1.12]# /usr/local/sbin/saslauthd -a pam
整个系统使用的认证机制比较复杂。所有的应用(smtp、imap、pop3等)都采用sasl v2的saslauthd来认证;而saslauthd是通过它所支持的pam模式来借助pam_mysql接口对存储在mysql数据库中用户信息进行认证的。请参阅上面的系统结构以了解认证流程。
7. 安装postfix
7.1. 下载
http://www.postfix.org/ftp-sites.html
[root@mail cyrus-sasl-2.1.12]# cd /usr/src
[root@mail src]# wget http://postfix.energybeam.com/source/official/postfix-2.0.7.tar.gz
7.2. 编译与安装
如果你的系统上原来有sendmail,先将其停止并将其文件改名:
[root@mail src]# /etc/init.d/sendmail stop
[root@mail src]# mv /usr/bin/newaliases /usr/bin/newaliases.orig
[root@mail src]# mv /usr/bin/mailq /usr/bin/mailq.orig
[root@mail src]# mv /usr/sbin/sendmail /usr/sbin/sendmail.orig
然后添加两个组:postfix和maildrop和一个用户:postfix
[root@mail src]# groupadd -g 12345 postfix
[root@mail src]# groupadd -g 12346 postdrop
[root@mail src]# useradd -u 12345 -g 12345 -c postfix -m -d/no/where -s/no/shell postfix
这里的组和用户的id是系统中未使用的id。
编译postfix,并支持mysql和sasl:
[root@mail src]# tar -xvzf postfix-2.0.7.tar.gz
[root@mail src]# cd postfix-2.0.7
[root@mail postfix-2.0.7]# make -f makefile.init makefiles
> ccargs=-duse_sasl_auth -dhas_mysql -i/usr/include/mysql -i/usr/local/include/sasl
> auxlibs=-l/usr/lib/mysql -l/usr/local/lib/sasl2 -lmysqlclient -lsasl2 -lz -lm
[root@mail postfix-2.0.7]# make install
安装时,安装程序会提问一些问题,可以直接按回车采用默认值。
这里切记要专门指定你刚安装的sasl2的include和lib位置。由于现在很多linux发行版上都已经带有了sasl,如果不指定的话,很可能会使用了不同版本的头文件和库,在这种情况下,每次连接smtp时,smtpd就会发生致命错误“fatal: sasl per-connection server init...”而崩溃。
修改系统的别名数据库位置:
[root@mail postfix-2.0.7]# cd /etc
[root@mail etc]# mv aliases aliases.orig
[root@mail etc]# ln -s postfix/aliases aliases
给postfix用户做一个系统别名,并将超级用户的邮箱转发到一个普通用户如tester。使用/etc/postfix/aliases别名数据库:
[root@mail etc]# cd postfix
[root@mail postfix]# echo root: tester >> /etc/postfix/aliases
生成/etc/postfix/aliases别名数据库:
[root@mail postfix]# postalias /etc/postfix/aliases
7.3. 配置
修改/etc/postfix/master.cf中的关于cyrus的配置,(cyrus的命令行和以前有不兼容的地方,确保你的cyrus的参数如下使用了-r ${sender}参数):
[root@mail postfix]# vi master.cf
将如下两行:
cyrus unix - n n - - pipe
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
修改为:
cyrus unix - n n - - pipe
user=cyrus argv=/usr/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
这里要把cyrus的路径修改为你的cyrus实际安装路径(我们下面会将cyrus-imap安装到/usr/cyrus)。 记着user=...这行前面是以空格缩进的。
[root@mail postfix]# vi main.cf
修改/etc/postfix/main.cf的配置:
myhostname = mail.cngnu.org
mydomain = cngnu.org
myorigin = $mydomain
mydestination = $mydomain,$myhostname
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
home_mailbox = maildir/
mailbox_transport = cyrus
fallback_transport = cyrus
virtual_maps = hash:/etc/postfix/virtual,mysql:/etc/postfix/mysql-virtual.cf
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated permit_auth_destination reject
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
在上面的配置文件里面使用了sasl来进行smtp发信认证。这里没有使用smtpd_sasl_local_domain参数来指定本地认证域,如果指定了,需要注意的是,在上面的数据库里面的username字段要以以下格式包括这个本地域:tester@cngnu.org。
创建/etc/postfix/mysql-virtual.cf,它提供了本地用户和邮件转发功能。forward字段和username字段值默认是相同的,此时邮件本地递交到用户邮箱:username@mydomain.com里面;forward是另外一个邮件地址或用户时,邮件转发到新的地址。此外,由于postfix对于邮箱区别大小写,通过virtual功能的重写,可以保证大小写的邮件地址都可以正确接收。
[root@mail postfix]# vi mysql-virtual.cf
#
# mysql config file for alias lookups on postfix
#
# the user name and password to log into the mysql server
hosts = localhost
user = mail
password = secret
# the database name on the servers
dbname = mail
# the table name
table = user
select_field = forward
where_field = username
additional_conditions = and status = 1 limit 1
创建上面指定的/etc/postfix/virtual的db库:
[root@mail postfix]# postmap virtual
保留db格式的virtual库是为了系统添加一些虚拟域和转发方便起见。
7.4. 运行
启动命令如下:
[root@mail postfix]# /usr/sbin/postfix start
7.5. 测试postfix
启动postfix后,首先检查日志/var/log/messages有无错误信息,然后检查进程,应该有如下进程存在:检查端口及进程:
[root@mail postfix]# pstree |grep master
|-master-+-pickup
接着检查端口,应该有如下端口打开:
[root@mail postfix]# netstat -an |grep listen
tcp00 0.0.0.0:250.0.0.0:*listen
再检测smtp服务是否正常:
[root@mail postfix]# telnet localhost 25
trying 127.0.0.1...
connected to localhost.
escape character is ^].
220 mail.cngnu.org esmtp postfix
quit
221 bye
connection closed by foreign host.
使用如下命令测试postfix的smtp的认证:
plain认证方式:
[root@mail postfix]# printf tester 000tester 000testpw|mmencode
dgvzdgvyahrlc3rlcgb0zxn0chc=
[root@mail postfix]# telnet localhost 25
trying 127.0.0.1...
connected to localhost.
escape character is ^].
220 mail.cngnu.org esmtp postfix
ehlo cngnu
250-mail00.cngnu.org
250-pipelining
250-size 10240000
250-vrfy
250-etrn
250-auth login plain
250-auth=login plain
250-xverp
250 8bitmime
auth plain dgvzdgvyahrlc3rlcgb0zxn0chc=
235 authentication successful
quit
221 bye
connection closed by foreign host.
login认证方式:
[root@mail postfix]# printf tester |mmencode
dgvzdgvy
[root@mail postfix]# printf testpw |mmencode
dgvzdhb3
[root@mail postfix]# telnet localhost 25
trying 127.0.0.1...
connected to localhost.
escape character is ^].
220 mail.cngnu.org esmtp postfix
ehlo cngnu
250-mail.cngnu.org
250-pipelining
250-size 10240000
250-vrfy
250-etrn
250-auth login plain
250-auth=login plain
250-xverp
250 8bitmime
auth login
334 vxnlcm5hbwu6
dgvzdgvy
334 ugfzc3dvcmq6
dgvzdhb3
235 authentication successful
quit
221 bye
connection closed by foreign host.
此时,由于还没有安装cyrus-imap以及创建邮箱,所以还不能提交邮件,请继续下一步。
这里使用了mmencode来得到mime-base64编码的验证串。mmencode可以在metamail这个包里面找到。此外,你也可以使用perl里面的mime::base64模块(需要安装)来取得这个验证串:perl -mmime::base64 -e print base64_encode("tester tester testpw");。
8. 安装cyrus-imap
8.1. 下载
http://asg.web.cmu.edu/cyrus/download/
[root@mail postfix]# cd /usr/src
[root@mail src]# wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-imapd-2.1.12.tar.gz
8.2. 编译与安装
编译cyrus-imap,并取消kerberos支持(在redhat中,kerberos库有问题,很难编译通过,mandrake则可以通过;此外,我们也不需要kerberos的支持)和snmp的支持:
[root@mail src]# tar -zxf cyrus-imapd-2.1.12.tar.gz
[root@mail src]# cd cyrus-imapd-2.1.12
[root@mail cyrus-imapd-2.1.12]# ./configure --with-cyrus-prefix=/usr/cyrus
> --with-sasl=/usr/local/lib/sasl2 --with-auth=unix
> --without-ucdsnmp
[root@mail cyrus-imapd-2.1.12]# make depend
[root@mail cyrus-imapd-2.1.12]# make all cflags=-o
[root@mail cyrus-imapd-2.1.12]# make install
如果编译时提示没有找到com_err.h,请复制当前目录的et目录下面的com_err.h到/usr/include:
[root@mail cyrus-imapd-2.1.12]# cp et/com_err.h /usr/include
cyrus-imap的安装脚本有问题,cyradm(现在使用的是perl版本,原来的tcl版本不再支持)所需要的perl模块被安装到一些不在perl的@inc的目录里,需要手工安装。
[root@mail cyrus-imapd-2.1.12]# cd perl/imap
[root@mail imap]# perl makefile.pl
[root@mail imap]# make install
8.3. 配置
创建主配置文件/etc/cyrus.conf:
[root@mail imap]# cd ../..
[root@mail cyrus-imapd-2.1.12]# cp master/conf/small.conf /etc/cyrus.conf
添加cyrus-imap的管理账号cryus,该帐户不需要设置密码,通常不会使用它来登录:
[root@mail cyrus-imapd-2.1.12]# useradd -g mail -m -s/no/shell cyrus
创建imap配置文件/etc/imapd.conf,管理员是cyrus:
[root@mail cyrus-imapd-2.1.12]# vi /etc/imapd.conf
configdirectory: /var/imap
partition-default: /var/spool/imap
admins: cyrus
sasl_pwcheck_method: saslauthd
关于imapd.conf可以参阅cyrus-imap的文档来配置其他可用的参数。
由于cyrus-imap的管理程序cyradm及其模块在认证管理用户时会在/etc/sasldb2里面查找认证信息,所以需要单独创建该文件:
[root@mail cyrus-imapd-2.1.12]# saslpasswd2 -c cyrus
password: cyrus
again (for verification): cyrus
[root@mail cyrus-imapd-2.1.12]# chown -r cyrus /etc/sasldb2
建立cyrus-imap服务器的目录结构:
[root@mail cyrus-imapd-2.1.12]# mkdir -p /var/imap/sieve
[root@mail cyrus-imapd-2.1.12]# mkdir /var/spool/imap
[root@mail cyrus-imapd-2.1.12]# chown -r cyrus:mail /var/imap
[root@mail cyrus-imapd-2.1.12]# chown -r cyrus:mail /var/spool/imap
[root@mail cyrus-imapd-2.1.12]# su -s/bin/bash cyrus
bash-2.05$ tools/mkimap
bash-2.05$ exit
这里tools/mkimap这个实用程序在cyrus-imap的源程序目录里面。
创建日志:
[root@mail cyrus-imapd-2.1.12]# echo local6.debug /var/log/imapd.log >> /etc/syslog.conf
[root@mail cyrus-imapd-2.1.12]# echo auth.debug /var/log/auth.log >> /etc/syslog.conf
[root@mail cyrus-imapd-2.1.12]# /etc/rc.d/init.d/syslog restart
设置邮件限额:
[root@mail cyrus-imapd-2.1.12]# chattr -r +s /var/imap/user
[root@mail cyrus-imapd-2.1.12]# chattr -r +s /var/imap/quota
[root@mail cyrus-imapd-2.1.12]# chattr -r +s /var/spool/imap
由于cyrus-imap的主控进程和postfix的主控进程名字一样,容易混淆而且不方便控制,所以将cyrus-imap服务器的主控进程做个别名连接:cyrusd。
[root@mail cyrus-imapd-2.1.12]# cd /usr/cyrus/bin
[root@mail bin]# ln -s master cyrusd
8.4. 运行
启动命令如下:
[root@mail bin]# /usr/cyrus/bin/cyrusd&
8.5. 测试cyrus-imap
启动cyrus-imap后,首先检查日志/var/log/messages、/var/log/imapd.log和/var/log/auth.log有无错误信息,然后检查进程,应该有如下进程存在:
[root@mail bin]# pstree |grep cyrusd
|-cyrusd
接着检查端口,应该有如下端口打开:
[root@mail bin]# netstat -an |grep listen
tcp00 0.0.0.0:1100.0.0.0:*listen
tcp00 0.0.0.0:1430.0.0.0:*listen
现在创建邮箱。
使用cyradm来创建和删除邮箱,它是cyrus-imap自己带的交互式管理界面,现在的版本是用perl写的。你也可以直接调用cyrus::imap::admin模块创建自己的cgi或脚本来做邮箱管理,可以参考cyrus::imap::shell模块的程序。
[root@mail bin]# cyradm --user cyrus localhost
imap password:
mail.cngnu.org> cm user.cyrus
mail.cngnu.org> sq user.cyrus storage 10240000
mail.cngnu.org> cm user.tester
mail.cngnu.org> sq user.tester storage 10240000
mail.cngnu.org> lm
user.cyrus user.tester
mail.cngnu.org> quit
如果要删除一个imap邮箱,需要先给管理员cyrus授予c(create)和d(delete)的权限才可以删除。
[root@mail bin]# cyradm --user cyrus localhost
imap password:
mail.cngnu.org> cm user.testdel
mail.cngnu.org> lm
user.cyrus user.tester user.testdel
mail.cngnu.org> sam user.testdel cyrus cd
mail.cngnu.org> dm user.testdel
mail.cngnu.org> lm
user.cyrus user.tester
mail.cngnu.org> quit
再检测pop3和imap服务:
[root@mail bin]# telnet localhost 110
+ok mail.cngnu.org cyrus pop3 v2.1.12 server ready
user tester
+ok name is a valid mailbox
pass testpw
+ok maildrop locked and ready
quit
+ok
[root@mail bin]# imtest -m login -a tester localhost
c: c01 capability
s: * ok mail.cngnu.org cyrus imap4 v2.1.12 server ready
s: * capability imap4 imap4rev1 acl quota literal+ namespace uidplus id no_atomic_rename unselect multiappend sort thread=orderedsubject thread=references idle
s: c01 ok completed
password:
c: l01 login tester {6}
+ go ahead
c: <omitted>
l01 ok user logged in
authenticated.
security strength factor: 0
. logout
* bye logout received
. ok completed
9. 安装imp
9.1. 下载
http://www.php.net/get_download.php?df=php-4.3.1.tar.gz
http://www.horde.org/horde/
http://www.horde.org/imp/3.2.1/
http://www.horde.org/turba/
[root@mail bin]# cd /usr/src
[root@mail src]# wget http://www.php.net/distributions/php-4.3.1.tar.gz
[root@mail src]# wget ftp://ftp.horde.org/pub/horde/horde-2.2.1.tar.gz
[root@mail src]# wget ftp://ftp.horde.org/pub/pear/pear-1.0.1.tar.gz
[root@mail src]# wget ftp://ftp.horde.org/pub/imp/imp-3.2.1.tar.gz
[root@mail src]# wget ftp://ftp.horde.org/pub/turba/turba-1.2.tar.gz
9.2. 配置apache与php
imp对php的环境要求较高。所以通常需要升级php包,并安装由horde定制后的pear包。编译新的php包前请确认系统中存在apache(这里使用了apache 2)以及其它相关的软件包。
redhat的httpd-devel包中没有apache 2用来安装dso模块的脚本:instdso.sh,请自行从apache 2.x的发行包中取得,并放入/usr/lib/httpd/build中。
[root@mail src]# tar zxf php-4.3.1.tar.gz
[root@mail src]# cd php-4.3.1
[root@mail php-4.3.1]# ./configure --prefix=/usr --with-config-file-path=/etc
> --with-mysql --with-apxs2
> --enable-ftp --enable-magic_quotes --with-xml
> --with-gettext --with-imap
> --with-imap-ssl --with-kerberos=/usr/kerberos
[root@mail php-4.3.1]# make
[root@mail php-4.3.1]# make install
[root@mail php-4.3.1]# [ -f /etc/php.ini ] && mv /etc/php.ini /etc/php.ini.orig
[root@mail php-4.3.1]# cp php.ini-dist /etc/php.ini
修改/etc/php.ini,将register_globals功能打开。
register_globals = on
安装pear包:
[root@mail php-4.3.1]# cd /usr/lib
[root@mail lib]# [-d php ] && mv php php.orig
[root@mail lib]# tar zxf /usr/src/pear-1.0.1.tar.gz
[root@mail lib]# mv pear php
最后重新启动apache:
[root@mail lib]# /etc/rc.d/init.d/httpd restart
9.3. 配置horde
安装horde:
[root@mail lib]# cd /var/www/html
[root@mail html]# tar zxf /usr/src/horde-2.2.1.tar.gz
[root@mail html]# mv horde-2.2.1 horde
[root@mail html]# cd horde/scripts/db
[root@mail db]# mysql < mysql_create.sql
[root@mail db]# cd ../../config
[root@mail config]# for foo in *.dist; do cp $foo `basename $foo .dist`;done
然后修改config目录下面的horde.php。
[root@mail config]# vi horde.php
修改148行:
$conf[prefs][driver] = none;
为:
$conf[prefs][driver] = sql;
修改157行至162行,将其注释去掉并写入horde数据库的口令:
// $conf[prefs][params][phptype] = mysql;
// $conf[prefs][params][hostspec] = localhost;
// $conf[prefs][params][username] = horde;
// $conf[prefs][params][password] = *****;
// $conf[prefs][params][database] = horde;
// $conf[prefs][params][table] = horde_prefs;
为:
$conf[prefs][params][phptype] = mysql;
$conf[prefs][params][hostspec] = localhost;
$conf[prefs][params][username] = horde;
$conf[prefs][params][password] = horde;
$conf[prefs][params][database] = horde;
$conf[prefs][params][table] = horde_prefs;
这里我们没有修改horde数据库的默认的数据库设置,如果在实际使用中,至少应该取一个比较复杂的密码。
再来修改config目录下面的registry.php。
[root@mail config]# vi registry.php
修改23行至24行,将其注释去掉:
// $this->registry[auth][login] = imp;
// $this->registry[auth][logout] = imp;
为:
$this->registry[auth][login] = imp;
$this->registry[auth][logout] = imp;
然后修改109、118行激活imp和turba:
status => inactive
为:
status => active
最后在浏览器中访问如下url测试horde需要的环境是否满足:
http://你的imp服务器的ip/horde/test.php
如果发现有红色的提示,可能需要修改你的php的安装和配置(参见上一节),然后再重新测试。
9.4. 配置imp
安装imp:
[root@mail config]# cd ..
[root@mail horde]# tar zxf /usr/src/imp-3.2.1.tar.gz
[root@mail horde]# mv imp-3.2.1 imp
[root@mail horde]# cd imp/config
[root@mail config]# for foo in *.dist; do cp $foo `basename $foo .dist`;done
然后修改config目录里面的conf.php:
[root@mail config]# vi conf.php
修改37行:
$conf[menu][apps] = array();
为:
$conf[menu][apps] = array(turba);
修改57行:
$conf[user][allow_resume_all] = false;
为:
$conf[user][allow_resume_all] = true;
修改63行:
$conf[user][allow_resume_all_in_drafts] = false;
为:
$conf[user][allow_resume_all_in_drafts] = true;
然后修改prefs.php:
[root@mail config]# vi prefs.php
将自动维护功能关闭,修改424、425行:
value => 1,
locked => false,
为:
value => 0,
locked => true,
再注释773行:
value => ,
为:
//value => ,
取消注释774行:
// value => localsql,
为:
value => localsql,
最后修改servers.php:
[root@mail config]# vi servers.php
注释除“cyrus”服务器外的所有服务器配置,然后修改“cyrus”服务器的配置为:
$servers[cyrus] = array(
name => cyrus imap server,
server => localhost,
protocol => imap/notls,
port => 143,
folders => ,
namespace => inbox.,
maildomain => cngnu.org,
realm => cngnu.org,
preferred =>
);
9.5. 配置turba
安装turba:
[root@mail config]# cd ../..
[root@mail horde]# tar zxf /usr/src/turba-1.2.tar.gz
[root@mail horde]# mv turba-1.2 turba
[root@mail horde]# cd turba/config
[root@mail config]# for foo in *.dist; do cp $foo `basename $foo .dist`;done
然后修改config目录里面的conf.php:
[root@mail config]# vi conf.php
修改32行:
$conf[menu][apps] = array();
为:
$conf[menu][apps] = array(imp);
9.6. 测试imp
最后在浏览器中访问如下url:
http://你的imp服务器的ip/horde/
输入用户名tester和密码testpw登录。
10. 其他
10.1. 启动脚本
可以编写一个启动脚本mailsys来启动这些进程,这样就不需要单独启动postfix和cyrusd了:
#!/bin/bash
#
# mailsys this shell script takes care of starting and stopping
# postfix and cyrus-imap.
# author : xingyu.wang <wxy@cngnu.org> 2003/2/5
#
# chkconfig: 2345 80 30
# description: postfix is a mail transport agent, which is the program
# that moves mail from one machine to another.cyrus-imap is a mail
# deliver agent, which provide pop3 and imap4 services for user and
# deliver mail to local mailbox.
#
# processname: mailsys
# pidfile: /var/run/mailsys.pid
# source function library.
. /etc/rc.d/init.d/functions
# source networking configuration.
. /etc/sysconfig/network
# check that networking is up.
[ ${networking} = "no" ] && exit 0
[ -f /usr/sbin/postfix ] || exit 0
[ -f /usr/cyrus/bin/cyrusd ] || exit 0
retval=0
prog="mail system"
start() {
# start daemons.
echo -n $"starting $prog: "
echo -n $"sasl "
/usr/local/sbin/saslauthd -a pam
echo -n $"smtp "
/usr/sbin/postfix start > /dev/null 2>&1 &
echo -n $"pop3 imap4 "
/usr/cyrus/bin/cyrusd > /dev/null 2>&1 &
retval=$?
if [ $retval -eq 0 ]; then
touch /var/lock/subsys/mailsys
success $"$prog start"
else
failure $"$prog start failure"
fi
echo
return $retval
}
stop() {
# stop daemons.
echo -n $"shutting down $prog: "
echo -n $"smtp "
/usr/sbin/postfix stop > /dev/null 2>&1 &
echo -n $"pop3 imap4 "
killproc cyrusd
echo -n $"sasl "
killproc saslauthd
retval=$?
if [ $retval -eq 0 ]; then
rm -f /var/lock/subsys/mailsys
success $"$prog stop"
else
failure $"$prog stop failure"
fi
echo
return $retval
}
# see how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
retval=$?
;;
*)
echo $"usage: $0 {start|stop|restart}"
exit 1
esac
exit $retval
[root@mail root]# chmod 755 /etc/rc.d/init.d/mailsys
[root@mail root]# cd /etc/rc3.d
[root@mail rc3.d]# ln -s ../init.d/mailsys s80mailsys
[root@mail rc3.d]# rm -rf s80sendmail
10.2. 整体测试
创建邮箱后,测试发信功能:
[root@mail root]# mail tester
subject: test by me
this is a test.
.
cc:
[root@mail root]# mailq
mail queue is empty
[root@mail root]# tail /var/log/mail/*
使用mailq来查看邮件队列是否有错误,并查看/var/log/mail/*是否有错误信息。如果一切正常,说明信件已经发送到tester了。
测试收信,先测试pop3:
[root@mail root]# telnet localhost 110
+ok mail.cngnu.org cyrus pop3 v2.1.12 server ready
user tester
+ok name is a valid mailbox
pass testpw
+ok maildrop locked and ready
list
1 400
top 1 10
return-path: <root@cngnu.org>
x-sieve: cmu-sieve 2.0
return-path: <root@cngnu.org>
received: by mail. (postfix, from userid 0)
id 5f1ef90005; mon, 20 may 2002 18:03:43 +0800 (cst)
to: tester@cngnu.org
subject: test by me
message-id: <20020520100343.5f1ef90005@mail00.cngnu.org>
date: mon, 20 may 2002 18:03:43 +0800 (cst)
from: root@cngnu.org (root)
this is a test.
.
quit
+ok
再测试imap:
[root@mail root]# imtest -m login -a tester localhost
c: c01 capability
s: * ok mail.cngnu.org cyrus imap4 v2.1.12 server ready
s: * capability imap4 imap4rev1 acl quota literal+ namespace uidplus id no_atomic_rename unselect multiappend sort thread=orderedsubject thread=references idle
s: c01 ok completed
password:
c: l01 login tester {6}
+ go ahead
c: <omitted>
l01 ok user logged in
authenticated.
security strength factor: 0
. select inbox
* flags (answered flagged draft deleted seen)
* ok [permanentflags (answered flagged draft deleted seen *)]
* 1 exists
* 1 recent
* ok [uidvalidity 1021736432]
* ok [uidnext 3]
. ok [read-write] completed
. fetch 1:1 (flags body[header.fields (date from)])
* 1 fetch (flags (seen) body[header.fields (date from)] {68}
date: mon, 20 may 2002 09:26:09 +0800 (cst)
from: wxy@cngnu.org
)
. ok completed
. logout
* bye logout received
. ok completed
最后测试imp,在浏览器中访问如下url:
http://你的imp服务器的ip/horde/
输入用户名tester和密码testpw登录。
你也可以使用任何其它的邮件客户端程序来测试,如kmail、outlook express等等。