メーリングリストの作成


参考文献
FreeBSDパーフェクトネットワーク(毎日コミュニケーションズ)
参考URL
Nob's Home
Fujie's Home Page
メーリングリストサーバーで有名なmajordomoをインストールして、メーリングリストを運営出来るようにしたいと思います。

まずはじめに、 ftp://ftp.greatcircle.com/pub/majordomo/のFTPサイトからmajordomoのソースを取ってきます。現時点での最新版はmajordomo-1.94.5.tar.gzでしょうか。
で、このファイルを、適当なディレクトリにコピーして展開します。
以下、/usr/tmpのディレクトリにコピーして、展開した例です。

#hoge cd /usr/tmp
#hoge zcat majordomo-1_94_4_tar.gz | tar xvf -

ファイルを展開したら、majordomo-1.94.5のディレクトリが出来ますので、そこに移動します。
そして、sample.cfのファイルを利用して、majordomo.cfのファイルを作成します。

#hoge cd /usr/tmp/majordomo-1.94.5
#hoge cp sample.cf majordomo.cf


Makefileの編集
Makefileをエデイタで開いて、以下の行を書き換えます。
PERL = /bin/perl
W_HOME = /usr/test/majordomo-$(VERSION)
W_USER =123
W_GROUP =45
TMPDIR = /usr/tmp


	↓


PERL = /usr/bin/perl
W_HOME = /var/ML/majordomo
W_USER =54
W_GROUP =54
TMPDIR = /usr/tmp
PERL =
perlのインストールされている場所です。perlがインストールされていないと動作しないので、インストールしておきましょう。
W_HOME =
majordomoがインストールされて、majordomoのホームとなる所です。自分の好きな場所を指定しましょう。
W_USER、W_GROUP
majordomoを実行するためのユーザー権限と、グループ権限です。ここでは54と指定していします。この指定は以外と重要で、きちんと設定されていないとsendmaiがメールのリレーをしてくれなかったりします。
TMPDIR = /usr/tmp
majordomoが作業するときに使用するディレクトリです。/usr/tmpというディレクトリが無い場合は、適当なディレクトリを指定しましょう。書き込みがOKなディレクトリなら何でもいいと思います。(書き込みが出来るのか、パーミッションに注意してください。)
majordomo.cfの編集
majordomo.cfをエデイタで開いて、以下のように書き換えます。
$whereami = "example.com";
$sendmail_command = "/usr/lib/sendmail";
$TMPDIR = $ENV{'TMPDIR'}|| "/usr/tmp";


		↓


$whereami = "hoge.foo.jp";
$sendmail_command = "/usr/sbin/sendmail";
$TMPDIR = $ENV{'TMPDIR'}|| "/usr/tmp";
$whereami =
majordomoを動かすコンピュータのホスト名です。
$sendmail_command =
sendmailがインストールされているところです。FreeBSDは一般的に/usr/sbin/sendmailです。
$TMPDIR = $ENV{'TMPDIR'}||
majordomoが一時的に作業するディレクトリです。/usr/tmpが無い場合は、作成したり、他の場所に変えたりしましょう。
majordomoのインストール
まずはじめに、wrapperをコンパイルします。
コマンドラインから、以下のように打ち込んでください。wrapperがコンパイルされます。

hoge# make wrapper

次に、majordomoをコンパイルしてインストールします。
インストール先は、先ほど指定したディレクトリにインストールされますが、ここでは/var/ML/majordomoと言うディレクトリなんか存在しないので、/var/MLと言うディレクトリだけ先に作成しておきます。
そして、以下のようにしてインストールします。

hoge# mkdir /var/ML

hoge# make install; make install-wrapper

エラーがなければ、ディレクトリを移動して、テストを行ってくださいと、英語で言ってくるので、指示に従って、ディレクトリを移動して、以下のようにテストします。

hoge# cd /var/ML/majordomo
hoge# ./wrapper config-test

問題なければ、Enjoy!と言うメッセージが出ます。無事にインストール完了です。
最後に何やらyesかnoか迫られますが、どちらでも良いでしょう。(^^;;
また、エラーがある場合は、エラーの原因となっている箇所が指摘されますので、Makefileやmajordomo.cfの設定を見直して、再コンパイルをします。
その時、rm -r /var/ML/majordomoと打ち込んで、インストールされたmajordomoを消しておくことと、/usr/tmp/majordomo-1.94.5のディレクトリの中でmake cleanと打ち込んで、クリアーしておく必要があるようです。

aliasesの編集
次に/etc/aliasesのファイルを、エデイタで編集します。
majordomo:		"| /var/ML/majordomo/wrapper majordomo"
owner-majordomo:	hogehoge
majordomo-owner:	hogehoge
hogehogeは、majordomoの管理者でもwebmasterでも何でも良いと思います。freemanがmajordomo全体の管理者である場合は、freemanと書いておきます。

メーリングリストの作成

いよいよメーリングリストの作成です。
メーリングリストのファイルは、/var/ML/majordomo/lists以下に作成されます。例えば、hogehogeと言うメーリングリストを作成した場合は、/var/ML/majordomo/listsの中にhogehogeと言うファイルが作成されて、そのファイルの中に参加者のメールアドレスが格納されます。要はメーリングリストに参加させるか退会させるかは、このファイルを直接編集編集すればOKと言うことになります。

では、まず始めにtestと言うメーリングリストを作成したいと思います。
以下のように、/var/ML/majordomo/listsの中にtestと言うファイルを作成します。

hoge# touch /var/ML/majordomo/lists/test

次に、testのファイルに合わせるように、/etc/aliasesのファイルをエデイタで編集します。
test:		"| /var/ML/majordomo/wrapper majordomo/wrapper resend -l test -r test@hoge.foo.jp -h hoge.foo.jp test-outgoing"
test:-outgoing:	:include:/var/ML/majordomo/lists/test
owner-test:	hogehoge
test-owner:	hogehoge
test-request:		"| /var/ML/majordomo/wrapper majordomo/wrapper majordomo -l test"
一行目のオプション
-l メーリングリストネーム
メーリングリスト名を指定します。必須です。
-h ホストネーム
majordomoが動作しているホスト名を指定します。
Reply-to メーリングリストアドレス
Reply-toの設定です。メーリングリストにメールが送られてきて、メーラーで返信をしたときに、このアドレスが適用されます。fromのアドレスははじかれます。
2行目
2行目のresend コマンドで処理されたメールを送る、メーリングリストのメーリングリストファイル名を設定します。
3、4行目
メーリングリストの管理者を記入します。メーリングリストで、エラーがあった場合には、そのメールアドレスに、エラーメールが送信されます。(この場合hogehoge@hoge.foo.jpに送信されます。)
5行目
ユーザがメーリングリストの案内文を要求する時にこのメールアドレス宛てに送ると、request-answer を実行して案内文を送る設定です。
以上で、一応、設定は終了です。

メーラーからmajordomo@hoge.foo.jp宛てに、subscribe testと言う内容だけを(題名不要)送ってみてください。
majordomoが何か言ってくるはずです。
auth 8f71b4a0 subscribe test xxx@hoge.foo.jpの内容だけをmajordomo@hoge.foo.jp宛てに送り返してくれたら、メーリングリストに入会させてあげるよ!等と英語で言ってきます。
majordomo@hoge.foo.jp宛てにauth 8f71b4a0 subscribe test xxx@hoge.foo.jpを送り返してあげましょう。
普通でしたら、これで手続き完了なのですが、エラーメールが帰ってきますね。(^^;;
旨く入会出来たとしても、まだやらなければならない重要な設定が残っているからです。
先ほど、majordomoはユーザー、グループ共に54の権限で動作させるように設定しましたので、それがきちんと設定されるように、設定をしなければいけません。
この場合エラーを内容を見てみますと、パーミッションエラーとか出ていますから、パーミッションを甘く設定してやれば、メーリングリストに登録できますが、パーミッションが甘いとsendmailが信用してくれない様で、メールをリレー(中継)してくれません。(^^;
なので、/etc/groupとvipwで以下のように設定をします。
まず、/etc/groupをエデイタで開いて、以下の行を追加します。
majordom:*:54: majordom
majordomと言うグループを54と言うグループと同じ扱いにします。
majordom=54と言うことです。
majordomoではなくてmajordomです。(^^;

次にvipwとコマンドを打ち込んで、以下の行を追加します。
viエデイタでの操作になりますから、慣れていない人は注意してください。
majordom:*:54:54::0:0:majordomo:/var/ML/majordomo:/bin/sh

viエデイタ操作方法
k↑(カーソルを上に移動)
j↓(カーソルを下に移動)
h←(カーソルを左に移動)
l(小文字のL)→(カーソルを右に移動)
iカーソルの位置の前に文字を進入(入力モードへ)
aカーソルの後に文字を進入(入力モードへ)
ESCキー入力モードからコマンドモードへ
xカーソルの位置の1文字を削除
ddカーソルの位置の行の削除
ZZファイルに保存をして終了
:q! Enterキー保存をせずに強制終了

それで、/var/ML/majordomoにディレクトリを移動してls -lと打ち込んで、各ファイルやディレクトリを一覧表示させて、パーミッションやオーナー権限を見てみます。

hoge# cd /var/ML/majordomo
hoge# ls -l

オーナー権限がmajordomもしくは54でないファイルやディレクトリは、片っ端からmajordomもしくは54に変えていきましょう。
そして、/var/ML/majordomoのパーミッションと/var/ML/majordomo/listsのパーミッションと/var/ML/majordomo/lists/testのパーミッションは以下のようにします。

hoge# chown 54 /var/ML/majordomo
hoge# chown 54 /var/ML/majordomo/lists
hoge# chmod 751 /var/ML/majordomo
hoge# chmod 751 /var/ML/majordomo/lists
hoge# chmod 666 /var/ML/majordomo/lists/test
hoge# chown 54 /var/ML/majordomo/lists/test
hoge# chgrp 54 /var/ML/majordomo/lists/test
以上でメーリングリストの入退会や、メールの配信が旨く出来るようになったと思います。

info、intro、passwdファイルの作成
次に、メーリングリストに入会したときに、メーリングリストから自動的に送られてくるメッセージの作成をしたいと思います。
既に、自動的に作成されていますが、英語なので日本語でメッセージを作成します。
まず、/var/ML/majordomo/listsのディレクトリの中に、test.infoとtest.introとtest.passwdのファイルを作成して、エデイタで編集します。

touch /var/ML/majordomo/lists/test.info
touch /var/ML/majordomo/lists/test.intro
touch /var/ML/majordomo/lists/test.passwd
hoge# chown 54 /var/ML/majordomo/lists/test.info
hoge# chown 54 /var/ML/majordomo/lists/test.intro
hoge# chown 54 /var/ML/majordomo/lists/test.passwd
hoge# chgrp 54 /var/ML/majordomo/lists/test.info
hoge# chgrp 54 /var/ML/majordomo/lists/test.intro
hoge# chgrp 54 /var/ML/majordomo/lists/test.passwd
hoge# chmod 666 /var/ML/majordomo/lists/test.info
hoge# chmod 666 /var/ML/majordomo/lists/test.intro
hoge# chmod 660 /var/ML/majordomo/lists/test.passwd
test.introは、メッセージの先頭に表示され、test.infoはメッセージ中程に表示されます。


そして、エデイタで各ファイルを開いて、メッセージを書いておきます。
メールからもパスワードを送ることによって、編集することが出来ますので、ここでは適当に書いて置いて、後でメールから編集をした方が楽です。(^^;
test.passwdの中にはパスワードを書いて置いてください。後で、メッセージの変更等をするときに、必要になります。

メールからコマンドを送信して、これらの操作を行う方法はmajordomoのコマンドを参考にしてください。

連番の追加

メーリングリストでメールを送信しますと、メール番号が題名に追加されますが、その設定をします。
/var/ML/majordomo/Toolのディレクトリの中にsequencerと言うファイルがありますので、これを/var/ML/majordomoにコピーして、使用します。
sequencerの中の/usr/lib/sendmailとなっているところを、全て/usr/sbin/sendmailに書き換えてください。

hoge# cp /var/ML/majordomo/Tool/sequencer /var/ML/majordomo/

/etc/aliasesを以下のように書き換えます。
test:	"| /var/ML/majordomo/wrapper majordomo/wrapper sequencer -l test -n -r test@hoge.foo.jp -h hoge.foo.jp test-outgoing"
resendをsequencerに差し替えて、-hオプションを追加します。

次に/var/ML/majordomo/lists/test.configをエデイターで開いて、以下のようにします。
administrivia  =  no
subject_prefix = [test $SEQNUM]

次にtest.seqと言うファイルを/var/ML/majordomo/lists/に作成して、数字の1を書いておきます。

hoge# cd /var/ML/majordomo/lists
hoge# mkdir test.seq
hoge# chown 54 test.seq
hoge# chgrp 54 test.seq
hoge# chmod 666 test.seq

以上で設定終了ですが、連番が重なって見ずらくなることもありますので、sequencerを少し改造します。
エデイタで開いて、130あたりの以下の部分を書き換えてください。
      &abort("sequencer: Can't open /tmp/sequencer.$$.in: $!");
  while (<STDIN>) {
      print IN $_;
  }


			↓↓↓



      &abort("sequencer: Can't open /tmp/sequencer.$$.in: $!");
  while (<STDIN>) {
      if (/^Subject:/) {
                s/R[eE]\:.*[\(\[]$opt_l.*\d+[\)\]]/Re\:/;
                s/R[eE]\:\s+R[eE]\:/Re\:/g;
      }
      print IN $_;
  }

まだ題名なしのメールを送信した際に、連番が落ちてしまう不具合が残っていますので、以下の行を以下のように編集します。
                                        $foo = $foo . " ";
                                }
                        }
!                       $subject = $foo . "Message for " . $opt_l;
                        print OUT $subject, "\n";
                }



					↓↓↓


                                        $foo = $foo . " ";
                                }
                        }
!                       $subject = "Subject: " . $foo . "Message for " . $opt_l;
                        print OUT $subject, "\n";
                }
以上で、連番の設定は終了です。
旨く動作しない方は、関連ファイル、ディレクトリのパーミッションやオーナー権限やグループの権限を見直したりしましょう。

メールのアーカイブ化

ついでにメールのアーカイブ化の設定もしておきます。メールデーターがアーカイブ化されて、サーバーの中に保存されます。Webページから過去メールを観覧するときに、便利ではないでしょうか。
以下のようにして、アーカイブ用のディレクトリを作成します。

hoge# mkdir /var/ML/majordomo/lists/test.archive 
hoge# chmod 755 //var/ML/majordomo/lists/test.archive 
hoge# chown majordom /var/ML/majordomo/lists/test.archive 
hoge# chgrp majordom /var/ML/majordomo/lists/test.archive 

そして、/etc/aliasesを以下のように変更します。
test:	"| /var/ML/majordomo/wrapper majordomo/wrapper sequencer -l test -N -r test@hoge.foo.jp -h hoge.foo.jp test-outgoing"
-n → -Nに代えるだけです。

WEBページからの登録/削除

WEBページから、メーリングリストへ登録/削除する場合は、majordomoに同封されているツール、md-sub.cgiを使用します。
Perlで簡単に作れそうですから、CGI等を作成されている方は、自分で作ってみるのも良いと思います。
md-sub.cgiは、他にcgi-lib.plとgetopts.plのPerlのライブラリを使用します。
md-sub.cgiとcgi-lib.plは、majordomoが展開されたディレクトリ(インストール先ではない)にmd-subというディレクトリが出来るので、そこから持ってきます。また、getopts.plはおそらくperl5を展開したディレクトリに置いてあると思いますので、そこから持ってきます。
ここでは、Apacheで指定してあるドキュメントディレクトリ/usr/local/www/(http://hoge.foo.jp/でアクセスされる場所)の中のcgi-binのディレクトリ中に、MLというディレクトリを作成して、そこにmd-sub.cgi等のツールを持ってきて、利用できるようにしてみたいと思います。

hoge# mkdir /usr/local/www/cgi-bin/ML
hoge# cp /usr/tmp/majordomo-1.94.5/md-sub/md-sub.cgi /usr/local/www/cgi-bin/ML/
hoge# cp /usr/tmp/majordomo-1.94.5/md-sub/cgi-lib.pl /usr/local/www/cgi-bin/ML/
hoge# cp /usr/local/lib/perl5/5.00503/getopts.pl /usr/local/www/cgi-bin/ML/
hoge# chown 54 /usr/local/www/cgi-bin/ML
hoge# chgrp 54 /usr/local/www/cgi-bin/ML
hoge# cd /usr/local/www/cgi-bin/ML
hoge# chown 54 md-sub.cgi
hoge# chown 54 cgi-lib.pl
hoge# chown 54 getopts.pl
hoge# chgrp 54 md-sub.cgi
hoge# chgrp 54 cgi-lib.pl
hoge# chgrp 54 getopts.pl
hoge# chmod 755 md-sub.cgi
hoge# chmod 644 cgi-lib.pl
hoge# chmod 644 getopts.pl

次に、md-sub.cgiをエデイタで開いて、以下の箇所を自分の環境に合わせて編集をします。
# $cgiloc   = "http://stout/~jco/md-sub.cgi";
# $listsdb  = "/usr/jco/.md-subrc";
# $logfile  = "/usr/jco/md-sub.log";
# $sendmail = "|/usr/bin/cat - > /tmp/test.out"; # This one is for
                                #  testing...


			↓↓↓


$cgiloc   = "http://hoge.foo.jp/cgi-bin/ML/md-sub.cgi";
$listsdb  = "/var/ML/majordomo/md-sub/.md-subrc";
$logfile  = "/var/ML/majordomo/md-sub/md-sub.log";
$sendmail = "|/usr/sbin/sendmail -t";

次に、majordomoのホーム(/var/ML/majordomo)に、md-subのディレクトリを作成して展開元のmd-subのディレクトリからml-init.sampleを持ってきて、.md-subrcという名前でコピーしておきます。

hoge# mkdir /var/ML/majordomo/md-sub
hoge# chown 54 /var/ML/majordomo/md-sub
hoge# chgrp 54 /var/ML/majordomo/md-sub
hoge# cp /usr/tmp/majordomo-1.94.5/md-sub/ml-init.sample /var/ML/majordomo/md-sub/
hoge# cd /var/ML/majordomo/md-sub
hoge# cp ml-init.sample .md-subrc
hoge# chown 54 .md-subrc
hoge# chgrp 54 .md-subrc

そして、.md-subrcをエデイタで開いて、以下のように編集します。
test              majordomo@hoge.foo.jp
info    test      http://hoge.foo.jp/test/index.html
help                hogehoge@hoge.foo.jp
default             test

次に、sub-cgiがインストールしてあるディレクトリに移動して、データベースを作成します。

hoge# cd /usr/local/www/cgi-bin/ML
hoge# md-sub.cgi -C /var/ML/majordomo/md-sub/.md-subrc
以上で終了です。
Apacheでドキュメントディレクトリの設定が、/usr/local/www/に設定されてますと、http://hoge.foo.jp/cgi-bin/ML/md-sub.cgiにブラウザでアクセスして、WEBページが開くはずです。
MAJORDOMO1.GIF - 7,583BYTES
英語で、表示されます。(^^;;
日本語が表示できるように改造していいのかな?
簡単に改造出来るのですが・・・。

majordomoの日本語化

Nob's HomeのWEBページを参考にしてmajordomoを日本語化してみました。
まず、上記のサイトからmajordomo-1.94.5-jp.patch.gzを手に入れてきてください。
そしたらmajordomoと同じディレクトリに置きます。
上記のサイトのmajordomo-1.94.5-jp.patch.gzは、テキストファイルのようなので、以下のようにしてパッチをあてます。
パッチをあてたら、変わってしまったオナー権限などをmajordomに戻します。

hoge# cat majordomo-1.94.5-jp.patch.gz | patch
			.
			.
			.
hoge# chown 54 majordomo
			.
			.
			.

次に、majordomoと同じディレクトリに、jsendmailというファイルを作成します。
このファイルは、shellスクリプトになるので、以下の内容を書いておきます。
	#! /bin/sh
	/usr/local/bin/nkf -j | /usr/sbin/sendmail $*
jsendmailのパーミッションは、755にしておいてください。

そして、majordomo.cfをエデイタで開いて、以下の箇所を書き直します。
$sendmail_command = "/usr/sbin/sendmail"; 


			↓↓↓


$sendmail_command = "/var/ML/majordomo/jsendmail";

以上で、システムを再起動させたりしますと、完了です。
BACK