メーリングリストサーバー(Majorodomo)と検索(namazu)

1.はじめに

majordomoは古くから有るメーリングリストで、しかも元は英語ですのであまりお薦めできませんが
freeBSDのMLでは多く利用されているので使って見ました。

2.インストール

majordomoはportsからインストールします
# cd /usr/ports/mail/majordomo
# make install clean

3.Majorodomoの日本語化

まずここにある日本語化patchを当てます
$ su
# cd /usr/local/majordomo
# zcat majordomo-1.94.5-jp.patch.gz | patch
# chown majordom:majordom majordomo

jsendmailというshell scriptを作ります
/usr/local/majorodomo/jsendmail
#!/bin/sh
/usr/local/bin/nkf -j | /usr/sbin/sendmail $*
パーミッションを変更します
# chmod 755 jsendmail
# chown majordom:majordom jsendmail

nkfが必要なのでインストールします
# cd /usr/ports/japanese/nkf
# make install clean

majordomo.cfの$sendmail_commandを書き換えます
/usr/local/majordomo/majordomo.cf
$sendmail_command = "/usr/sbin/sendmail";を
$sendmail_command = "/usr/local/majordomo/jsendmail"; とします

これでHELPや送られて来るメールが日本語化されます。

4.基本設定

sendmail9.12以降ではローカルから送信するメールの動作はrootでは無くなりましたので
このままでは動きませんでした。
# cd /usr/local/majordomo
# chown majordom:mailnull wrapper
と動かすwrapperの実行権限をmailnullユーザーにも与えるようにしました。
ちょっとやり方が強引なので、もっといい方法が有りましたらお教え下さい。

また、転送になるのでsendmailで権限を与えておきます。
/etc/mail/sendmail.cf
# Trootなどが有る部分に追加
Tmajordom

majordomoの初期設定はwebminからやってしまいましょう!

5.メーリングリスト作成

一番簡単な方法はWebminからリストを作成してしまう方法です。
「サーバー」−「Majordomoリストマネージャー」にあります。
デフォルト設定もそこで出来ますので省略します。
但し、注意が必要なのはここで入力するwelcomeメッセージやヘッダー・フッターなどは
日本語を入れると、webminはEUCで動いているので設定ファイルもEUCで書かれてしまいます。
メールはJISが基本の為、メッセージ本体と文字コードが合わなくなる為ここでは入力しないでおきましょう
また、メーリングリストの場合通常返信する場合はメーリングリストに返信となるので
「reply_to」にはメーリングリストのアドレスを入れておきましょう。

Webminからでは操作できないあるいはしないほうがいい部分のみ解説します。
メーリングリスト名は「sample-ml」とします

/usr/local/majordomo/lists/sample-ml.config
sender = owner-sample-ml@server.hogehoge.org
このsenderだけはwebminからだとドメイン名が入れられません。
入れないとローカルドメインで表記され、受け側のメールサーバーに叱られますのでご注意下さい。

あとなぜか私の環境だけなのか...Webminからメーリングリストを作成すると一部ファイルのパーミッションで
majordomoに怒られてメーリングリストが動きませんでした。
# cd /usr/local/majordomo/lists
# chmod 644 sample-ml
と、直して動きました。

なお、ヘッダーフッターなどはそのML設定ファイル場に記入します。
/usr/local/majordomo/lists/sample-ml.config (JISで記入の事)
message_footer << END
# 再送信された E メールのフッタ
END
message_fronter << END
# 再送信された E メールの特別の SMTP ヘッダ
END
message_headers << END
# 再送信された E メールのヘッダ
END

またinfoで要求される返信メールは
/usr/local/majordomo/lists/samole-ml.info
にJISで記入します。
私は入会時のメールもこれにしています。分ける場合は
/usr/local/majordomo/lists/samole-ml.intro
にJISで記入します。

listでメーリングリスト名を表示させたくない場合(秘密ML)は
/usr/local/majordomo/lists/sample-ml.config
noadvertise << END
/.*/
END
とやれば表示しなくなります。

6.カウンターをつける

majordomo付属のsequencerを使用して、subjectに連番が付くようにしましょう
sequencerをmajordomoにコピーします
# cp /usr/local/majordomo/Tools/sequencer /usr/local/majordomo/
# chown majordom:majordom /usr/local/majordomo/sequencer

カウンターの数字を保存するファイルを作成
/usr/local/majorodomo/lists/sample-ml.seq
00001
権限を直しておきます
# chown majordom:majordom /usr/local/majordomo/lists/sample-ml.seq
# chmod 644 /usr/local/majordomo/lists/sample-ml.seq

aliasesのresendをsequencerに変更し、次のように変更します
/etc/aliases
sample-ml: "|/usr/local/majordomo/wrapper sequencer -l sample-ml -n -h hogehoge.org sample-ml-list"

反映させます
# newaliases

sample-ml.configのsubject_prefixの行を以下のように修正します。
また、administrivia = no に変更します。
/usr/local/majorodomo/lists/sample-ml.config
administrivia = no
subject_prefix = [sample-ml:$SEQNUM]

これで、subjectに[sample-ml:nnnnn]と、連番が付くはずです。
ただし、このままではreplyするたびにsubjectが長くなってしまい、みっともないので、sequencerを書き換えます。
sequencerの153行目付近の部分を下記のように変更します
    &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 $_;
  }
というふうに書き換えて下さい。

7.Outlook対策

MS Outlook や Outlook Expressで ML から配信されたメールに対して返信すると、Subject にRe: や [********]が重なってしまいます。これはMSのメーラーが、半角までまとめてMIMEエンコードをしてしまうためなのですが、これを回避する方法を提示します。
Beckyなどでも半角と全角がつながっていると同じ症状になります。

mimer.pl と、mimew.pl を ダウンロードして、/usr/local/majordomo/ にコピーし、属性を変更します。
# cp /tmp/mimer.pl /usr/local/majordomo/
# cp /tmp/mimew.pl /usr/local/majordomo/
# cd /usr/local/majordomo/
# chown majordom:majordom mimer.pl mimew.pl
# chgrp majordom:majordom mimer.pl mimew.pl
# chmod 755 mimer.pl mimew.pl

さらに、sequencerの require文が書いてあるところ(66行目あたり)に、次の2行を追加します。
require "mimer.pl";
require "mimew.pl";

そして、sequencerの一部(153行目あたり)を書き換えます
while () {
        # by nob
        if (/^Subject:/) {
                $_= &mimedecode($_);
                $_= &mimeencode($_);
                s/R[eE]\:.*[\(\[]$opt_l.*\d+[\)\]]/Re\:/;
                s/R[eE]\:\s+R[eE]\:/Re\:/g;

        }
    print IN $_;
}
これでMSメーラーにおけるトラブルがなくなります

8.空のsubject対応

他の方のページでは以下のようにするよう書かれています。
/usr/local/majordomo/sequencer
# 200行あたりに2行目があるので3行目に変更する
# $subject = $foo . "Message for " . $opt_l;
$subject = "Subject: " . $foo . "(No Subject in original)";
しかし、これは連番をつけた場合などはこのルーチンに行かないので通常は使い物になりません。
ここで私が考案した方法は項目6と7で解説した部分に手を加えます
/usr/local/majordomo/sequencer
while (<STDIN>) {
      if (/^Subject:/) {
        $_= &mimedecode($_);
        $_= &mimeencode($_);
        s/R[eE]\:.*[\(\[]$opt_l\:.*\d+[\)\]]/Re\:/;
        s/R[eE]\:\s+R[eE]\:/Re\:/g;
        # 以下の1行を追加
        s/^Subject\:\s\n/Subject\: (No Subject in original)\n/;
      }
      print IN $_;
}

9.subject行以下を認識させる

これも他人のHPに書かれていましたので
/usr/local/majordomo/sequencer
# 280行あたり
        $subject = $_;
        $subject =~ s/^subject:\s*(.*)/$1/i;
        $subject = &chop_nl($foo . " " . $subject);
        local($foo_pat) = $foo;
        $foo_pat =~ s/(\W)/\\$1/g;
        s/^subject:\s*/Subject: $foo /i if !/$foo_pat/;
        $subject_last = 1 ; #←追加
    }
#ここから下を追加
    elsif (defined($subject_last) ){
        if ( /^\s+(.+)/ ){
            $subject .= " $1";
        }
        else{
            undef($subject_last);
        }
    }
