免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6459 | 回复: 9
打印 上一主题 下一主题

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-15 11:13 |只看该作者 |倒序浏览
这两天和peng老大研究了一下在qmailadmin+vpopmail+sqwebmail+mysql下,如何将webmail定义的过滤器
作用于qmail-local(即MDA)的方法。

这里有几个问题,需要解决。
1.如何在建用户的时候自动的初始化用户的初始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"

例如:你想在增加用户以后干些事情,就以增加filter为例,.qmailadmin-hooks
就可以这么配:

adduser:        /home/vpopmail/bin/inituser.sh


inituser.sh脚本如下:
[code]
#!/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 <<EOF
|maildrop $DomainPath/$User/.mailfilter
EOF

cat>;$DomainPath/$User/.mailfilter <<EOF
include $User/.userfilter

to "$DomainPath/$User/Maildir/."
EOF

cat>;$DomainPath/$User/.userfilter <<EOF
#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 <<EOF
MAILDIRFILTER=../.userfilter
MAILDIR=$DomainPath/$User/Maildir
EOF

[/code]

针对第二个问题,实际上上面inituser.sh已经提供了解决方法,也就是sqwebmail通过
maildirfilterconfig来查找filter文件,这里定义的是../.userfilter,它有包含在.mailfiter中,
而点.mailfilter则是maildrop调用的规则文件。

这里有几个地方需要解释,
1..userfilter中的前几行comment是起作用的,是sqwebmail的标记,不能去掉,否则sqwebmail会报错

2.MAILDIRFILTER为什么不指向.mailfiter,而是.userfilter,一句话方便扩充。可以在.mailfilter中加入
        其它的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重定向了stdin,而su是检查
stdin是不是tty,如果不是,就不会执行。其次,fork出来的子进程是exec的方式执行配置中指定的命令,
而exec是不复制euid和egid的,所以如果不用su,就需要用自己编一个suid的程序。这又麻烦了.

呵呵,
这几天太忙,也许过年都回不了家,我苦,:-(,没时间去搞了,就用个省力的方法了。


欢迎各位简化这些过程。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-01-15 12:31 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

呵呵,好人做到底,增加deluser的配置方式:

.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

论坛徽章:
0
3 [报告]
发表于 2003-01-15 12:40 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

好东东,收藏^_^

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-01-15 17:41 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

今天又试了试deluser的脚本,不起作用。

又研究了一把,呵呵,原来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 &amp;&amp; *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);\n",
    cmd, hooks[hook_type], Newu, Domain, Password1, Gecos);
#endif

  if (pid == 0) {
//    error =    execl(cmd, Newu, Domain, Password1, Gecos, NULL);
        if (Newu &amp;&amp; *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


呵呵,看来unlease是有道理的亚

论坛徽章:
0
5 [报告]
发表于 2003-08-15 16:10 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

老大太牛了呀

论坛徽章:
0
6 [报告]
发表于 2003-08-15 16:14 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

老大太牛了呀

论坛徽章:
0
7 [报告]
发表于 2003-10-05 09:36 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

对igenus起作用吗

论坛徽章:
0
8 [报告]
发表于 2003-10-20 14:16 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

牛!基本是没看懂!对呀,对igenus起作用吗?

招聘 : Linux运维
论坛徽章:
0
9 [报告]
发表于 2003-11-05 08:53 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

我也没有看懂.
能不能在用qmailadmin添加用户的时候自动./vsetuserquota呢

论坛徽章:
0
10 [报告]
发表于 2003-11-08 15:33 |只看该作者

qmailadmin+vpopmail+sqwebmail+mysql的filter的配置方法

什么对igenus起作用不?这是对底层的东东,只要你是用vpopmail的api或是命令来添加用户,就可以控制得到的.除非你用php直接在数据库里添加的用户.建的目录.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP