新聞中心
以下的文章主要介紹的是qmailadmin+vpopmail+MySQL filter的實(shí)際配置,如果你對(duì)其相關(guān)的實(shí)際操作有興趣的話,你就可以對(duì)以下的文章點(diǎn)擊觀看了。希望會(huì)給你帶來一些幫助在MySQL filter的實(shí)際配置方面。

潁東ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
作用于qmail-local(即MDA)的方法。
這里有幾個(gè)問題,需要解決。
1.如何在建用戶的時(shí)候自動(dòng)的初始化用戶的初始MySQL filter文件.
2.webmail定義的filter如何起作用。
3.還有一些是解決這些問題的過程中遇到的問題。
針對(duì)第一個(gè)問題,研究了一下qmailadmin,看了代碼之后才發(fā)現(xiàn),
qmailadmin支持插件似的配置文件,在操作用戶后,
運(yùn)行在插件配置文件中定義的腳本。腳本是針對(duì)每個(gè)域的,即放在域的目錄下面。
呵呵,網(wǎng)上都沒有介紹哦,估計(jì)是inter7 unleased.
域的目錄通過/var/qmail/users/assign來定位。例如,assign的內(nèi)容如下:
- +foo.com-:foo.com:515:511:/home/vpopmail/domains/foo.com:-::
則在/home/vpopmail/domains/foo.com下定義一個(gè)配置文件.qmailadmin-hooks。注意屬
主和屬性,這個(gè)配置文件格式如下:
- #....
- 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
- 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
- MAILDIR=$DomainPath/$User/Maildir
- EOF
針對(duì)第二個(gè)問題,實(shí)際上上面inituser.sh已經(jīng)提供了解決方法,也就是sqwebmail通過
maildirfilterconfig來查找MySQL filter文件,這里定義的是../.userfilter,它有包含在.mailfiter中,
而點(diǎn).mailfilter則是maildrop調(diào)用的規(guī)則文件。
這里有幾個(gè)地方需要解釋,
1..userfilter中的前幾行comment是起作用的,是sqwebmail的標(biāo)記,不能去掉,否則sqwebmail會(huì)報(bào)錯(cuò)
2.MAILDIRFILTER為什么不指向.mailfiter,而是.userfilter,一句話方便擴(kuò)充??梢栽?mailfilter中加入
其它的MySQL filter rule, 而這些rule并不需要用戶編輯。
3..qmailadmin-hook中的腳本是qmailadmin fork出的子進(jìn)程執(zhí)行的,qmailadmin由于是以http的用戶運(yùn)行
所以建立這些文件的時(shí)候會(huì)有錯(cuò)誤。因此,我們改了一點(diǎn)源代碼,位置在源碼包的qmailadmin*/user.c的
函數(shù)call_hooks的fork之前, 如下:
.
- + setuid(0);
- + setgid(VPOPMAILGID);
- + setuid(VPOPMAILUID);
- pid = fork();
編譯之后qmailadmin后,并替換cgi目錄下的文件,注意屬主是root和setuid位.
4.為什么不在inituser.sh中用su來執(zhí)行,這樣就不用改代碼了?首先,apache(Unix平臺(tái)最流行的WEB服務(wù)器平臺(tái))重定向了stdin,而su是檢查
stdin是不是tty,如果不是,就不會(huì)執(zhí)行。其次,fork出來的子進(jìn)程是exec的方式執(zhí)行MySQL filter的配置中指定的命令,
而exec是不復(fù)制euid和egid的,所以如果不用su,就需要用自己編一個(gè)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的函數(shù)call_hooks的這行
error = execl(cmd, Newu, Domain, Password1, Gecos, NULL);
這里明顯有問題,execl的第二個(gè)參數(shù)是arg0,實(shí)際上不起作用。而Gecos是用戶的真實(shí)
用戶名,只有在新建的時(shí)候才有值,不填就是Newu,所以我以為用戶名是$3.
但是moduser和deluser的時(shí)候,操作的用戶名都不在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);
- }
而且,如果要方便擴(kuò)展的話,可以將op也放在execl的參數(shù)中,這樣,hook中定義的
腳本就可以用一個(gè)。根據(jù)op類型來操作。就不像我這樣分成好多腳本了。
所以u(píng)ser.c最終該過后,如下,call_hooks函數(shù)的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也需要相應(yīng)的改參數(shù)位置,我只貼上修改的頭幾行如下:
- #!/bin/sh
- User=$1
- Domain=$2
- Passwd=$3
- RealName=$4
以上的相關(guān)內(nèi)容就是對(duì)qmailadmin+vpopmail+MySQL filter的配置的介紹,望你能有所收獲。
網(wǎng)頁標(biāo)題:MySQLfilter的實(shí)際配置
本文鏈接:http://www.dlmjj.cn/article/dpjdeii.html


咨詢
建站咨詢
