以下的文章主要介紹的是qmailadmin+vpopmail+MySQL filter的實際配置,如果你對其相關的實際操作有興趣的話,你就可以對以下的文章點擊觀看了。希望會給你帶來一些幫助在MySQL filter的實際配置方面。
作用於qmail-local(即MDA)的方法。
這裡有幾個問題,需要解決。
1.如何在建用戶的時候自動的初始化用戶的初始MySQL filter文件.
2.webmail定義的filter如何起作用。
3.還有一些是解決這些問題的過程中遇到的問題。
針對第一個問題,研究了一下qmailadmin,看了代碼之後才發現,
qmailadmin支持插件似的配置文件,在操作用戶後,
運行在插件配置文件中定義的腳本。腳本是針對每個域的,即放在域的目錄下面。
呵呵,網上都沒有介紹哦,估計是inter7 unleased.
域的目錄通過/var/qmail/users/assign來定位。例如,assign的內容如下:
- +foo.com-:foo.com:515:511:/home/vpopmail/domains/foo.com:-::
則在/home/vpopmail/domains/foo.com下定義一個配置文件.qmailadmin-hooks。注意屬
主和屬性,這個配置文件格式如下:
- #....
- op: cmd
其中到qmailadmin-1.06,op支持以下一些操作
- "adduser",
- "deluser",
- "moduser",
- "addmaillist",
- "delmaillist",
- "modmaillist",
- "listadduser",
- "listdeluser"
例如:你想在增加用戶以後干些事情,就以增加MySQL filter為例,.qmailadmin-hooks
就可以這麼配:
adduser: /home/vpopmail/bin/inituser.sh
inituser.sh腳本如下:
- #!/bin/bash
- Domain=$1
- User=$3
- Passwd=$2
- DomainPath=/home/vpopmail/domains/$Domain
- umask 0177
- exec 1> /tmp/adduser.log
- exec 2> /tmp/adduser.log
- echo $DomainPath
- cat>$DomainPath/.qmail-$User <|maildrop $DomainPath/$User/.mailfilter
- EOF
- cat>$DomainPath/$User/.mailfilter <include $User/.userfilter
- EOF
- cat>$DomainPath/$User/.userfilter <#MFMAILDROP=2
- #
- # DO NOT EDIT THIS FILE. This is an automatically generated filter.
- FROM='$User@$Domain'
- import SENDER
- if ($SENDER ne "")
- {
- FROM=$SENDER
- }
- to "$DomainPath/$User/Maildir/."
- EOF
- cat>$DomainPath/$User/Maildir/maildirfilterconfig <MAILDIRFILTERMAILDIRFILTER=../.userfilter
- MAILDIR=$DomainPath/$User/Maildir
- EOF
針對第二個問題,實際上上面inituser.sh已經提供了解決方法,也就是sqwebmail通過
maildirfilterconfig來查找MySQL filter文件,這裡定義的是../.userfilter,它有包含在.mailfiter中,
而點.mailfilter則是maildrop調用的規則文件。
這裡有幾個地方需要解釋,
1..userfilter中的前幾行comment是起作用的,是sqwebmail的標記,不能去掉,否則sqwebmail會報錯
2.MAILDIRFILTER為什麼不指向.mailfiter,而是.userfilter,一句話方便擴充。可以在.mailfilter中加入
其它的MySQL filter rule, 而這些rule並不需要用戶編輯。
3..qmailadmin-hook中的腳本是qmailadmin fork出的子進程執行的,qmailadmin由於是以http的用戶運行
所以建立這些文件的時候會有錯誤。因此,我們改了一點源代碼,位置在源碼包的qmailadmin*/user.c的
函數call_hooks的fork之前, 如下:
.
- + setuid(0);
- + setgid(VPOPMAILGID);
- + setuid(VPOPMAILUID);
- pid = fork();
編譯之後qmailadmin後,並替換cgi目錄下的文件,注意屬主是root和setuid位.
4.為什麼不在inituser.sh中用su來執行,這樣就不用改代碼了?首先,apache(Unix平台最流行的WEB服務器平台)重定向了stdin,而su是檢查
stdin是不是tty,如果不是,就不會執行。其次,fork出來的子進程是exec的方式執行MySQL filter的配置中指定的命令,
而exec是不復制euid和egid的,所以如果不用su,就需要用自己編一個suid的程序。這又麻煩了.
.qmailadmin-hooks如下:
- adduser: /home/vpopmail/bin/inituser.sh
- deluser: /home/vpopmail/bin/deluser.sh
/var/vpopmail/bin/deluser.sh如下
- #!/bin/bash
- Domain=$1
- User=$3
- Passwd=$2
- DomainPath=/home/vpopmail/domains/$Domain
- rm -f $DomainPath/.qmail-$User
注:原來qmailadmin有bug.
在源碼包的qmailadmin*/user.c的函數call_hooks的這行
error = execl(cmd, Newu, Domain, Password1, Gecos, NULL);
這裡明顯有問題,execl的第二個參數是arg0,實際上不起作用。而Gecos是用戶的真實
用戶名,只有在新建的時候才有值,不填就是Newu,所以我以為用戶名是$3.
但是moduser和deluser的時候,操作的用戶名都不在Newu裡面,而是在ActionUser裡面。
所以hook中定義的deluser和moduser腳本取不到用戶名.
所以需要將這行改為
- if (Newu %26amp;%26amp; *Newu) {
- error = execl(cmd, cmd, Newu, Domain, Password1, Gecos, NULL);
- } else {
- error = execl(cmd, cmd, ActionUser, Domain, Password1, Gecos, NULL);
- }
而且,如果要方便擴展的話,可以將op也放在execl的參數中,這樣,hook中定義的
腳本就可以用一個。根據op類型來操作。就不像我這樣分成好多腳本了。
所以user.c最終該過後,如下,call_hooks函數的fork附近:
- setuid(0);
- setgid(VPOPMAILGID);
- setuid(VPOPMAILUID);
- pid = fork();
- #ifdef DEBUG
- fprintf(actout,"Where the parameters are: %s, "%s", %s, %s, %s, %s, NULL); ",
- cmd, hooks[hook_type], Newu, Domain, Password1, Gecos);
- #endif
- if (pid == 0) {
- // error = execl(cmd, Newu, Domain, Password1, Gecos, NULL);
- if (Newu %26amp;%26amp; *Newu) {
- error = execl(cmd, cmd, Newu, Domain, Password1, Gecos, NULL);
- } else {
- error = execl(cmd, cmd, ActionUser, Domain, Password1, Gecos, NULL);
- }
而inituser.sh和deluser也需要相應的改參數位置,我只貼上修改的頭幾行如下:
- #!/bin/sh
- User=$1
- Domain=$2
- Passwd=$3
- RealName=$4
以上的相關內容就是對qmailadmin+vpopmail+MySQL filter的配置的介紹,望你能有所收獲。