【专题介绍】
大规模计算机网络主要服务之管理方法
(2)

电子邮件环境的生成方法(5)

3.2 中规模邮件组管理软件Majordom

前一节中所介绍的方法虽然简单,但是却存在一些问题.

(1) 当邮件组的参加人数过多时,登录管理等手工工作既麻烦又容易出错.
(2) 无法应付更多的用户要求.例如,邮件组的信件自动回执,查看参加者信息等.
(3) 不利于多种邮件组的统一管理,和对投稿者的投稿活动加以限制.
(4) 容易生成退返信息,CPU资源占用较大.
对参加人数较多的中大型邮件组, 需要采用专用的管理软件.目前,比较常用的这 类软件有很多.这里,让我们先来介绍一下利用Majordomo来建立邮件组的方法.

3.2.1 Majordomo

Majordomo为可以对多个邮件组进行自动处理的Perl程序包. 利用Majordomo可以 自动地管理用户登录,退出,用户查寻,和其他一些用户请求.并可以建立一些常用的 受控邮件组(moderated list), 对参加者,及参加者所投递的稿件等进行监控,由邮 件组管理员裁决是否接受用户请求. 系统管理员可以通过电子邮件对邮件组进行控 制.

Majordom的最大的有点在于它的简单性和易维护性. 与另一个大型邮件组管理软 件Listproc/ListServe相比,Majordomo比较容易为人们所理解, 便于邮件组的新手 管理员迅速建立邮件组.另外,由于Majordomo是用Perl程序所构成的,精通Perl程序 的管理员可以按照自己的需要改动程序,构筑适合于自己的邮件组系统.

利用Majordomo建立邮件组时,需要用到Perl程序环境. Perl程序的安装方法等说 明与本连载目的无关,这里予以省略.请各位读者参照相应文献自己准备好工作环境.

3.2.2 安装Majordomo服务器

(1) 准备工作
请从各大FTP服务器下载majordom的最新版.当前(1997年4月)的最新版为:

majoedomo-1.94.1.tar.gz

使用该版本时需要用到5.001以上的Perl.
为了运行majordomo需要为其决定用户ID(user id)和用户组ID(group id). 运行majordomo的用户名一般为majordom. 同时为了方便,组名也可以采用同 样的名称. 这里假定UID=1000,GID=1000,存放majordomo程序,及建立邮件组 的用户根目录为/home/majordomo.

用vipw命令编辑/etc/passwd文件添加用户名:
% vipw
majordom:*:1000:1000:Majordomo Server:/home/majordomo:

编辑/etc/group文件添加用户组名:
% vi /etc/group
majordom:*:1000:majordom

建立majordom的用户根目录:
% mkdir /home/majordomo
% chown majordom.majordom /home/majordomo
% chmod 755 /home/majordomo

(2) 展开源程序

这里假定展开在/pub/mail目录下.
% cd /home/mail
% gtar -zxvf majordomo-1.94.1.tar.gz
(注意,没有GNU tar 时: gzcat majordomo-1.94.1.tar.gz|tar xvf -)
% cd majordomo-1.94.1

(3) 针对所在环境修改Makefile文件

修改perl程序路径
PERL=/usr/local/bin/perl

指定编译命令
CC = gcc
(Solaris系统时请使用/opt/SUNWspro/bin/cc)

设定W_HOME参数,指定majordomo路径(邮件组根目录)
W_BIN= /home/majordomo

指定UID和GID
W_USER = 1000
W_GROUP = 1000

指定联机手册文件存放位置
MAN = /usr/local/man

