发新话题
打印

请问高手,怎样使qmail用户与系统用户分离,编程如何实现

请问高手,怎样使qmail用户与系统用户分离,编程如何实现      

TOP

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,效率更高。      
this message will self-destruct in 5 seconds......
我们的目标--------消灭蛀.....................零回复

TOP

非常感谢斑竹的帮忙

非常感谢斑竹的帮忙非常感谢斑竹的帮忙非常感谢斑竹的帮忙非常感谢斑竹的帮忙非常感谢斑竹的帮忙非常感谢斑竹的帮忙      

TOP

发新话题