星期二, 三月 20, 2007

mailman mailing list

我需要在公司建立一个邮件列表,或者说我需要在自己的企业架构中建立邮件列表,作为团队开发以及用户讨论组等使用。当然至少到目前来看,没有考虑过它会成为基础设施的一部分,我想它应该还是属于上层建筑的。

why not google group?

因为企业的邮箱和邮件列表,特别是内部事务如开发等不能这样做,即使设置了限制,但问题是一方面无法与现有的内部帐号整合在一起,另一方面,如果由于某种原因导致 google group 不能访问(比如年初的地震或者 GFW),则公司的事务将收到影响!所以最终我们需要自己的 mailing list。目前最流行的就是 mailman 了,用 python + C 编写的!

mailman mailing list 有两种接口:web interface && mail interface。及通过 web 页面的表框操作或通过 email 发送诸如 subscribe, unsubscribe 等命令。

安装:
cat .config
pkgname = "mailman";
version = "2.1.9";
user = "mailman";
groups = "web";
group = "mailman";
archive = "mailman-2.1.9.tgz";
command = "tar xfz mailman-2.1.9.tgz";
command = "cd mailman-2.1.9";
command = "./configure --without-permcheck --with-cgi-gid=httpd";
command = "make";
command = "make install";
command = "cd ..";
command = "rm -rf mailman-2.1.9";
time = "20070313 14:01:47 Tue";
使用 rpm 安装则 cgi-gid 比较死,只能使用 apache 用户,只好用源代码编译了。

然后编辑 httpd.conf:
"<"VirtualHost *:80">"
ServerName test.shopex.cn
DocumentRoot "/var/www/html/test"
ScriptAlias /mailman/ /usr/local/mailman/cgi-bin/
Alias /pipermail/ /usr/local/mailman/archives/public
Alias /icons/ /usr/local/mailman/icons/
# AddHandler cgi-script .cgi .py
"<"Directory "/usr/local/mailman/icons/"">"
Options Indexes
Order allow,deny
Allow from all
"<"/Directory">"
"<"Directory "/usr/local/mailman/cgi-bin/"">"
Options Indexes
Order allow,deny
Allow from all
"<"/Directory">"
"<"/VirtualHost">"
然后访问 http://test.shopex.cn/mailman/listinfo(注意修改 hosts 文件),这里 listinfo 实际上是 /usr/local/mailman/cgi-bin/listinfo,是一个二进制的可执行程序!这时可以看到一个页面,并且报告没有创建任何 mailing list。

邮件列表的基本原理就是利用了邮件服务器的 alias 功能。所以使用手工的方法,也可以建立简单的邮件列表,但 Mailman(以前比较流行 Majordomo)可以自动完成大量工作!

将 mailman 和 postfix 集成
sh# vi $prefix/Mailman/mm_cfg.py
MTA = "Postfix"
sh# cd /usr/local/mailman
sh# bin/genaliases
sh# chown mailman:mailman data/aliases*
sh# chmod g+w data/aliases*

sh# vi /etc/postfix/main.cf
myhostname = mail.shopex.cn
mydomain = shopex.cn
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost,
mail.$mydomain, www.$mydomain, ftp.$mydomain
mynetworks = 192.168.0.0/24, 127.0.0.0/8
alias_maps = hash:/etc/aliases, hash:/usr/local/mailman/data/aliases
alias_database = hash:/etc/aliases, hash:/usr/local/mailman/data/aliases


记得要运行 newaliases,并且是 postfix 的 newaliases,RHEL4 可以用:
sh# alternatives --set mta /usr/sbin/sendmail.postfix
来指定。

然后要创建实际的邮件列表。邮件列表既可以使用 command line 的操作命令,也可以从 web 页面上运行 cgi 脚本来实现。下面分别介绍。
sh# /usr/local/mailman/bin/newlist
输入邮件列表的名字,会自动生成如下的邮件列表别名文件的内容。
sh# cat /usr/local/mailman/data/aliases
# This file is generated by Mailman, and is kept in sync with the
# binary hash file aliases.db. YOU SHOULD NOT MANUALLY EDIT THIS FILE
# unless you know what you're doing, and can keep the two files properly
# in sync. If you screw it up, you're on your own.

# The ultimate loop stopper address
mailman-loop: /usr/local/mailman/data/owner-bounces.mbox