对POSIX系统(Sun Solaris, SGI Irix 5 and 6, Dec Ultrix MIPS, # BSDI or other 4.4-based BSD, Linux)指定以下参数:
WRAPPER_OWNER = root
WRAPPER_GROUP = $(W_GROUP)
WRAPPER_MODE = 4755
POSIX = -DPOSIX_UID=$(W_USER) -DPOSIX_GID=$(W_GROUP)

(4) 生成格式文件majordomo.cf

修改源程序中所附带的格式文件样本sample.cf来生成majordomo.cf.
% cp sample.cf majordomo.cf

修改以下参数:
$whereami = "mailserv.domain";
$homedir = "/home/majordomo";
$listdir = "/home/majordomo/lists";
$digest_work_dir = "/home/majordomo/digest";
$log = "$homedir/Majordomo.log";
$sendmail_command = "/usr/lib/sendmail";

(5) 编译源程序安装执行用代码

% make install
% make install-wrapper

如果出现编译错误请执行 make clean,然后再修改Makefile文件,重新编译. (请注意wrapper的用户属性为root权限值为4755).

生成邮件组存放用目录:
% mkdir /home/majordomo/lists
% chown majordom.majordom /home/majordomo/lists

(6) 测试安装结果及格式文件设定是否合适:

% cd /home/majordomo
% ./wrapper config-test
如果perl的版本过低时会出现一些错误信息,这时请更新perl版本.

修改/etc/aliases文件(Solaris时为/etc/mail/aliases),追加以下内容:
#
# majordomo 1.94.1
#
owner-owner: mlmaster (请填入管理者ID)
majordomo: "|/home/majordomo/wrapper majordomo"
majordom: majordomo
majordomo-owner: mlmaster (请填入管理者ID)
owner-majordomo: mlmaster (请填入管理者ID)

然后执行newaliases命令,使设定生效.

向majordom@mailserve.domain发送信件进行服务器动作测试,如果执行结果 如下,则可以认为安装工作正常:

% mail -v majordom@mailserve.domain
Subject:
lists
.
EOT
majordom... aliased to majordomo
majordomo... aliased to "|/home/majordomo/wrapper majordomo"
"|/home/majordomo/wrapper majordomo"... Connecting to prog...
"|/home/majordomo/wrapper majordomo"... Sent

这时,可以收到一封回执信件:
% mail
>N 6 Majordomo Sun Apr 13 13:32 19/678 "Majordomo results"
& (CR)

From Majordomo-Owner@mailserv.domain Sun Apr 13 13:24:18 1997
Date: Sun, 13 Apr 1997 13:24:18 +0900
To: Majordomo-Owner@mailserv.domain
From: Majordomo@mailserv.domain
Subject: Majordomo results

>>>> lists
Majordomo@mailserv.domain serves the following lists:

Use the 'info ' command to get more information
about a specific list.

&

由于尚未建立邮件组,因此这个结果是正常的.

至此为止,如果没有出现什么问题服务器的安装工作便告结束.接下来需要着手建 立邮件组.

3.2.3 建立邮件组

这里,让我们来建立一个名称为"majo"的邮件组.邮件组"majo"的实体将被安装到 /home/majordomo/lists目录下.

(1) 登录邮件组

假定"majo"的管理员为"mlmaster".

生成邮件组注册文件:
% touch /home/majordomo/lists/majo

建立邮件组管理者通行字文件:
% vi /home/majordomo/lists/majo.passwd
major-pass (填入通行字)

生成邮件组内容简介文件,填入邮件组"majo"的简单介绍:
% vi /home/majordomo/lists/majo.intro
!!欢迎您参加本邮件组!!

生成邮件组的简单使用说明文件:
% vi /home/majordomo/lists/majo.info
!!欢迎您参加本邮件组!!
本邮件组内可以使用以下命令:
.......

修改文件处理权限及属性:
% chown majordom.majordom /home/majordomo/lists/majo.*

修改/etc/aliases文件,追加以下内容(注意,因行幅所限,下例中加入了适当 地换行:

      #
      majo:"|/home/majordomo/wrapper resend -l majo -h mailserv.domain 
                                              majo-going"
      majo-going::include:/home/majordomo/lists/majo
      owner-majo: mlmaster
      majo-request:"|/home/majordomo/wrapper resend request-answer majo"
      majo-approval:owner-majo
      majo-owner: owner-majo
然后执行newaliases命令,使设定生效.

(2) 登录参加者

可以直接编辑/home/majordomo/lists/majo文件,在该文件中填入参加者地 址.也可以用Email来进行登录.

% mail majordom@mailserv.domain
Subject:
subscribe major user@host.domain (填入登录地址) .

如果登录成功,则可以收到一封来自majordom@mailserv.domain的信件.内容 如下:

      >>>> subscribe majo user@host.domain
      Your request to Majordomo@mailserv.domain

        subscribe majo user@host.domain

      has been forwarded to the owner of the "majo" list for approval. 
      This could be for any of several reasons:

          You might have asked to subscribe to a "closed" list, where 
             all new additions must be approved by the list owner. 

          You might have asked to subscribe or unsubscribe an address 
             other than the one that appears in the headers of your mail 
             message.

      When the  list  owner  approves your request, you will be notified.

      If you have any questions about the policy of the list owner, 
      please contact "majo-approval@mailserv.domain"

      Thanks!

      Majordomo@mailserv.domain
在邮件组管理员mlmaster处将会收到一封许可信件,内容如下:
     user@host.domain  requests that you approve the following:

        subscribe majo user@host.domain

     If you approve, please send a message such as the following back to
     Majordomo@mailserv.dimain(with the appropriate PASSWORD filled in, 
     of course):

        approve PASSWORD subscribe majo user@host.domain

     If you disapprove, do nothing.

     Thanks!

     Majordomo@mailserv.domain
如果管理员同意这项登录,则可以给majordom回信,在信中写入以下一行内容:
    approve majo.pass subscribe majo user@host.domain
            ^^^^^^^^^
            这里为/home/majordomo/lists/majo.passwd中所登录的内容.
许可成功时, 管理员(mlmaster)将收到一封题(Subject)为"SUBSCRIBE majo"的 信件.内容如下:

user@host.domain has been added to majo.

同时, 在登录者(user@host.domain)处将会收到一封题为"Welcome to majo"的 信件.内容中将含有简单的参加与退出方法说明,及major.intro中的内容.

这里,也许读者会问:为什么登录手续这样繁杂?
要回答这一问题请参阅下一节"邮件组的格式文件设定".

3.2.4 邮件组的格式文件设定

这里扔以邮件组"majo"为例进行说明.

在所生成的各个邮件组的格式文件中主要含有以下设定参数,请根据所需加以设 定.
(注意,在初始生成时,该格式文件,例如上例中的majo.config并不存在. 当用户 向Majordomo服务器发送请求信件时,系统将会自动生成一个省缺格式文件,读者 可以对该文件稍作改动, 即可生成自己的邮件组的格式文件,以便对邮件组加以 控制.)

admin_passwd = 字符串
邮件组管理者通行字.省缺值为majo.passwd文件中设定值.
省缺值为majo.admin
例: admin_passwd = majo.pass

administrivia = yes/no
yes: majordomo在所收到的信件中进行两次检索,抽取命令行.例如,标题行 (Subject),或信件正文前五行中是否为大写或小写的"subscribe",或 "unsubscribe"; 是否含有"help"或"RCPT:"信息;是否含有"change.. .address"等信息.如果发现了这类信息, 则将相应的信件传送给邮件 组管理员.邮件组管理员可以通过给回送信件添加"Approved:"信头来 处理用户请求.
no: 只进行一次上述检索.
省缺值为yes.

advertise << END
正规表现
正规表现
...
END
当收到含有lists(邮件组列表)命令的请求信件时, 将信件发送者地址与这 里的正规表现进行比较, 如果在正规表现中不含有该地址时,则在所回送的 lists结果不提示本邮件组名;仅当发送者地址与正规表现完全一致时,才在 lists结果中提示本邮件组名.当正规表现行为空行时,则公开lists命令,对 所有lists请求回送本邮件组名. 省缺值为空行.

例:
advertise << END
user1@host1.domain1
user2@host2.domain2
END

noadvertise << END
正规表现
正规表现
...
END
与advertise正好相反,将所收到的lists请求信件之发送者地址与这里的正 规表现进行比较,如果在正规表现中含有该地址时,则在所回送的lists结果 中不提示本邮件组名;反之则提示本邮件组名.当正规表现行为空行时,则公 开lists命令,对所有lists请求回送本邮件组名.
省缺值为空行.
例:
noadvertise << END
user1@host1.domain1
user2@host2.domain2
END

approve_passwd = 字符串
指定执行管理用命令时所需要的通行字. 在"Approved:"信头中填入该通行 字,即可允许执行为用户所请求的命令.
省缺值为"majo.pass".
例: approve_passwd = majo.pass

archive_dir = 目录名字符串
Majordomo-1.94.1提供简易库存(archive)功能. 本参数用于指定信件库目 录名.管理员需要按照编译majordomo时,在majordomo.cf中所指定的邮件组 根目录($listdir)下建立该目录,并设定其UID和GID为majordom.
省缺值为"majo.archive".
(即,信件库路径为/home/majordom/lists/majo.archive)

comments << END
提示信息
提示信息
...
END
为邮件组管理员提供提示信息.一般不太常用.

date_info = yes/no
yes: 省缺值. 为newinfo命令的输出结果添加最终变更时间信息.
no: 为info命令的输出结果添加info文件的最终变更时间信息.

debug = yes/no
yes: 省缺值. 服务器调试用纠错方式.纠错信息将出现在"mail -v"命令的 执行结果中.

description = 字符串(50字节以内)
这里所指定的字符串将作为提示显示在lists命令所列出的邮件组后面.
省缺值:未指定.
例: description = 中国问题讨论组

get_access = open/closed/list
open: 省缺值.开放信件库的下载权限.允许所有用户通过信件用get命令来 下载信件库内之文本文件.
closed: 禁止用户下载信件库内之文本文件.
list: 仅对邮件组之参加者开放信件库的下载权限.

index_access = open/closed/list
与get_access类似,对用户的index命令加以限制.
省缺值:open.

info_access = open/closed/list
与get_access类似,对用户的info命令加以限制.
省缺值:open.

intro_access = open/closed/list
与get_access类似,对用户的intro命令加以限制.
省缺值:open.

maxlength = 数值
指定信件之最大文本长度.省缺值为40000.

message_fronter << END
说明文
说明文
....
END
为投稿到本邮件组的所有信件在正文前面追加说明文.
省缺值:未指定.

message_headers << END
新定义信头
新定义信头
...
END
为投稿到本邮件组的所有信件追加新定义信头.
省缺值:未指定.
例:
message_headers << END
Comment: This is a Test Server.
Comment: To join this list, mail a "subscribe" command to me.
END

moderate = yes/no
yes: 设定监控组. 投稿到本邮件组的所有信件均需经过管理员的审阅后才 播放给所有参加者.
no: 省缺值.公开邮件组.

moderator = 地址字符串
moderate=yes时,指定审阅者地址.
省缺值:未指定.

precedence = bulk
追加"Precedence:"信头. 抑制错发信件的回送信息.

reply_to = 地址字符串
追加"Reply-to:"信头.指定回送地址.
省缺值:未指定.

restrict_post = 文件名[:文件名]
利用该参数可以对投稿者加以限制.仅允许在所指定的文件中定义了的用户 投稿.可以指定多个文件名(用":"隔开).这种方式正适合于电子杂志等播放 式邮件组.
省缺值:未指定.
strip = yes/no
有些邮件地址中往往含有一些GCOS说明.例如:
user@host.domain "User Name"
为保证供邮件组能够正确的传递信件, 将本参数指定为yes时可以不保存这 些地址说明.
省缺值:yes.

subscribe_policy = open/closed/auto/open+confirm
open: 对非正规参加申请转交管理员批准.接受正规申请.
closed: 所有参加申请均需要经过管理员批准.
auto: 自动受理所有参加申请.
open+confirm: 对所有参加请求分配一个注册代码进行确认. 如果用户的回 送代码正确,则允许其加入本邮件组.
省缺值:open.

unsubscribe_policy = open/closed/auto
除退出含义之外,均与subscribe_policy参数功能一致.
省缺值:open.

which_access = open/closed/list
open: 公开which命令权限.用户可以用该命令查看自己的所属邮件组.
closed: 禁止用户使用which命令.
list: 仅允许邮件组的参加者使用which命令.
省缺值:open.

who_access = open/closed/list
open: 公开who命令权限.用户可以用该命令查看邮件组参加者名单.
closed: 禁止用户使用who命令.
list: 仅允许邮件组的参加者使用who命令.
省缺值:open.

以上对Majordomo的主要格式控制参数进行了简单地介绍. Majordomo中还含有一 些有用的参数, 如:汇编式邮件组相关参数等等.有兴趣的读者请参阅Majordom所附 带的文本文件.

格式文件例:

      date_info           =   yes
      date_intro          =   yes
      description         =   中国问题讨论组
      get_access          =   list
      index_access        =   list
      info_access         =   list
      intro_access        =   list
      which_access        =   list
      who_access          =   list
      maxlength           =   60000
      precedence          =   bulk
      reply_to            =   majo@mailserv.domain
      restrict_post       =   accept
      subscribe_policy    =   open
      unsubscribe_policy  =   open
3.2.5 邮件组的题名辅助及信件库

当用户所参加的邮件组较多时,每天将会从各个邮件组传来许多信件. 这时,如果 各个邮件组所发送的标题栏(Subject:)中最好标有相应的邮件组名和序列号. 早期 的Majordomo 由于没有这项功能,需要用到distribute等其他软件. 新版Majordomo 已经可以提供这种功能. 例如,需要给邮件组"majo"的标题栏添加"[MAJO:序列号]" 时的具体设定方法如下.

(1) 用sequencer命令添加标题序列号

(a)编辑/home/majordom/lists/majo.seq文件,添加初始序列号"1".
(b)修改majo.config文件,添加下述定义行:
subject_prefix = [$LIST:$SEQNUM]
(c)修改/etc/aliases文件,将
major: "|/home/majordomo/wrapper resend -l major -h mailserv.domain
major-going"
修改为:
major: "|/home/majordomo/wrapper sequencer -l major -n -h
mailserv.domain major-going"
(d)执行newaliases命令.
这样,即可实现上述功能.
但是,这里仍然存在一个问题.利用Majordom-1.94-1中所附带的sequencer时, 回送信件的标题栏会出现以下情形:

Subject: [MAJO:10]Re:[MAJO:9]Re:[MAJO:8]

这样看上去非常难看.为了解决这个问题,请用以下差分文件来修改sequencer 程序:

     ------------------------------------------------------------------
     *** Tools/sequencer     Wed Jan 29 20:26:33 1997
     --- sequencer   Sun Feb  2 16:49:02 1997
     ***************
     *** 153,158 ****
     --- 153,163 ----
           &abort("sequencer: Can't open /tmp/sequencer.$$.in: $!");

       while (<STDIN>) {
     +       if (/^Subject:/) {
     + #             s/[\(\[].*[\]\)]//g;
     +               s/R[eE]\: [\(\[].*[\]\)]/Re\:/g;
     +               s/R[eE]\:.*R[eE]\:/Re\:/g;
     +       }
     +       #
           print IN $_;
       }
     ------------------------------------------------------------------
(2) 用sequencer命令实现信件库功能

利用sequencer命令可以实现与distribute同等库存功能.设定例如下:

(a)生成信件库目录
% mkdir /home/majordom/lists/majo.archive
% chown majordom.majordom /home/majordom/lists/majo.archive
% chmod 755 /home/majordom/lists/majo.archive

(b)确认majordom.cf之128,129行内容是否与下述内容一致
$filedir = "$listdir";
$filedir_suffix = ".archive";

(c)修改/etc/aliases文件,将
major: "|/home/majordomo/wrapper sequencer -l major -n -h
mailserv.domain major-going"
修改为:
major: "|/home/majordomo/wrapper sequencer -l major -N -h
mailserv.domain major-going"
这样,当用户向majo@mailserv.domain发送信件时, 信件将会自动的保存在信 件库/home/majordom/lists/majo.archive中,相同将为其建立一个名为INDEX 的索引文件.索引文件可以用index命令来获取.

3.2.6 Majordomo的基本命令

需要了解Majordomo的基本命令之使用方法时, 可以向majordomo服务器发送一封 标题或正文为"help"的信件,系统将回送给您一份说明书. 参照这份说明书,相信各 位读者能够自己掌握majordom的基本使用方法.

3.2.7 Majordomo的问题点

Majordomo作为一个邮件组管理软件虽然有很多优点,但也存在着一些不容忽视的 问题.

·Majordomo由于采用了Perl程序语言,执行时较费时间.不利于大规模邮件组.
·Majordomo在传递信件时依赖于系统的MTA.
·库存管理功能较弱.
·基本上无法控制错发信件的回送信息.
·当系统出现故障后,邮件组的中断工作恢复比较困难.
·不具备用户级的通行字功能.
·用户无法根据自己的需要(例如,根据负荷状况定时转发)控制邮件组.
·不具备邮件组的分散管理功能.
Majordomo并没有因为这些问题的存在,而影响它在网络中的名声. 作为一个中型 邮件组管理软件赢得了越来越多的用户.

(钱飞/fei@come.or.jp)