qmail邮件用户完全可以与系统用户分开,把用户信息都放在MYSQL/POSTGRESQL中.
7 U0 i0 l8 {1 w
* X9 m7 E, c' E' \具体实践起来可以多看看QMAIL的帮助,做好思想准备,心脏不好者请慎重考虑
) G( g3 h; P" ^( J' c2 f
现在许多做的FREEMAIL系统都是使用非系统用户帐号,有的甚至编写自己的FILE SYSTEM,效率更高。
9 l! v2 F2 L" t; T4 Z
7 a: R+ U8 D1 ?+ S0 @2 e! J. l
: G$ ~8 U5 F! A2 v$ Q- L环境
. o3 F) ^* d, v P. p----
, d$ G, E5 P1 _( |: T/ @, E
: P- V; R) y6 ^- l$ d- [# i RedHat6.2(2.2.12-20)+mysql.3.22.30+qmail1.03+checkpassword0.81,
6 @- Y/ P/ R1 }( Q/ Y, Z
测试过的PATCH为1.0和1.1。
. t5 r- A, S3 Z* x/ F * E2 N) z0 {; l! d( W8 |
数据库名设为QMAIL,QMAIL是按默认设置安装在/var/qmail下,
' }- ], Y, c+ `$ C' r; R9 V6 W2 V1 b 下载的源文件都放在 /usr/local/src下
, ^4 K0 T0 f7 k* q u9 ]# S
下载
4 @: }" R( p3 T0 L$ @----
7 `0 i2 Y, ^/ b* O$ s/ b
8 y( U% X. A) {4 C/ X& t7 U" p% d QMAIL:
http://cr.yp.to/software/qmail-1.03.tar.gz ' M( o3 q. w w F, ^* M$ @1 y. r# F
CHECKPASSWORD:
http://cr.yp.to/software/checkpassword-0.81.tar.gz - @5 L: u9 }# k
PATCH:
http://iain.cx/unix/qmail/download/
+ `* g# M8 P- V1 L e MYSQL:
http://www.mysql.com/downloads/index.html
. u3 a: _0 R7 C' P % R' \ i, ^# b- K4 c
- N' _ k; j: G
安装
% z9 b9 S# b# p) k$ O2 o3 h
----
( v* Q4 t. e$ Y; h* l
1 i; o7 U* [- s, b- X% a" J 建立数据库,结构如下:
% d6 C( y+ Q H; J5 T1 q' I CREATE TABLE alias (
! w. N. I( A$ h& M username varchar(32) DEFAULT '' NOT NULL,
- g' A' Z$ P E5 d alias varchar(64) DEFAULT '' NOT NULL,
" w# c7 r+ g# [' T% y alias_username varchar(32) DEFAULT '' NOT NULL,
8 D/ X7 M+ g9 `: V0 U
alias_host varchar(64) DEFAULT '' NOT NULL,
% n8 ^6 n) ]4 F& U# }' k: ` f# r* D$ J KEY username (username),
% h5 W6 P, p9 D) }
KEY alias (alias),
b% D0 _- h1 a' i4 \3 y& n7 A9 b- ~ UNIQUE user_alias (username,alias,alias_username,alias_host)
: T2 A7 D/ x! ^0 `- k );
; ^( Y! y- P/ F& Q
, A6 i" b0 d7 t3 ?& m5 v CREATE TABLE mailbox (
/ }0 s+ G7 j9 `9 u* C) C username varchar(32) DEFAULT '' NOT NULL,
2 I% G. i x- w8 a: e
uid mediumint(9) DEFAULT '0' NOT NULL,
; k3 @! d. Q I gid mediumint(9) DEFAULT '0' NOT NULL,
: k- v9 K( D3 U. `5 a home varchar(64) DEFAULT '' NOT NULL,
9 L# [# }5 e1 K" d& e" s; i0 l password varchar(16) DEFAULT '' NOT NULL,
3 T3 k5 t, B, U! g8 N3 P PRIMARY KEY (username),
t$ v* F7 U! ?6 j {* g
UNIQUE home (home),
9 x/ A) w' y3 ^% n0 i KEY password (password)
3 s U' i9 f- X9 Y( j1 p' G );
& _% V# Y! a3 s) X) h
& [2 Y5 d6 J. R7 j! M- D+ e CREATE TABLE rcpthosts (
$ {* ~- w9 L- N4 k2 `6 f0 W$ t
host varchar(64) DEFAULT '' NOT NULL,
: l( j) u0 a; S8 s PRIMARY KEY (host)
+ M. c& o; E! f! D3 g! k0 G6 t
);
! n) [! S* i/ X8 f, ?' ~5 B1 S7 y0 i5 O" y: k1 {( @& E
CREATE TABLE virtual (
) h/ b, |8 G7 e+ n+ M
username varchar(32) DEFAULT '' NOT NULL,
4 k4 P% I G* b% J! } ext varchar(64) DEFAULT '' NOT NULL,
% |2 m' ?& f9 h# O# R" X6 x. v virtual_username varchar(32) DEFAULT '' NOT NULL,
7 U7 V6 k7 e9 r |
virtual_host varchar(64) DEFAULT '' NOT NULL,
. v& N- t S6 x# u
PRIMARY KEY (virtual_username,virtual_host),
: f4 u4 w7 T, h1 ]' u8 O8 I% q KEY (virtual_username),
( K: _; I9 ~; X# K6 y KEY (virtual_host),
- K- S) G% R* N5 ]' |6 x* H# u: J UNIQUE virtual (username,ext,virtual_username,virtual_host)
$ b- v! `3 `$ N2 @) Q );
0 X5 X0 _+ z6 n, Y q
0 l: A: _& Q) A& a' U/ |, b8 ^
) ^! O8 U; p: T/ s安装QMAIL,CHECKPASSWORD
( o1 h y( t* x. H" B [------------------------
$ ^7 q2 I {% M0 D, _! Y
: r" u5 }. o& B+ ?; f1 F ] n tar xzvf qmail-1.03.tar.gz
8 d7 T* {1 ] i' \& {6 U1 Q
mkdir /var/qmail
m0 C# D' F$ [) l7 z9 a0 h. E9 e groupadd nofiles
9 w" x; p. x. s* W" {" i$ [) E: s useradd -g nofiles -d /var/qmail/alias alias
1 m8 ~: U1 {# q( d) j! k
useradd -g nofiles -d /var/qmail qmaild
* o4 J1 K% t' D* S) g useradd -g nofiles -d /var/qmail qmaill
& o T+ D, U7 y7 x, R4 P I7 o7 }; R
useradd -g nofiles -d /var/qmail qmailp
: g0 {# R; q" [5 ]7 V4 d0 g
groupadd qmail
& v6 V' K2 B) ^# y' u0 D useradd -g qmail -d /var/qmail qmailq
& L# l' R) _ R+ `% X
useradd -g qmail -d /var/qmail qmailr
) p- u ^+ f, B
useradd -g qmail -d /var/qmail qmails
1 @ E4 z+ r+ j9 k4 M make setup check
: e, \! C( i' x: t ./config或者 ./config-fast your.full.host.name
2 d+ p. I. f: f! n1 \: h, N- o
5 v3 e8 q0 L2 `! x
注:config 根据DNS来确认主机名+域名,在config后,
7 S! Z( R9 a7 r! M/ G# J& X. b" Q 再config-fast 域名,不然收发邮件都有一个小问题。
$ M" G- E, q* i0 Z
# m/ k) j5 o" X5 Q" Y- X+ U建立系统别名
" b' n! \! `' \3 Z
------------
: Z& b8 L- A O( h
* @) g8 ]. E. E cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
. p, s4 Q0 `* x: H d, c5 ^5 \: x+ w
将要设定的用户加入了别名中去
/ @# h$ J; x: p4 ^* X
echo xxxx >>.qmail-postmaster ...
) i8 W8 n3 t& p" R" c) y* s) ? chmod 644 ~alias/.qmail*
1 S& f8 D+ Z: ?) p) M$ S
0 V+ F. H$ m3 n+ q cp /var/qmail/boot/home /var/qmail/rc
6 y0 T$ }# ? ^& A 修改rc,将./Mailbox修改为./Maildir/
8 Q) E+ m8 P% d& O: K 现在编译的QMAIL是让其支持Maildir格式,如要支持/var/spool/mail格式,只需
% ]. K( k3 E, Y9 _! N M* o/ V
cp /var/qmail/boot/proc /var/qmail/rc
, i/ r w; \% v9 J$ E
让QMAIL在系统启动时自动启动
( l: `7 b( J0 E# K2 o) @+ o
echo "csh -cf '/var/qmail/rc &'" >> /etc/rc.d/rc.local
" O; v) f. \8 J9 w
: \7 R/ q4 y. s+ W& y$ l' j7 X安装checkpassword
; K/ l5 b8 H# Z. ^! B. i
-----------------
( e1 h2 F- M# i
" R! D" ?& O, D! {6 ]
解压:tar -zxvf checkpassword-0.81.tar.gz
; ^4 v/ L( j2 }
进入解压后的目录执行
6 u o, Q7 h5 [ make
. N+ o2 w+ Z7 W$ T0 F2 R/ K7 N& X
make setup check就可以了。
: }; ]9 n' R" r1 _3 c. ^3 L- |3 o
现基本的QMAIL已经安装完成了,要增加一个系统用户如ABCD需以下步骤:
4 B# U9 e O$ U8 ?! |8 P: \ /usr/sbin/useradd abcd;/usr/bin/passwd abcd 设好口令
4 Z1 ?2 I0 k7 T) [ b( ` 以此用户名登录,到此用户的HOME目录下:cd;
9 j1 k0 D: w; s8 _% j /var/qamil/bin/maildirmake Maildir
7 G4 ^1 E2 F$ e# p/ y! h( H
echo ./Maildir/ >.qmail 这样就好了。
) s, |$ w# `* e0 @( @
以存在的用户使用Maildir:
; S$ C2 R; M7 U3 a. i$ [ 以ROOT的话,可以直接su 用户名或直接以root身份在所需用户的HOME目录下
3 Y8 A. J' ?" E0 u, s" R
建立Maildir 及.qmail
3 l# b2 N- `* ^
然后再chown -R 该用户名.该用户组名 用户的HOME目录名。
* X8 [$ i0 e9 v$ c$ V% l$ \
1 H, Q! e3 e/ R! n# u 如以后还建系统用户,可使用以下步骤:
% w) V- d6 V7 q+ n
在/etc/skel下建立echo ./Maildir/ >.qmail
! i1 F0 c$ J" K5 ^# @! Q
/maildirmake Maildir
: I, y z* r) F 以后建一个用户就会自动建立Maildir .qmail了
! k S! h3 F5 L
+ B. `& Z" [/ {. R& P- U使QMAIL支持数据库
9 j, x! c* g3 m4 C6 U-----------------
+ _" a$ @/ S+ k4 y1 m8 H. }
9 r3 q4 d' g5 f7 t
建立一个MYSQL帐号,设帐号名为MAIL
/ s8 R6 W# D. D' |3 F/ k. a
GRANT ALL ON QMAIL.* TO MAIL@LOCALHOST IDENTIFIED BY "

ASSWORD"
. m6 i: `8 M, x9 b* ~. j 测试一下mysql -umail -p
$ `, i4 _" E; S* I
建立一个sqlserver文件,包含以下内容
9 ^. f4 G# W2 v6 g+ W5 T
server localhost
- a# V# Q8 I4 ?; p0 [, r. H5 E
login mail
6 E4 E4 q; ]; T- Y' t password mail
( N3 |) e% `3 Y3 a db qmail
& s+ i! l+ [3 o; t- G& |3 ~6 G% Y port xxx
; U6 q& G [* g socket xxx
- u0 ]! H z" T5 Y 只能以一空格键分开,或用等号连接.,将其复制到/VAR/QMAIL/CONTROL,属于
% R3 \- [# u. v5 O7 _+ v4 U! b
QMAILP.QMAIL-RW-R-R--
- p) y+ u7 [) ]4 G4 j
此文件的权限及设置都必须正确,不然会出现OUT OF MEMORY之类的出错信息。
. R3 @- z+ c) m2 o& v, x 8 z( I* S* E {7 M9 T/ S
PATCH qmail及checkpassword
5 B$ R6 y$ D+ m6 S; v, O
gunzip qmamil及checkpassword的PATCH文件
8 D* b w' U9 W$ g! k, \6 ~4 V
进入 qmail-1.03及checkpassword-0.81目录,修改Makefile中的MYSQL_LIB及
; o- [$ i* ^/ `0 N K MYSQL_INCLUDE指向正确的目录。
' f7 T/ o7 V* u 2 X0 [7 V1 W, G- ]1 e t3 R
然后
n) M& I4 m( L6 A" V; x8 B. o- g9 ~
QMAIL: patch -p1 <qmailpatchfilename
1 {! f4 t4 Y8 t5 C: A. d
make setup check
( u# l9 ^! [2 C/ i0 V; i2 q checkpassword: patch -p1 <checkpasswordfilename
! t$ z) l. X8 H. Q. h8 p
make
0 T Y5 ~( K% S2 P
make setp check
% X7 |; S6 T0 }8 E: q6 I: `. K
' z( a# C$ B5 r, u8 C从Sendmail向Qmail迁移
9 W7 b/ x, h" f: A. [+ m% w---------------------
9 l* ]- k+ P+ P& g* \1 \1 r2 S& q3 d' F# U1 @5 A2 Z$ K
在/etc/inetd.conf文件中修改或加入smtp ,pop-3(各一行)
4 m5 ~2 D- r) h' a1 F
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
- q# V! f, a& |' y4 ?
tcp-env /var/qmail/bin/qmail-smtpd
* |( g) P9 F& a# I( j
1 Y1 w- R$ g& x% G pop-3 stream tcp nowait root /var/qmail/bin/qmail-popup
7 i) [% l' X- B
qmail-popup host.domainname /bin/checkpassword /var/qmail/bin/ \
. @( C. E3 [+ Q( ^ qmail-pop3d Maildir
7 u# T- _4 W3 F9 [7 U2 t( h% a J+ S: a1 `
" X7 G2 c2 K7 C$ X9 j2 V
具体内容在QMAIL的DOC目录,REMOVE.sendmail有详细介绍。
1 O" v9 q! Y" a1 F+ J( W) c! q
将sendmail的启动语句注释掉,可以试一下/usr/sbin/ntsyv
1 N) j! c. Z0 q2 [ b4 i8 u 再杀掉Sendmail进程.
, C5 W" K9 o7 A# w1 h' t8 h
. b, w% A3 Y! Z3 t chmod 0 /usr/lib/sendmail
1 @7 M& Z" h! }' F1 H4 F# b chmod 0 /usr/sbin/sendmail
2 O7 s3 l& j9 ]# g
chmod 0 /usr/lib/sendmail.mx
3 c) W% n0 y2 ^
mv /usr/lib/sendmail /usr/lib/sendmail.bak
/ h/ R' Z$ r* r/ ^/ c8 o
mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
* Y+ Y% X, N* l# q B1 O ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
! j; X7 [# q% t4 x" l* \: M% b ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
F ]& ^! x }2 w) e8 t2 C killall -HUP inetd
6 ^+ p5 | W- l( c
2 s g4 x) N( G _9 s+ T 将现有的SENDMAIL邮件迁移到QMAIL下
3 `4 W; t8 I$ }9 |$ m) r
可以在用户HOME目录Maildir/new下建立一个到/var/spool/mail/用户名的连接
( j1 P7 j+ e+ J/ L
我是直接将/var/spool/mail/用户名 cp -p 至/home/用户名/Maildir/new下。
0 |7 V- M( C9 w
如用sendmail的alias需要fastforward,所以我另外建了qmail的alias
' r* E2 b+ \6 u! u& r( c
3 ?8 H7 c, i. d0 y
测试
; D# ^4 T7 Y) P* v3 x2 _ x----
X0 q, |# v& J A C9 Q
- I7 O( m! b$ U8 H8 C' t
启动mysql带--log选项,以便发生错误时查看mysql log找出原因,
& ?' `8 R: A c8 l6 M 启动QMAIL (csh -cf '/var/qmail/rc &')
" n" q$ x) t) y& F- O% s& w
查看一下QMAIL的进程:ps -ax | grep qmail
+ s: d0 B; h6 n( B 检查一下/var/log/maillog的信息
/ ?2 Z) V6 v( C- v; O# U4 T' Z" F# ~
发给一个系统用户,看有没有收到信,如有错误检查home目录Maildir的权限设置
' M% J. _( z3 @1 v 虚拟用户:在MAILBOX表格中输入username,uid,gid,home,password信息
' q: W9 B1 o. _# ^( `/ ]! i! N
然后再根据所指定的home建立相应的目录,Maildir .qmail 再
) D2 I: k6 G+ O$ h, g4 h# m chown -R uid.gid home目录
: J; K9 I- M! N3 {/ X
测试一下给此虚拟用户发信。
% s) u- ^8 m [) I* F2 G" t8 m qmail+mysql安装成功的话在/var/log/maillog及mysql的log下都有查寻数据库
- r" E/ E7 i1 R7 M% X% i b) S 的信息。
; m. v1 |) G+ ^# O1 A, X# ~
. x8 U( p/ y- N5 [) g A配制
( W Y4 g* j8 G+ |----
2 e1 I. q6 ~9 C* c% h1 U- n; a) [, Y7 c, _( x: @
为其它主机转信须在/var/qmail/control/rcpthosts添加域名,去到relay限制
' V9 ?! d2 i1 P0 o8 P, j* g 可将此文件删除或试一下加入0.0.0.0, 如使用tcpserver可建立/etc/tcp.smtp
' k( k( {4 e% \$ Y: H! G8 B
来限制relay限制。
1 ?6 g# H5 T- Z9 N. i/ b# v# O* |; e$ Y2 I
设置主机多个域名:将名称加入
- ^! @9 f; z2 T' u& ]
/var/qmail/control/local,
, D/ ~( D" c) D) [4 F$ r: N& z /var/qmail/control/rcpthosts
. V( J ]8 U1 G# Y /var/qmail/control/me
+ @, W! X5 F u. w# K
' `+ Q" r3 K0 }" q4 J8 v2 _: C6 C 别名:
z- K( H# X+ y / c. {6 @) n5 n5 h! a% G
echo "用户">/var/qmail/alias/.qmail-别名
7 g* {4 y+ P% L# w& x5 J. R2 L
mailist:跟别名一样,只不过在别名文件中键入多个用户,
3 z+ p) {8 K. i+ H 每个用户以回车隔开;但存在一个问题当mailist中包括发件人时,发件人发给
: w6 y, j* _8 Q# k- g1 n
mailist自己也能收到,以后我会试一下ezmlm。用户可以在自己的目录里建立
6 g/ H) F x7 h) v# j* K Maillist,如用户名为abc,想建一个Maillist发给一组用户只需在abc的HOME
4 Q9 X* `1 Q% T' n
目录下建立.qmail-test,将用户加入到此文件中,只后只要发给abc-test就行了。
Z% p& B z5 R4 T1 ?, y$ ?
: Y5 s( `; M+ \1 {
抄送:
, C( G2 B, X. y+ M) d ! C( ~; u4 N- `# d: [
发信给 user1@ab.cd,同时抄送给user2,dd@jite.com
% b6 b* | f( C* y
方法:编辑/home/user1/.qamil 内容如下
5 q+ T& G; e0 S+ T* S- u& B! x7 d* H
./Maildir/
1 j9 O: a8 Y% {- }! |
|forward user2 dd@jite.com
% m: i/ v8 B0 [7 b
( o/ [2 K! F. b9 w5 F
转信:
$ e( S1 g/ y' Y9 I% Y% I& s8 I
$ v4 ?6 a& v% [1 y6 y user1@ab.cd转向dd@jite.com
/ J( N; U0 S- f; M( U 方法:编辑/home/user1/.qamil 内容如下
6 Z3 ?5 _2 O- A( V; }, i
* E, ?/ \) Q6 C/ X! q5 M dd@jite.com
, P( V* R# g* J" q1 }5 l8 o- w ]4 Q
去掉转信和发信的限止:去掉/var/qmail/control/rcpthosts文件
; f' E3 X- ?2 ^3 w( w masquerading:
7 i& l, G3 ^+ ~" G9 m3 a. t4 D) i 在/var/qmail/control/defaulhost中加入要伪装的主机名,将此文件设为644
5 Z& E1 w/ c; w" L1 M( z* C具体实践起来可以多看看QMAIL的帮助。
# ^: r7 m7 L5 t现在许多做的FREEMAIL系统都是使用非系统用户帐号,有的甚至编写自己的FILE SYSTEM,效率更高。