# ここまで
    if ( /^from:\s*(.+)/i )
    {
        $from = $1;
        $from_last = 1;

と、ここまで書いておいて編集も面倒でしょうし私のsequencerをここに置いておきます

10.アーカイブ

メーリングリストの記事を保存しておきバックナンバーとして取り寄せることができます。
アーカイブを保存するにはaliasesを修正します。
/etc/aliases
sample-ml: "|/usr/local/majordomo/wrapper sequencer -l pc-unix -N -h server.hogehoge.org sample-ml-list"
要するにnが大文字にしただけです。
newaliasesするのを忘れないように!

そしてこのままではindexでタイトルを取り寄せた時、表示がうまくいかないので以下のように修正を加えます。
/usr/local/majordomo/majordomo.cf
#下の行を3行目のように修正します
#$index_command = "/bin/ls -lRL";
$index_command = "sed -e 's/.* [[]/[/g' INDEX|/usr/local/bin/nkf -l -m";
これでindex取り寄せ、記事もgetすることができます。

11.メーリングリスト記事をhtml化

html化ではNob’sさんのmlist2htmlとMHonArcを使用しました。
ja-mhonarcは無くなってしまったのでMHonArcを入れて日本語化にトライして見ます
まずはportsでインストール
# cd /usr/ports/www/mhonarc
# make install clean
mlist2htmlは
/usr/local/bin
にコピーして実行権限を与えておいてください。

そしてメーリングリストごとにMHonArcで使用する設定ファイルを作ります。
/usr/local/share/MHonArc/sample-ml.rc
<DECODEHEADS>
<NOMAILTO>
<TEXTCLIPFUNC>
iso_2022_jp::clip; iso2022jp.pl
</TEXTCLIPFUNC>
<VARREGEX>
\$([^\033\$]*)\$(?![^\033]*\033\()
</VARREGEX>
<MIMEARGS>
text/plain:default=iso-2022-jp
</MIMEARGS>
<CHARSETCONVERTERS>
plain; iso_2022_jp::str2html; iso2022jp.pl
iso-2022-jp; iso_2022_jp::str2html; iso2022jp.pl
</CHARSETCONVERTERS>
<DEFCHARSET>
iso-2022-jp
</DEFCHARSET>
<SUBSORT>
<TIMEZONES>
JST:9
</TIMEZONES>
<EXCS>
reply-to
in-reply-to
sender
</EXCS>
<IDXFNAME>
index.html
</IDXFNAME>
<TITLE>
sample-ml ML
</TITLE>
<IdxPgBegin>
<HTML>
<HEAD>
<TITLE>$IDXTITLE$</TITLE>
</HEAD>
<BODY BGCOLOR="#e6e6fa">
<H2>$IDXTITLE$</H2>
</IdxPgBegin>
<ListBegin>
<A HREF="../index.html">Main Index</A> |
<A HREF="$TIDXFNAME$">Thread Index</A> ]
<BR CLEAR=LEFT>
<HR>
<UL>
</ListBegin>
<LISTEND>
</UL>
<HR>
<A HREF="../index.html">Main Index</A> |
<A HREF="$TIDXFNAME$">Thread Index</A> ]
</LISTEND>
<LiTemplate>
<LI><STRONG>$SUBJECT$</STRONG> <EM>$FROM$</EM>
</LI>
</LiTemplate>

<!-- Thread indexの設定 -->
<TTITLE>
sample-ml(by thread)
</TTITLE>
<TIdxPgBegin>
<HTML>
<HEAD>
<TITLE>$TIDXTITLE$</TITLE>
</HEAD>
<BODY BGCOLOR="#e6e6fa">
<H2>$TIDXTITLE$</H2>
</TIdxPgBegin>
<THead>
<A HREF="../index.html">Main Index</A> |
<A HREF="$IDXFNAME$">Date Index</A> ]
<BR CLEAR=LEFT>
<HR>
<UL>
</THead>
<TFoot>
</UL>
<HR>
<A HREF="../index.html">Main Index</A> |
<A HREF="$IDXFNAME$">Date Index</A> ]
</TFoot>

