ezmlm邮件列表使用mysql方式管理帐号
2008-11-20    刘世伟   
打印自: 安恒公司
地址: HTTP://www.anheng.com.cn/news/article.php?articleid=1631
ezmlm邮件列表命令行管理
以前maillist都是用的std方式,在文件中存放邮件列表成员,不很方便,为了用php统一管理数据库,对ezmlm进行了重新编译。
在debian下, 带了ezmlm的源码,和一个build-ezmlm,需要执行build-ezmlm来编译生成一个deb包,我们执行build-ezmlm第一步展开完成后
先不要编译,要修改几个地方,然后再编译,
源码在/tmp/ezmlm
我们要修改的是2个地方, 第一个是debian/rules 文件
$(MAKE) std
$(MAKE)
改成
$(MAKE) mysql
$(MAKE)
$(MAKE) ch_gb
编译mysql支持, 并使用中文

还有就是debian带的ezmlm的源码,在mysql有个bug,要修改sub_mysql/opensql.c:
--- ezmlm-0.53/sub_mysql/opensql.c.orig 2009-11-20 23:48:06.000000000 +0800
+++ ezmlm-0.53/sub_mysql/opensql.c      2009-11-20 23:48:49.000000000 +0800
@@ -92,7 +92,7 @@
     if (!*table) return ERR_NO_TABLE;
   }
   if (!psql) {
-    if (!((MYSQL *) psql = mysql_init((MYSQL *) 0)))
+    if (!(psql =(void *)mysql_init((MYSQL *) 0)))
         return ERR_NOMEM;                                      /* init */
     if (!(mysql_real_connect((MYSQL *) psql, host, user, pw, db,
        (unsigned int) port, 0, CLIENT_COMPRESS)))              /* conn */


修改完成后,执行
cd /tmp/ezmlm/ezmlm-0.53
dpkg-buildpackage -rfakeroot
完成后,在/tmp/ezmlm/会生成几个包, 源码包已经包含了我们上面的修改,可以复制备份
我们需要的程序在2进制包 ezmlm-idx_0.53-11_amd64.deb
安装:
dpkg -i /tmp/ezmlm/ezmlm-idx_0.53-11_amd64.deb


带了mysql支持的ezmlm仍然可以使用原来的std文件方式存放帐号列表,所以可以放心覆盖安装,

下面说一下怎么把这些帐号平滑移动到mysql里面,
在移动前,首先获得列表, 假设邮件列表地址是loongson@anheng.com
那么文件目录就在 /home/vpopmail/domains/anheng.com/loongson
获取列表用ezmlm-list
ezmlm-list /home/vpopmail/domains/anheng.com/loongson >/home/loongson.txt

把一个std模式的邮件列表切换到mysql方式, 需要3个修改
1.建立文件 /home/vpopmail/domains/anheng.com/loongson/sql
 内容只有一行:
 localhost:3306:user:passwd:ezmlm:loongson
2.修改/home/vpopmail/domains/anheng.com/loongson/config,在6:后面增加如下内容:localhost:3306:user:passwd:ezmlm:loongson
3.修改/home/vpopmail/domains/anheng.com/loongson/config,将X:行去掉。

修改前后比较如下:
--- /dev/null    2009-11-21 01:36:45.000000000 +0800
+++ /home/vpopmail/domains/anheng.com/loongson/config    2009-11-21 01:10:28.000000000 +0800
@@ -0,0 +1,1 @@
+localhost:3306:user:passwd:ezmlm:loongson
--- /home/vpopmail/domains/anheng.com/loongson/config.orig    2009-11-21 01:36:45.000000000 +0800
+++ /home/vpopmail/domains/anheng.com/loongson/config    2009-11-21 01:10:28.000000000 +0800
@@ -1,5 +1,4 @@
 F:-abCDEFGHIJKLmNOpqRSTuVWXYZ
-X:
 D:/home/vpopmail/domains/anheng.com.cn/loongson
 T:/home/vpopmail/domains/anheng.com.cn/.qmail-loongson
 L:net
@@ -9,7 +8,7 @@
 3:
 4:
 5:liushiwei@anheng.com.cn
-6:
+6:localhost:3306:user:passwd:ezmlm:loongson
 7:
 8:
 9:

内容解释
localhost mysql服务器地址
3306 mysql端口
user mysql帐号
passwd mysql密码
ezmlm mysql的库名
loongson 表格前缀

每个maiilist地址,需要在库中建立若干个表,其中最重要的表是loongson , 这里面放的就是成员名单。
2个字段 hash和address, address就是邮件地址,hash是一个0-50的随机数, 估计用于散列文件到不同的目录。

修改好config后,再执行ezmlm-list 会提示没有表,这时候我们要用ezmlm-mktab来建立数据库表

ezmlm-mktab用来生成建立数据库表的sql语句, 它是个bash脚本,只需要一个参数,表格前缀
生成的sql语句,我们可以直接管道到mysql命令
ezmlm-mktab loongson |mysql -u user -ppasswd ezmlm
然后再执行ezmlm-list /home/vpopmail/domains/anheng.com/loongson   结果不再提示错误,但是成员列表是空的,
我们可以使用前面备份的列表文件loongson.txt来重新加入
用vi的替换功能,在loongson.txt的每一行前面增加一些东西, 把它变成一个脚本
替换之前:
001@anheng.com
002@anheng.com
...
替换之后:
ezmlm-sub /home/vpopmail/domains/anheng.com/loongson 001@anheng.com.cn
ezmlm-sub /home/vpopmail/domains/anheng.com/loongson 002@anheng.com.cn
...
vi替换命令:[esc]:%s/^/ezmlm-sub \/home\/vpopmail\/domains\/anheng.com\/loongson/g
用替换之后的文件,执行导入
cat  /home/loongson.txt |/bin/bash


这就可以了。ezmlm已经从文件方式存储帐号,更换到数据库方式管理帐号,
使用数据方式后,可以很容易的实现php的web方式进行订阅,或者跟其他的erp等进行整合

责任编辑: admin