文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>对Spamcontrol patch for qmail安装记录文章改进..

对Spamcontrol patch for qmail安装记录文章改进..

时间:2006-01-19  来源:hamas

Spamcontrol patch for qmail安装记录这篇文章估计不少人都看过,里面分析的非常详细具体可以说是一篇非常不错的文章,可能也有不少人按照文章中的内容进行了配置,我也是其中之一,总的来说,文章的功能大部分都实现了,但是也发现了一点小的问题,在这里写一下,也让遇到类似问题的兄弟们参考参考。

问题主要在 RECIPIENTS Extension 出现,文章里介绍了使用vchkpw认证时,需要列出所有的邮件用户到users/recipients.cdb文件中,文章里给出了两个脚本

vpopmail-alias2recipients

vpopmail-users2recipients

用处就是将 vpopmail 的 domains中的所有用户列出到recipients.cdb文件中。

::::::::::::::
vpopmail-users2recipients
::::::::::::::
#!/bin/sh
LANG=C
QMAIL=/var/qmail
VPOPMAIL=/home/vpopmail/domains
for i in `ls -l $VPOPMAIL | grep ^d | awk '{print $9}'`
do
cd $VPOPMAIL/$i
ls -l | grep ^d | awk '{print $9"@localhost"}' | sed -e 's/localhost/'$i'/' | sort -u >> $QMAIL/users/recipients
done

其中循环中的内容就是将vpopmail中domains目录下所有的目录列出到cdb文件中,但是根据vpopmail的maildir的工作原理,每个文件夹下面的子文件夹不会超过100个,这样可以大大加快文件检索的速度,因此,每个domians目录下的文件夹也不会超过100个,如果可能超过,vpopmail就会在添加用户时生成名字为1,2,3的以数字命名的文件夹,文件夹下面存储用户目录内容,例如:

  0       dbjsn  dgzdy    dhnby  dhnmg   dhnss    djlgdz  djxyy   dscdz    dynyx    maohongxia  zhnsmx   zqhpa  zyndh
1       dcqrh  dgzqz    dhndw  dhnnf   dhnxc    djxjs   dlnaj   dscms    dzjcx    postmaster  zhusuli  zsdrz  zzjjx
  2       dcqwx  dhbss    dhnfq  dhnpy   dhnxy    djxnl   dlnly   dscrx    dzjdq    qigaihong   zlndsq   zsly   zzjyh
3       dcszz  dhbsz    dhngs  dhnpyz  dhnyz    djxqs   dlzby   dsczg    dzjjsz   vpasswd     zlnhc    zsxcz
 4       dfjqz  dhbwh    dhngw  dhnqs   dhnzk    djxwa   dlzdcg  dsxdtkq  dzjls    wangke      zlnly    zsxxz
 5       dgxhp  dhbys    dhnhb  dhnqxw  dhnzmd   djxwz   dlzgl   dtjhg    dzjzs    zcqbb       zlnyk    zwhwh
 6       dgxnn  dhljjms  dhnlk  dhnrn   dhnzz    djxxg   dlzsd   dxawn    hbyczsk  zgxwz       zlzgt    zxaak anlong  dgxzw  dhljms   dhnls  dhnsp   dhnzzyz  djxxy   dnmjn

可以看到名为0,1,2,3,4,5,6的文件夹,下面是文件夹0下的内容

dgzkl    dhnlyh     djsyz    dscrc   dynly    zgdhz   zjljl  zyndl
 dhbjmyl  dhnnl      djxncds  dscybs  dynsz    zgdst   zjlys  zynqj
dahhn   dhbzj    dhnpya     djxys    dsdbz   dzjnb    zgdsw   zjsha  zzjhz
dbhbbd  dhljhn   dhnsq      dlnpj    dsdhz   hudong   zgdts   zjxsr  zzjjh
dbhbxh  dhljqs   dhnwy      dlzln    dsdjn   seekyu   zgdyj   zjxth  zzjqz
dbhbxt  dhljsd   dhnxc1512  dlzlx    dsdtz   wangzhe  zgxlc   znmtl  zzjyy
dbjsjd  dhnds    dhnxcsq    dlzlxz   dsxdt   zahfy    zgzgy   zsxdt
dcqfl   dhnhxz   dhnys      dlztmd   dsxhr   zbhbcz   zhbcb   zsxxy
dcqzx   dhnlhz   dhnyx      dlzwjd   dsxqx   zbhbzz   zhbmc   zsxyl
dgdss   dhnly    djsrd      dlzym    dxaxp   zcqqj    zhndz   zxasl
dgxbs   dhnlyde  djstz      dqhdt    dxjyn   zfjqz    zhnzmd  zxjht
dgzgyt  dhnlyds  djsycqn    dqhgem   dynky   zgdcz    zjlcc   zxjkt

着下面存储的就是真正的邮件用户名。

而如果按照文章中的脚本,这个目录0下的文件夹名字不可能被遍历到的,因此此类的文件夹中的用户就不会包含到recipients.cdb文件中,直接的后果就是这些用户的电子邮件由于无法通过认证而不能正常收发。

知道了错误的原因,问题就好解决了,我本人对shell脚本的编写并不了解,只能硬着头皮上,下面的是我的脚本:

#!/bin/sh
LANG=C
QMAIL=/var/qmail

VPOPMAIL=/home/vpopmail/domains

j=100
d=0


for i  in `ls -l $VPOPMAIL | grep ^d | awk '{print $9}'`
do
        cd  $VPOPMAIL/$i
        echo  $VPOPMAIL/$i
        ls -l | grep ^d | awk '{print $9"@localhost"}' | sed -e 's/localhost/'$i'/' | sort -u >> $QMAIL/users/recipients
        VPOPMAIL1=$VPOPMAIL
        d=0
        while [ $d -lt $j ]
       do
        #VPOPMAIL="${VPOPMAIL1}/${i}/${d}"
                 if [ -d $VPOPMAIL1/${i}/${d} ]
                        then
                        echo  $VPOPMAIL1/${i}/${d}
                        cd  $VPOPMAIL1/${i}/${d}
                         ls -l | grep ^d | awk '{print $9"@localhost"}' | sed -e 's/localhost/'$i'/' | sort -u >> $QMAIL/users/recipients
                fi
                d=$[d+1]
        done

done

其实方法很笨,就是遇到了诸如0,1一类的文件夹就进去做循环,遍历所有的子文件夹名称,这样的话如果一个域中用户不超过10000,基本可以解决问题,但是如果超过了10000,那么在/home/vpopmail/domains/aaa.com/0这类的文件夹下,又会出现0,1,2,3,4之类的字文件夹,上面的脚本就不能解决了。

如果哪位高人的shell编程好,麻烦帮助修改一下,以彻底解决这个问题。

相关阅读 更多 +
排行榜 更多 +
哥布林弹球b服手游下载

哥布林弹球b服手游下载

休闲益智 下载
小马样式盒游戏下载

小马样式盒游戏下载

休闲益智 下载
异变小镇中文版下载安装

异变小镇中文版下载安装

冒险解谜 下载