# STANZA START: dev
# CREATED: Tue Mar 13 18:40:13 2007
dev: "|/usr/local/mailman/mail/mailman post dev"
dev-admin: "|/usr/local/mailman/mail/mailman admin dev"
dev-bounces: "|/usr/local/mailman/mail/mailman bounces dev"
dev-confirm: "|/usr/local/mailman/mail/mailman confirm dev"
dev-join: "|/usr/local/mailman/mail/mailman join dev"
dev-leave: "|/usr/local/mailman/mail/mailman leave dev"
dev-owner: "|/usr/local/mailman/mail/mailman owner dev"
dev-request: "|/usr/local/mailman/mail/mailman request dev"
dev-subscribe: "|/usr/local/mailman/mail/mailman subscribe dev"
dev-unsubscribe: "|/usr/local/mailman/mail/mailman unsubscribe dev"
# STANZA END: dev
实际上首先要创建 site-wild mailing list:
site-wild mailing list:
sh# bin/newlist mailman
sh# bin/config_list -i data/sitelist.cfg mailman
通过如下地址访问邮件列表信息:
http://test.shopex.cn/mailman/listinfo/dev
看看如果不存在的列表的情况:
http://test.shopex.cn/mailman/listinfo/users
"No such list users"

下面设置密码,除了 list owner 之外,有两个特殊用户,即 Administrator 和 list creator,前者相当于 root,后者一般专门用来从 web page 创建 list 的时候使用。这两者分别用如下命令创建密码:
sh# bin/mmsitepass
sh# bin/mmsitepass -c
为了能够从页面访问,必须启动 mailman 服务,实际上会启动一个名为 qrunner 的进程。对 RHEL4,使用:
sh# cp scripts/mailman /etc/init.d/mailman
sh# chkconfig --add mailman
sh# chkconfig mailman on
sh# chkconfig sendmail off
sh# chkconfig postfix on
那么现在可以打开页面 http://test.shopex.cn/mailman/create 来建立邮件列表。在最下面使用 list creator 密码提交。

hostname settings 会产生影响。例如 http://test.shopex.cn/mailman/listinfo,有显示
"If you are having trouble using the lists, please contact mailman@test1.shopex.cn."(这里我更改了主机名),显然,这个值根据主机名而改变了。但是这不是我希望的值。

这里先不考虑虚拟主机的情况,那么需要修改 mm_cfg.py,增加 DEFAULT_EMAIL_HOST 和 DEFAULT_URL_HOST。这两个参数在安装时会写入到 /usr/local/mailman/Mailman/Defaults.py 中,但不要直接编辑这个文件,编辑 /usr/local/mailman/Mailman/mm_cfg.py 就好了。

比如在 Defaults.py 中的默认设定为:
DEFAULT_EMAIL_HOST = 'docs.shopex.cn'
DEFAULT_URL_HOST = 'docs.shopex.cn'
这会有问题,因为我在 apache 上发布的虚拟主机名是 test.shopex.cn,并且我也不希望用户把邮件发送到 users@docs.shopex.cn 或 users@test.shopex.cn 这样的地址,而是希望是 users@shopex.cn 这样的地址(即 mailing list 的地址将是 listname@DEFAULT_EMAIL_HOST)。那么我编辑 mm_cfg.py
DEFAULT_EMAIL_HOST = 'shopex.cn'
DEFAULT_URL_HOST = 'test.shopex.cn'
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
这里 DEFAULT_URL_HOST 不能写成"shopex.cn",否则你在页面上访问不行了,因为链接到错误的域名上去了。通常 URL_HOST 和 EMAIL_HOST 会不同,如上。因为 EMAIL_HOST 通常是你的整个域的,而 postfix 可以为整个域接收和发送邮件,但 URL_HOST 则是具体的主机的,如果设置成 shopex.cn,则在 http://test.shopex.cn/mailman/listinfo/dev 进行 subscribe 的时候,会连接到 http://shopex.cn/mailman/subscribe/dev,但这个可能是不存在的,或根本不是统一台主机(除非确实是同一台主机并且对 shopex.cn 域做了同样的 A 记录)。

注意后面必须使用 add_vertualhost function call。

对于已经存在的域,比如前面创建了 dev,但并没有设定其 mailing list 为 dev@shopex.cn,而仍然是 dev@docs.shopex.cn 或 dev@test.shopex.cn,那么
You will want to run the bin/fix_url.py to change the domain of any existing lists.
实际上是这样做的
sh# cd /usr/local/mailman
sh# bin/withlist -l -r fix_url dev -u shopex.cn
进入一个列表来管理:
http://test.shopex.cn/mailman/amdin/users
进入可以用 site-password,也可以用 create 时发送的那个由 mailman 生成的密码,取决于你的管理策略。每个列表成员也有自己的密码,也是在订阅的时候发送的那个,可以用它登入管理自己的设置。

subscribe 可以访问 http://test1.shopex.cn/mailman/listinfo/dev 这个 URL。收到邮件后从页面 confirm 即可。

其他一些命令:
bin/list_lists
bin/rm_lists
bin/list_owners -w
bin/list_members dev

没有评论: