Majordomo
Majordomo 是一个出色的 Perl 脚本,用于维护邮件列表。它的巧妙之处在于,一旦站点的系统管理员完成了基本设置,列表的所有者(实际上不必在运行 Majordomo 的计算机上拥有帐户)就可以通过电子邮件消息处理日常维护。
Majordomo 最初由 Brent Chapman 编写,因为他尝试编译和设置 ListProc 时感到沮丧。最新版本的 Majordomo 由 John Rouillard 维护。
Majordomo 及其相关程序的设计理念遵循 Unix 的指导原则:使用小型、易于理解的工具套件来完成出人意料的复杂任务;并且它确实出色地完成了这些任务。它也使系统易于扩展。虽然存在一些问题,但是——这引出了使用 Majordomo 的第二个巨大优势——您可以自己修复它们。
Majordomo 是免费的。这意味着您可以获得所有源代码,并且可以随心所欲地修改它。不仅如此,考虑到编写混淆 Perl 代码是多么容易,这些源代码的注释非常完善且易于理解。
当然,关于 Majordomo,有些方面不如 LISTSERV 和 ListProc 做得好——它处理大型、繁忙的邮件列表不如它们有效。然而,它比这两者都更容易管理(一旦您设置好别名),您无需付费,并且它可以与 Linux 配合使用。
首先确保您拥有可以找到的最新副本。本讨论将涵盖 Majordomo 1.93,但谁知道呢:当您阅读本文时,2.0 可能已经发布了。无论如何,都不要使用 1.92,因为它有一个相当糟糕的安全漏洞。Majordomo 的主站点是 ftp://ftp.greatcircle.com/pub/majordomo/。
您还需要 Perl,至少是 4.035 版本,最好是 4.036 版本。Majordomo 可以在 Perl 5.000 下运行,但它是在 Perl 4.036 下开发(并且正在开发)的。此站点正在运行 sendmail 8.6.91,但使用 smail 应该也可以,尽管我没有尝试过。请参阅脚注 1。
编译 Majordomo 很简单。只需注意以下几点
Majordomo 期望 Perl 位于 /usr/local/bin/perl
在开箱即用时,存在一个错误,导致 Majordomo 读取两次配置文件,一次从 /etc/majordomo.cf 读取,另一次从 $homedir/majordomo.cf 读取。但这很容易修复;只需从 config_parse.pl 中删除以下行:require `majordomo.cf';。
对于以下内容,我假设您已设置一个 /etc/majordomo.cf,如下所示
$whereami="yourhost.yourdomain"; $whoami="Majordomo@$whereami"; $whoami_owner="Owner-Majordomo@$whereami"; $homedir="/usr/lib/majordomo"; $listdir="/var/spool/majordomo/lists"; $digest_work_dir="/var/spool/majordomo/digest"; $log="$homedir/Log"; $mailer="/usr/lib/sendmail -f$sender"; $filedir="/var/spool/majordomo/archive"; $filedir_suffix=""; $index_command="/bin/ls -lRL"; $return_subject=1; $majordomo_request=0; umask(007); @archive_dirs=();
并且目录 /var/spool/majordomo/lists、/var/spool/majordomo/digest 和 /var/spool/majordomo/archive 存在,并且由 majordomo.majordomo 拥有,模式为 775。
为此,我假设您正在使用 sendmail 8.6.9(纯粹是因为这是我们在 Frontier 使用的邮件程序)。如果您没有使用版本 8 的 sendmail,则需要将 majordom 添加到 sendmail 允许欺骗邮件信封发件人的“受信任”用户列表中(在 sendmail.cf 中找到 T 行并将 majordom 添加到列表中)。
以 root 用户身份,将以下行添加到您的 /etc/aliases 文件中
majordomo: "|/usr/lib/majordomo/wrapper majordomo" owner-majordomo: postmaster
现在假设您想要设置一个名为“test”的列表,其中包含 Majordomo 提供的所有铃声、口哨和小玩意。您需要将 列表 1 中显示的行添加到您的 /etc/aliases 文件中。
运行 newaliases 使别名可见。
现在,su 到 majordomo 并运行 列表 2 中的命令。
编辑 /var/spool/majordomo/lists/test.config,设置新的列表密码,并在必要时添加审核人。希望它是不言自明的。将 test.config 复制到 test-digest.config 并编辑 message_footer 和 message_fronter 等内容。
例如
message_fronter << END In test today: _SUBJECTS_ END message_footer << END -- To switch to the undigested list, send this to majordomo@host.domain unsubscribe test-digest subscribe test end END
注意配置部分 advertise 和 noadvertise。这些部分需要一个 Perl 正则表达式列表,完整包含 / 符号。当有人查询您的 Majordomo 服务器以获取列表列表时,将使用这些表达式。因此,假设您有一个名为“local-jellygarglers”的列表,您不希望您站点以外的任何人知道(谁会呢),您可以将以下内容放入您的 local-jellygarglers.config 文件中
advertise << END /yourdomain$/
EOF
这意味着,只有当发件人的地址在您的域名 yourdomain 中时,Majordomo 才会在其列表列表中提及该列表。
Majordomo 提供的默认摘要对于繁忙的列表来说还不错。它会等到摘要大小达到某个指定大小(使用 test-digest.config 中的 maxlength 设置进行设置),然后发送摘要。但是,如果您正在查看一个发帖频率不高的列表,则这不是一个好的解决方案——特别是如果大多数列表订阅者选择摘要版本,则消息可能会在摘要队列中滞留数周而未读。对此有两种解决方案。第一种方法是将 contrib/digest.send 复制到 /usr/lib/majordomo 中,编辑 DIGESTDIR 的值以对应于您存放摘要的目录,然后添加以下行
0 2 * * * /usr/lib/majordomo/digest.send
到 Majordomo 的 crontab 文件。摘要将在每天早上 2 点发送,没有问题。
第二种(在我看来更简洁的)方法是应用 Paul Close 的补丁到摘要,并使用稍微不同的 crontab 行。对摘要的补丁做了一些事情。它向 list.config 文件添加了变量 digest_maxlines 和 digest_maxdays。(如果您在创建配置文件后执行此操作,则需要将命令 writeconfig test 和 writeconfig test-digest 邮寄给 majordomo,以便它可以再次写出一个新的、有效的配置文件,因此最好在制作配置文件之前完成此操作。)这两个参数意味着您可以调整摘要器,以便摘要永远不会发送任何超过(例如)一周的消息。
该补丁还向摘要添加了 -p 开关。当使用此开关调用摘要时,它会检查是否应发送摘要(即,它检查摘要中的任何文章是否太旧),并在必要时发送摘要。要使用它,只需将调用摘要程序的行中的 -m 更改为 -p,从 digest.send 开始。
我假设您将使用 rouilj 的 archive2.pl 进行存档工作。这可以在 Majordomo 源代码目录的 contrib/archive2.pl 中找到,并且它也应该链接到 Majordomo 主目录中的 archive。
要使 archive2 为测试邮件列表工作,您唯一需要做的就是更改
@archive_dirs lines in /etc/majordomo.cf to @archive_dirs=("/var/spool/majordomo/archive/test");
正如他们所说,瞧!
由于您已设置查找给定列表存档的规则,因此 Majordomo 本身知道列表的文件存储在该目录中(在我们的例子中是 /var/spool/majordomo/archive/test),并且该邮件列表的成员(或其他成员,具体取决于您如何配置列表)可以使用邮件消息中的 get 命令检索其中的任何内容到 Majordomo。
Majordomo 既不知道也不关心此目录的内容。当被请求索引时,它只返回文件列表;当被请求文件时,它只返回该文件。这些文件实际上不必是邮件存档,因此您可以将任何可能引起列表用户兴趣的内容放在那里。例如,我们有一个客户正在运行一个邮寄游戏,他将所有游戏玩家都可以免费获得的文件放在存档目录中,以便他的玩家可以使用邮件检索它们。
但是,与 Majordomo 的文件处理有关的警告。由于 Majordomo 不知道文件的内容,因此它不知道该文件是否是二进制文件。(这是一个有意识的设计决定——如果您需要进行繁重的文件工作,Majordomo 可以与 ftpmail 接口,但这又是另一回事了。)因此,如果您想提供二进制文件,您需要先手动 uuencode 并拆分它们。
现在该列表实际上已准备好移交给列表管理员,以便通过邮件进行操作。剩下要做的唯一事情是为邮件列表创建一个临时信息文件 (/var/spool/lists/test.info)——这应该是一个简短的文件,其中包含列表的描述、内容、负责人、政策等。如果您不了解所有这些,只需放置一个虚拟信息文件,让列表管理员担心正确设置它。
现在您已准备好设置列表的第一个订阅者。这通常是列表的所有者(test-approval 和 owner-list 指向的那个人),在本例中是 pdcawley@ftech.co.uk。将以下邮件消息发送到 Majordomo
To: majordomo Subject: This bit is irrelevant approve foo subscribe test pdcawley@ftech.co.uk end
其中 foo 是列表密码,pdcawley@ftech.co.uk 是列表的所有者。
您还应该向该用户发送 Majordomo 源代码目录中的 Doc/list-owner-info 文件的副本,您已对其进行编辑以考虑列表详细信息(所有这些都在文件顶部设置),以便他/她能够远程管理列表,而无需问您太多问题。
当然,如果您既是系统管理员又是邮件列表管理员,则需要自己阅读此文件。
您知道吗——Majordomo 有一堆各种各样的邮件列表。我强烈建议您至少加入 Majordomo-users。为此,请在邮件正文中将以下内容发送到 majordomo@greatcircle.com
subscribe majordomo-users lists end
这将使您订阅 majordomo-users,并向您发送可用邮件列表的列表。
Piers Cawley (pdcawley@ftech.co.uk) 是 Frontier Internet Services 的系统警长,这是一家英国公司,提供各种令人眼花缭乱的连接服务。Piers 的大部分时间都花在管理运行这些服务的 Linux 机器上。在他的大量空闲时间(哈!)里,Piers 有唱民歌的令人不安的倾向。您可以给他发送电子邮件,也可以嘲笑他在 www.ftech.co.uk/~pdcawley 上糟糕的个人主页。