<!-- 個々のmailの表示 -->
<MsgPgBegin>
<HTML>
<HEAD>
<TITLE>$SUBJECTNA$ </TITLE>
<LINK REV="made" HREF="mailto:$FROMADDR$">
</HEAD>
<BODY BGCOLOR="#e6e6fa">
</MsgPgBegin>
<!-- mailの頭の部分を指定します -->

そして投稿されたメールをたれ流すには
/etc/aliasesに以下を追加
sample-ml2html:"| /usr/local/bin/mlist2html /usr/local/www/htdocs/ml sample-ml"

あとはメーリングリストのメンバーに上記アドレスを追加してあげれば自動でhtmlファイルが生成されます。

dir_name/mlist_name/.header.html
dir_name/mlist_name/.footer.html
があると、index.htmlに取り込まれます。

12.できあがったhtmlを検索できるようにする

ここまで出来上がると、namazuを使って検索できるようにしたいものですね
まずは以下のパッケージをインストールします
# cd /usr/ports/japanese/namazu2
# make install clean
# cd /usr/ports/japanese/p5-nkf
# make install clean
# cd /usr/ports/japanese.kakasi
# make install clean
# cd /usr/ports/japanese/p5-Text-Kakasi
# make install clean

設定ファイルと編集します
まずオリジナルをコピーします
# cd /usr/local/etc/namazu
# cp mknmzrc-sample mknmzrc
# cp namazurc-sample namazurc

編集します
mknmzrc
$ADDRESS = 'www@server.hogehoge.org';
$DIRECTORY_INDEX = "/var/namazu/index";
$NKF = "module_nkf";
$KAKASI = "module_kakasi";
$CHASEN_NOUN = "no";
$WAKATI = $KAKASI;
namazurc
Index /var/namazu/index
#Replace 取り込むディレクトリー 置き換えるhttpアドレス
# 以下は例
Replace /usr/home/hogehogeuser/.public_html/ml/ http://server.hogehoge.org/~hogehogeuser/ml/
Lang ja

編集したらwebの場所へ下記のようにコピーする
/usr/home/hogehogeuser/.public_html/ml/.mknmzrc
/usr/home/hogehogeuser/.public_html/ml/.namazurc

namazuの実行ファイルをwwwディレクトリーにコピーしておきます。
# cp /usr/local/libexec/namazu.cgi /usr/home/hogehogeuser/.public_html/ml/
# chmod 755 /usr/home/hogehogeuser/.public_html/ml/namazu.cgi

環境変数を設定します
setenv LANG ja
setenv LC_ALL ja_JP.EUC
シェルで設定する場合はsetだけで、コマンドラインからはsetenvで設定します。

ここまでできたら、namazuがどのように動くか確認します。
# namazu -C
とやればどのように動くか確認できます。
日本語で出てくればINDEX変換もうまくいきます。

それではINDEXを作成して見ます
# /usr/local/bin/mknmz -O /var/namazu/index /usr/home/hogehogeuser/.public_html/ml

なんとなくそれなりに表示がされれば成功です。
nkfを使用して自動で文字コードは変換されるので、元のファイルは文字コードがJISでも
大丈夫です。S-JISでもEUCでも最終的にはEUCになってINDEXが作られます。
しかし、setenvでjaが設定されないと英語でINDEXが作られる場合がありますので
1度やると上書きしてくれませんので/var/namazu/index以下を削除してもう一度生成して下さい。

HPから検索するにはCGIファイルをコピーします
/usr/local/libexec/namazu.cgi
をCGI実行可能ディレクトリーにコピーして実行権限を与え、ブラウザからアクセスすれば
検索画面になります。

あとはcronで定期的に上記コマンドを実行してINDEXを更新するようにします。
環境変数もあるので私はcshにしました。
/root/mknmzout.sh
#!/bin/csh
setenv LANG ja
setenv LC_ALL ja_JP.EUC
/usr/local/bin/mknmz -O /var/namazu/index /usr/home/hogehogeuser/.public_html/ml

namazuはなかなか文字コードなどで、うまく動きませんでした。
環境変数の設定で「LC_ALL」が分からなく時間がかかってしまいました。
いろいろやっていて動いただけなのでまだ説明に抜けがあるかもしれません。
なにか記入もれやミスが有りましたら指摘して下さい。