目次

前のトピックへ

Mailman 日本語情報へようこそ

次のトピックへ

サイト管理の手引

このページ

GNU Mailman - インストールマニュアル

Author:Barry Warsaw
Date:2011 年 12 月 11 日

Abstract

この文書は GNU Mailman を POSIX システム (例: Unix, MacOSX, GNU/Linux) にインストールする方法を説明するものです. 基本的なインストール手順 だけでなく, あなたが使用するウェブとメールサーバに統合するための ガイドラインを含んでいます [1].

GNU Mailman のウェブサイトは http://www.list.org です.

インストールの必要事項

GNU Mailman は Unix や MacOSX, GNU/Linux といった POSIX に基くシステム のほとんどで稼動します. 現在のところ Windows では動きません. あなたが メールを送信できるメールサーバを必要とし, CGI/1.1 API を備えたウェブ サーバが必要です. ウェブサーバには Apache が, ぴったりです. メールサーバには 例えば, Postfix, Exim, Sendmail, qmail などはどれも使えます.

Mailman をソースからインストールするには, セキュリティ向上のために 用いられている ラップ [2] プログラムを構築するときに, ANSI C コンパイラーが 必要です. GNU C コンパイラ gcc の 2.8.1 以降の バージョンでうまくいきます.

システムには Python インタプリタが どこかにインストールされていなければなりません. Mailman 2.1 には Python 2.1 またはそれよりも新しいものが必要です. Python 2.3 以上を推奨します.

システムセットアップ

Mailman ソフトウェアのインストールの前に, 特定のユーザとグループを 追加登録することでシステムの準備をする必要があります. このため, この節のステップを実行するには root になる必要があります.

グループとユーザの追加

Mailman は, ファイルを所有し, プロセスを走らせるために, 他で使用されていない ユーザとグループの名前を必要とします. Mailman の基本的なセキュリティは グループ所有権の許可(パーミッション)に基いています. 従って, このステップを きちんとしておくことが重要です [3]. 典型的には, mailman という名前のユーザとグループを作成することになります. mailman ユーザは mailman グループのメンバーでなければ なりません. Mailman は mailman ユーザとグループの下に, set-group-id (setgid) ビットを立ててインストールされます.

もし, この名前が既に使われていたなら, 別のユーザとグループ名を選ぶことが できますが, configure を走らせるときに覚えておかないといけません. もし, 別のユーザ名を選んだなら, これを configure--with-username オプションで指定します. また, 別の グループ名を選んだ場合には, configure--with-username オプションで指定してください.

Linux システムでは, 次のコマンドでこれらのアカウントを作成することが できます. ご利用のシステムのマニュアルで詳細を確認してください:

% groupadd mailman
% useradd -c''GNU Mailman'' -s /no/shell -d /no/home -g mailman mailman

インストールディレクトリの作成

通常, Mailman は単一のディレクトリにインストールされ, そこには Mailman ソースコードと, 実行時のデータ(リストと保存書庫)の両方が入ります. 静的なプログラムファイルと変化するデータファイルを分離して, 別のディレクトリ に入れることも可能です. ここではこのことに関するオプションを説明します.

Mailman のデフォルトのインストールディレクトリは /usr/local/mailman [4] このインストールディレクトリ($prefix で参照します) を変更するには configure で --prefix オプションを使います. 以前のバージョンから更新するには, インストールディレクトリを変更す るので無い限り, --prefix を設定する必要があります.

警告

Mailman を nosuid オプションでマウントされたファイルシステムに インストールすることはできません. これがあると Mailman のインストールに 失敗します. というのは, セキュリティ上の理由で setgid プログラムの利用を 前提としているからです. もし, これがあてはまるようでしたら, 単純に, setgid プログラムを許している場所に Maiman をインストールしてください.

インストールのディレクトリが mailman グループに設定されて いることを確認してください (あるいは --with-groupname で指定 しようとしているグループ). そして, setgid ビットがセットされ ていることを確認してください [5] また, このディレクトリが全ての ユーザに読み取りと実行(移動)可能であることを保証したいと思う でしょう. 以下のシェルコマンドでこれらのことが設定できます:

% cd $prefix
% chgrp mailman .
% chmod a+rx,g+ws .

これで, Mailman ソフトウェアを configure しインストールする 準備ができました.

Mailman の構築とインストール

configure を実行

Mailman をインストールする前に configure を実行して, システム で必要になるいろいろなインストールオプションを設定しなければなりません.

ノート

下にある, --with-mail-gid--with-cgi-gid のオプションに特に注意. 多分これが必要になります.

この節に書いてある手順を実行する間は, あなたは root に なるべきではあり ません. 自分自身のログイン名か, 他のソフトを インストールするときに使うアカウントを使ってください. また, mailman ユーザになる必要はありませんが, そうしても構いません. 但し, 前の手順で作成した $prefix ディレクトリの書き込み許可を 得るためには, そのアカウントが mailman グループに所属している 必要があります. ターゲットのインストールディレクトリに書き込み権限があることと, そこに setgid ファイルを作成できることを確認してください. (NFS や他のマウント方式で setgid を禁止している場合があります)

もし, 他の GNU ソフトをインストールしたことがあるなら, configure スクリプトにはおなじみでしょう. Mailman の tarball を開いた ディレクトリに cd して, configure を引数を付けずに実行して ください:

% cd mailman-<version>
% ./configure
% make install

以下のオプションで Mailman のインストールをカスタマイズできます.

--prefix = dir
標準的な GNU configure のオプションで Mailman がインス トールされることになるベースのディレクトリを変更します. デフォルトでは $prefix/usr/local/mailman です. この ディレクトリはその時点で存在していなければならず, インストールディレクトリの作成 で説明したようにセットアップされていなけれ ばなりません.
--exec-prefix = dir
標準的な GNU configure のオプションでアーキテクチャに 依存したバイナリのインストールディレクトリを指定できます.
--with-var-prefix = dir
交換可能なデータを $prefix$exec-prefix の代わりに dir の下に保存します. このようなデータの例としては, リストの保存書庫やリスト設定データベースがあります.
--with-python = /path/to/python
ラッププログラムで使用する Python インタプリタを変更 して指定することができます. デフォルトはシェルの $PATH の中で最初に見つかったものを使います.
--with-username = username-or-uid
mailman でないユーザ名を使う場合に指定する. このオプションの値には整数のユーザID またはユーザ名を使うことができます. $prefix ディレクトリがこのユーザの所有であることを確認してください.
--with-groupname = groupname-or-gid
mailman でないグループ名を使う場合に指定する. このオプションの値には整数のグループID またはグループ名を使うことができます. $prefix ディレクトリがこのグループの所有であることを確認してください.
--with-mail-gid = group-or-groups

メールラップ を介してスクリプトを実行する際のグループを 指定します. group-or-groups は, 1個または複数の整数 のグループID でも, グループの名前であっても可です. リス トの最初の値で実際に存在 するグループの値が使用されます. デフォルトでは, これは mailman other mail daemon のリストになっています.

ノート

これは高度にシステム依存であり, 正しい値を知っておく必 要があります. というのは, グループ ID が メールラップ プロ グラムにコンパイルされてセキュリティを高めるからです. Sendmail を使っているシステムでは, sendmail.cfDefaultUser を使って sendmail プロセスの gid が 設定 されています. (もし, コメントアウトされていたら, それで もデフォルトを示しているかもしれません)

このスイッチの正しい値を知るために, 使用しているメールサーバの 説明や設定ファイルをチェックしてください.

--with-cgi-gid = group-or-groups

CGI ラップ を介してスクリプトを実行する際のグループを 指定します. group-or-groups は, 1個または複数の整数 のグループID でも, グループの名前であっても可です. リス トの最初の値で実際に存在 するグループの値が使用されます. デフォルトでは, これは www www-data nobody の リスト になっています.

ノート

この値は Web サーバの設定に依存します. 正しい値を知っ ておく必要があります. というのは, グループIDがCGI ラップ プログラムにコンパイルされてセキュリティを高めるからで す. これが違っていると Mailman CGI スクリプトは 動きま せん.

もし Apache を使っていれば, httpd.conf に書かれている Group オプション の値をチェックしてください.

--with-cgi-ext = extension
cgi プログラムの拡張子を指定します. $prefix/cgi-bin に 置かれた CGI ラップ はこの拡張子を持ちます. (ウェブサーバ によっては 拡張子が必要です) extension には区切りの . (dot) を入れておくこと.
--with-mailhost = hostname
メールが出て行く時のホスト名(FQDN)を指定します. インストール が完了すれば, この値は $prefix/Mailman/mm_cfg.py で上書き することができます.
--with-urlhost = hostname
ウェブ URL のホスト名 (FQDN) を指定します. インストールが 完了すれば, この値は $prefix/Mailman/mm_cfg.py で上書き することができます.
--with-gcc =no
gcc が見つかっても使いません. cc$PATH に無いとい けません.

Make とインストール

configure を実行したら, make を走らせ, 次に make install とすることで, Mailman を構築しインストールする ことができます.

インストールのチェック

make install を実行した後, 正しいパーミッションとグループ 所有権が設定されていることを check_perms スクリプトで 確かめてください. まずインストールディレクトリ($prefix)に移動します. そして, bin/check_perms プログラムを実行します. ソースディレクトリで bin/check_perms を実行しようとしないでく ださい. インストールディレクトリでのみ実行可能です.

これが問題を報告しなければ, あなたのインストールは正しく設定さ れていた可能性が高い <ウィンク> です. もし, 問題点が報告されたら, 手で修正するか, もう一度インストールをやりなおすか, check_perms を使って(多分, 一番簡単)修正することが出来ます.

  • インストールを行ったユーザ ($prefix のファイルの所有権を持つ ユーザ) になるか, root になります.
  • bin/check_perms -f を実行します.
  • エラーの報告がなくなるまで, 上の手順を繰り返す!

ウェブサーバの設定

おめでとう!Mailman ソフトウェアのインストールが完了しました. しかし, 実際に全てをうまく動かすには, Mailman を ウェブサーバと メールシステムの 両方に接続しないといけません.

もし, メールとウェブサーバを別のマシンで動かして, Mailman を NFS 経由で 共有したいと考えていたら, その2つのマシンの時計が同期 していることを 確かめてください. この手の環境では, Mailman/LockFile.py に定義された CLOCK_SLOP という定数を使って, 時計のずれを補償したファイルロック機構 にすることができます.

この節では Mailman のウェブインタフェースをウェブサーバに接続するために 必要な事柄を説明します. ここでの手順は Apache ウェブサーバに若干偏って いますので, 詳細についてはご利用のウェブサーバの説明書を参照してください.

ウェブサーバの設定で $prefix/cgi-bin に CGI スクリプトの 実行許可を与えてください. 書き加える行は以下のようなものになる はずです. (もちろん, $prefix のところは実際の絶対パスに してください.)

Exec        /mailman/*      $prefix/cgi-bin/*

又は:

ScriptAlias /mailman/       $prefix/cgi-bin/

警告

CGIスクリプトを実行する ユーザIDが mailman グループに入って いない ことをよく確認してください. でないと, 非公開の保存書庫 が誰にでも見られてしまいます.

Mailman, Python, GNU のロゴをWebサーバのアクセス可能なところに コピーしてください. 例えば Apacheの場合, 画像ファイルを入れて おくのに icons ディレクトリが用意されているはずです. 例:

% cp $prefix/icons/*.{jpg,png} /path/to/apache/icons

$prefix/Mailman/mm_cfg.py にロゴのベースディレクトリを書いた 行を追加してください. 例えば:

IMAGE_LOGOS = '/images/'

IMAGE_LOGOS のデフォルト値は /icons/ です. Defaults.py.in に書かれたコメントを読んでください.

Pipermail の公開メーリングリスト保存書庫を参照できるように Web サーバを 設定してください. 例えば Apache の場合:

Alias   /pipermail/     $varprefix/archives/public/

ここで, $varprefix は通常は $prefix と同じで, --with-var-prefix オプションを付けて configure した場合にはその値となります. また, このディレクトリでシンボリックリンクをたどることができるように ウェブサーバを設定してください. でないと, Pipermail の書庫にアク セスできません. Apache のユーザは FollowSymLinks オプションを 調べてください.

また, もし公開保存書庫を国際化したいのであれば, Pipermail ディレクトリのデフォルト文字集合の指示をオフにした方がよいかも しれません. でないと, 多言語の保存書庫は正しく見ることができな いでしょう. Apache の標準のインストールについての設定例は:

<Directory "/usr/local/mailman/archives/public/">
    AddDefaultCharset Off
</Directory>

ここで, ウェブサーバを再起動してください.

メールサーバの設定

この節では Mailman のメールインタフェースをメールサーバに 接続するのに必要な事柄を説明します. ここでの手順はメールサーバによって 異なりますが; もしあなたのメールサーバが次の小節に見当たらない 場合は, ここにある文書から一般化することを試してください. そして, 文書の更新を Mailman 開発者にプレゼントすることも考えてください.

Postfix メールサーバを使う場合

Mailman は標準の Postfix インストールとうまく合うようになっています. Postfix 2.1.5 (を含む) までの各種バージョンで試験済みです.

デフォルトでは, Postfix は -owner-request のアドレスを 特殊扱いします. このようなメールも Mailman に届けてもらうために, 次のように main.cf に追加してこのオプションをオフにします:

owner_request_special = no

Mailman のオプションである VERP 配送をサポートするためには, luser_relay を無効(これが既定値)にしたままで, recipient_delimiter を 設定して 拡張アドレス [6] を有効にします. main.cfluser_relay の値をどれもコメントアウトし, デフォルトのままにします. また, 次のように main.cf ファイルに 追加します.

recipient_delimiter = +

区切り記号として + を使うと Defaults.py にある VERP_FORMATVERP_REGEXP のデフォルト値とうまく合います.

存在しないローカルアドレスにメールを送信しようとすると, Postfix は 450 のエラーコードを返すかもしれません. これは一時的なエラーを表す コードなので, Mailman はデフォルトで DELIVERY_RETRY_PERIOD – 5 日間メールを送信しようとし続けます. 次のように main.cf に 設定することで, 存在しないローカルユーザについて恒久的なエラーコード を返させることができます.

unknown_local_recipient_reject_code = 550

最後に, もし Postfix スタイルの仮想ドメインを使っているなら, 下の仮想ドメインサポートの節を読んでください.

Postfix と Mailman の統合

Postfix と Mailman を統合すると, 新しいリストを作成したり, リストを削除したときに, Postfix のエイリアスデータベースが自動的に 更新されるようになります. これを実現するための手順は以下のとおりです.

以下の説明では, Mailman がデフォルトの位置, つまり /usr/local/mailman にインストールされているものと仮定します. もし, そうでなければ, configure で用いた --prefix--with-var-prefix のオプションに従って読み替えてください.

ノート

もし, 仮想ドメインを使っていて, 仮想ドメインの設定を優先させたいと いう場合には, 仮想ドメイン 節を先に読んでください!

  • $prefix/Mailman/mm_cfg.py ファイルの最後に次のように 追加してください:

    MTA = 'Postfix'
    

    変数 MTA は Mailman/MTA ディレクトリにあるモジュールの 名前を指定します. ここには, リストが作成/削除されるときに 実行される, メールサーバ固有の関数が入っています.

  • Defaults.py ファイルを見て, POSTFIX_ALIAS_CMDPOSTFIX_MAP_CMD コマンド変数の値を確認してください. これらは, それぞれ postaliaspostmap プログラム を指していなければなりません. もし変更が必要の場合は mm_cfg.py の中で行うようにしてください.

  • bin/genaliases スクリプトを実行して aliases ファイルを初期化してください.

    % cd /usr/local/mailman
    % bin/genaliases

    data/aliasesdata/aliases.db の所有者が mailman で, グループ所有者が mailman であることを 確認してください. これらは configure コマンドで設定したユーザ グループです. また, 両方のファイルはグループ書き込み許可が必要 です:

    % su
    % chown mailman:mailman data/aliases*
    % chmod g+w data/aliases*
  • Postfix の main.cf ファイルの alias_maps 変数が 次のパスを含むように書き換えてください:

    /usr/local/mailman/data/aliases

    最後の .db が付いていないことにも注意してください. alias_database にこれを入れてはいけません. なぜなら, Postfix の newaliases コマンドが Mailman の aliases.db ファイルを書き換えてしまうからです. しかし, ローカルアドレスを探索する ときには aliases.db を見てもらいます.

    このエントリについて hash: スタイルのデータベースを作りたい と思うでしょう. これが記入例です:

    alias_maps = hash:/etc/postfix/aliases,
        hash:/usr/local/mailman/data/aliases
  • Mailman を configure するときに, --with-mail-gid=mailman スイッチを使用してください; これは mailman ユーザを追加した 後で Mailman を configure していればデフォルトになります. aliases.db ファイルの所有者が mailman なので, Postfix は Mailman の ラッププログラムを mailman の uid と gid で 実行します.

これで完了! 問題がひとつ: リストを作成したり削除すると, aliases.db は更新されますが, postfix reload を自動的に実行するわけでは ありません. これを実行するには root にならなければなりませんが, root に suid したスクリプトは安全でないからです. Postfix が aliases.db ファイルの変更とテーブルの更新に気が付くのに 1分ほどかかるだけです.

仮想ドメイン

Postfix 2.0 は “仮想エイリアス ドメイン [7]” をサポートします. これは, 以前のバージョンの Postfix では “Postfix スタイルの仮想ドメイン” と呼ばれていたものです. Mailman で動作する仮想エイリアスドメインを作るには, Postfix と Mailman の両方で設定をする必要があります. Mailman は, (既定では) /usr/local/mailman/data/virtual-mailman という名前のファイルにすべての仮想エイリアスのマップを書き込みます. また, Postfix が実際に使う virtual-mailman.db ファイルを作成するために postmap を使います.

まず, Postfix の仮想エイリアス ドメインを Postfix の文書の説明どおりに作ります (Postfix の virtual(5) マニュアルページを参照してください). マニュアルページの説明にある virtual-alias.domain anything の行は, 自分で入れなければいけないことに注意してください. Mailman は virtual-mailman にこの行を入れてくれません. Mailman と統合する前に, この仮想エイリアス ドメインが正しく動作するようにしておくことが, とても大事です.

次に, Postfix と virtual_alias_maps 変数に, virtual-mailman ファイルの位置のパス名を追加します. 例:

virtual_alias_maps = <通常の仮想エイリアスのファイル>,
    hash:/usr/local/mailman/data/virtual-mailman

ここでは, Mailman は既定の場所にインストールしてあると仮定しています. virtual_alias_maps 変数のない古いバージョンの Postfix を使っているのなら, かわりに virtual_maps 変数を使います.

次に, mm_cfg.py ファイルで, POSTFIX_STYLE_VIRTUAL_DOMAINS に, Mailman が更新する仮想ドメインのリストを設定するとよいでしょう. これは, Postfix のほうでサポートする仮想ドメインすべてとは限りません! このリストの要素は, メーリングリスト オブジェクトの host_name 属性と照合されます. 完全一致でなければいけません.

例を挙げます. Postfix は仮想ドメイン dom1.ain, dom2.ain, dom3.ain, を扱うよう設定してあるものとし, さらに, main.cf ファイルに次の設定がしてあるものとします:

myhostname = mail.dom1.ain
mydomain = dom1.ain
mydestination = $myhostname, localhost.$mydomain
virtual_alias_maps =
    hash:/some/path/to/virtual-dom1,
    hash:/some/path/to/virtual-dom2,
    hash:/some/path/to/virtual-dom2

たとえば virtual-dom1 ファイルに, つぎの行があるとします:

dom1.ain  IGNORE
@dom1.ain @mail.dom1.ain

これは Postfix に, dom1.ain 宛てのものはなんでも, mail.dom1.com の同名のメールボックス (既定の配送先) に配送するよう 指示していることになります.

この場合, POSTFIX_STYLE_VIRTUAL_DOMAINS には dom1.ain を含めません. なぜなら そうしなければ, Mailman は dom1.ain ドメインのメーリングリストの項目を

mylist@dom1.ain         mylist
mylist-request@dom1.ain mylist-request
# 等々...

のように書き込むからです.

より特定した項目が, より一般的な項目を上書きするので, dom1.ain メーリングリストへの配送は止められてしまいます.

いっぽう, dom2.aindom3.ainmm_cfg.py に含めます:

POSTFIX_STYLE_VIRTUAL_DOMAINS = ['dom2.ain', 'dom3.ain']

こうして, この二つのドメインのいずれかに属するメーリングリストを Mailman が作ったら, /usr/local/mailman/data/virtual-mailman には正しい項目が入ります.

上の data/aliases* ファイルと同じく, data/virtual-mailmandata/virtual-mailman.db の両方とも, mailman のユーザ, グループに 所有されているようにしたほうがいいでしょう.

他の方法

Fil fil@rezo.net は, virtual マップと正規表現を使った他の方法を紹介しています. 以下に説明があります:

リストにアクセスするときのアドレスのドメインに 余分なホスト部がつくのが気にならなければ, これは良い (そしてよりシンプルな) 代替案です. つまり, mylist@dom.ain のかわりに mylist@lists.dom.ain を使わないといけないのでもよければ, ということです.

Exim メールサーバを使う場合

ノート

本節は, Nigel Metheringham の “HOWTO - Exim で Mailman を使う” [8] から採りました. これは Mailman 2.0.x と Exim 3 に対応していました. それを Mailman 2.1 と Exim 4 に対応するように改訂しました. 元の文書は次の場所にあります: http://www.exim.org/howto/mailman.html.

Mailman のインストールについて説明した箇所の標準的なオプション以外には, Mailman の設定は必要ありません. Exim の設定は Mailman に対して透過的です. Mailman のユーザとグループの設定は, 以下に述べる設定のものと一致していなければいけません.

Exim の設定

Exim の設定では, Mailman 側で作成したリストは自動的に Exim 側で有効になります. 新たにエイリアスを定義する必要はありません.

ここで説明する設定方法の欠点は, 複数の異なるメールドメインのリストに対応したシステムでは, 満足に動作しないことです. Mailman は, 仮想ドメインを扱えるものの, ひとつの Mailman のインストレーションで異なる仮想ドメインが同じ名前のリストを別々に持つことには, まだ対応していません. そのうち変わるでしょう (なお, 後で述べるように, 仮想ドメインをもっとうまく扱う方法もあります).

以下で説明する設定は, 抜粋です. Exim が使えるような設定になっており, リストが属するドメインへのメールを受け付けるようになっていれば, 使えます. このドメインが Exim の設定で扱う他のドメインと分離されているときは, 次のようにする必要があります:

  • リストのドメイン “my.list.domain” を local_domains に追加する
  • “domains=my.list.domain” オプションを, リストへのダイレクタ (ルータ) に追加する [9]
  • (必要なら) 他のダイレクタ (ルータ) からそのドメインを除外する

ノート

この文書での説明は, Exim 3 と Exim 4 のどちらでも動作するようになっています. Exim 3 では, local_domains の設定がなければいけません — Exim 4 では, たいていは local_domains ドメインリストのようなものがあります. ないのなら, どこをどう調整すればうまくいくかは自分でわかっていることと思います. また, Exim 4 では “ダイレクタ” の概念がなくなってしまいました – ルータしかありません. ですから Exim 4 を使っているのなら, この文書で “ダイレクタ” と言ったときは “ルータ” と読みかえてください.

Exim 3 と Exim 4 のいずれを使っていても, Exim 設定ファイルの 首節 [#]_に若干のマクロを追加する必要があります. また, 新たにトランスポートを定義する必要があります. Exim 3 では, 新たにダイレクタを追加する必要があります — Exim 4 では, 新たにルータを追加して同じことをさせます.

なお, ここで提供する設定では, Mailman 2.0 と 2.1 のインストレーションを共存させることもできます. ただしその場合は, mailman のかわりに mm21 を使うとよいかもしれません – 例えば, MM21_HOME, mm21_transport などです.

全般的な設定

まず, Exim 設定ファイルの最初でいくつかマクロを追加する必要があります. これによって, 以下で作成するダイレクタ (ルータ) とトランスポートが少し見やすくなります. 当然, Mailman をどう設定しインストールしたかによって, 変更する必要があります.

# インストールした Mailman のホームディレクトリ -- つまり Mailman のプリフィクス
# ディレクトリ
MAILMAN_HOME=/usr/local/mailman
MAILMAN_WRAP=MAILMAN_HOME/mail/mailman

# Mailman のユーザとグループ. Mailman の configure スクリプトに与えた
# --with-mail-gid スイッチと一致しなければいけない.
MAILMAN_USER=mailman
MAILMAN_GROUP=mailman

Exim 3 のトランスポート

次のものを, Exim 設定ファイルの transports 節 – つまり, 最初と2番めの “end” 行の間のどこか – に入れます:

mailman_transport:
  driver = pipe
  command = MAILMAN_WRAP \
            '${if def:local_part_suffix \
                  {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
                  {post}}' \
            $local_part
  current_directory = MAILMAN_HOME
  home_directory = MAILMAN_HOME
  user = MAILMAN_USER
  group = MAILMAN_GROUP

Exim 3 のダイレクタ

Exim 3 を使っているのなら, 設定ファイルに以下のダイレクタを追加する必要があります (ダイレクタは, 2つめと3つめの “end” 行の間にきます). また, 順序が問題になることを忘れないでください – 例えば, このダイレクタをエイリアスファイルのダイレクタよりも前に置けば, Mailman のリストをシステムエイリアスより優先させることができます. 逆も言えます.

# リスト 'foo' (投稿アドレス) に関するアドレスすべてを扱う.
# MAILMAN_HOME 下の lists/$local_part/config.pck を探して,
# 自動的にリストの存在を検知する.
mailman_director:
  driver = smartuser
  require_files = MAILMAN_HOME/lists/$local_part/config.pck
  suffix_optional
  suffix = -bounces : -bounces+* : \
           -confirm+* : -join : -leave : \
           -owner : -request : -admin
  transport = mailman_transport

Exim 4 のルータ

Exim 4 では, ダイレクタのようなものはありません – かわりに, 新しくルータを追加する必要があります. なお Exim 4 では, 設定ファイル内の標準的な順序はルータがトランスポートの前にくるように変更されたため, まずルータについて述べます. 以下のルータを, 設定ファイルの “begin routers” の行の後のどこかに入れます. ルータの順序が問題になることを忘れないでください.

mailman_router:
  driver = accept
  require_files = MAILMAN_HOME/lists/$local_part/config.pck
  local_part_suffix_optional
  local_part_suffix = -bounces : -bounces+* : \
                      -confirm+* : -join : -leave : \
                      -owner : -request : -admin
  transport = mailman_transport

Exim 4 のトランスポート

Exim 4 でのトランスポートは Exim 3 のものと同じです (Exim 3 のトランスポート を見てください) — 先に示したトランスポートを, Exim 設定ファイルの “begin transports” 行の後のどこかにコピーします.

その他の注意点

Exim は, 充分な量の処理ができるように設定しておかないといけません — 例えば, max_recipients をやたらと小さな値にしてはいけません — また, 充分なセキュリティ強度に設定しなければいけません — 特に, 127.0.0.1 からの中継は許可し, ほかからはほとんど許可しないように気をつけてください [10]. 並列配送のようなちょっとした技巧を使ってみたければ, やってみましょう — 設定を少しずつ変えてみて, うまくいくか確かめます. 配送遅延の警告メッセージは, 出さないようにするか, リスト以外のメールでのみ出すように設定しなければいけません. どこかでホストが落ちるたびに大量のメールを受け取るのは嫌でしょうから.

問題点

  • Mailman は, 必要に応じてできるだけ多くの MAIL FROM/RCPT TO を送ろうとします. 結果として, 一回の接続で 10 件, 100 件, あるいはそれ以上のメッセージが送られることもあり, Exim の smtp_accept_queue_per_connection の既定の値を超えてしまうかもしれません. これは困ったことです. なぜなら, こうなると Exim は queue モードに切り替わり, リストのメッセージの配送が恐ろしく遅れることになるからです. これを直すには, Mailman の SMTP_MAX_SESSIONS_PER_CONNECTION を ($prefix/Mailman/mm_cfg.py で) Exim の smtp_accept_queue_per_connection より小さい値に設定します.
  • Exim はリストのメッセージに遅延警告メッセージを送ってはいけません. が, Mailman も Exim の遅延警告メッセージを無視しなければいけません. Mailman 2.1 の配送エラー処理を VERP に対応させると, 配送エラー処理の的中率が大幅に向上します.
  • リストが存在するかどうかは, リストの config.pck ファイルが存在するかどうかで決めています. 誤ってリストを削除してしまったときは, このファイルに気をつけましょう.
  • リストにメールを送ったときに, Exim か Mailman でユーザIDに関するエラーが起きるのなら, MAILMAN_USERMAILMAN_GROUP が Mailman 自身のものと一致するか (つまり, configure スクリプトで使っているものか) を調べます. また, エイリアスファイルに, リストのアドレスがエイリアスとして登録されていないかも確かめましょう.

受信者検証

Exim の受信者検証 [#]_はとても役に立ちます – SMTPの時点で, 配送不能なアドレスを Exim が拒否するようになります. しかし, これがいちばん役立つのは, 外部から来たメールがローカルのドメインのどれかに向かっているときです. Mailman のリストのトラヒックは, 自サーバから出て, サーバの預り知らない外部のさまざまなドメインへと向かいます. そのうえ, メッセージはたくさんの受信者 – Mailman の既定の設定を使い, SMTP_MAX_RCPTS をいじっていないときは, 最大 500 箇所 – へ向かうことになります.

Mailman のリストのトラヒックで受信者検証をするのは, トラブルのもとです. とりわけ, Mailman からリストの投稿が出ていくときに, Exim は全ての受信者アドレスを検証しようとします. ひとつひとつのアドレスについては, DNS 検索にはわずかな時間しか要さないかもしれませんが, 全体としては著しい遅延を引き起こし得ます. したがって, Mailman のトラヒックに対しては受信者検証を無効にしなければいけません.

Exim 3 では, 首節に以下のものを入れます:

receiver_verify_hosts = !127.0.0.1

Exim 4 では, この点についてはおそらく (RCPT TO ACL 中の) 既定の ACL 文では考慮されていることでしょう:

accept  domains       = +local_domains
        endpass
        message       = unknown user
        verify        = recipient

これで, 自分のドメインのアドレスに対してだけ受信者検証をするようになります (これは厳密には, 127.0.0.1 以外のホストから来るメッセージだけに対して受信者検証をすることとは違いますが, Mailman にはよく効きます).

SMTP 呼出し検証

Exim の SMTP 呼出し検証 [#]_の仕様は, でたらめな送信者アドレスを検出する方法としては, 通常の送信者検証にくらべてはるかに強力です. ところが困ったことに, バウンスメッセージのヘッダにでたらめなアドレスを入れて送るサーバはたくさんありますし, また (バウンスメッセージには空のエンヴェロープ送信者を使うことになっているにも関わらず) でたらめなエンヴェロープ送信者を使ってバウンスメッセージを送るサーバも, 少なからずあるのです.

Mailman が, バウンスの発生しているアドレスをきちんと配送停止したり登録を抹消したりできるように, Mailman のリストへ届くバウンスメッセージは, たとえそういったバウンスメッセージそれ自体はバウンス不可能なものであっても, 受け取るようにしたほうがいいでしょう. そのため, バウンスメッセージに対しては, SMTP 呼出し検証は無効にするとよいかもしれません.

Exim 4 でこれを実現するには, RCPT TO ACL で以下のようなものを使います:

# 呼出し検証などの検査が失敗したとしても, リストへのバウンスメッセージは受け付ける
warn     message      = X-WhitelistedRCPT-nohdrfromcallback: Yes
         condition    = \
         ${if and {{match{$local_part}{(.*)-bounces\+.*}} \
                   {exists {MAILMAN_HOME/lists/$1/config.pck}}} \
              {yes}{no}}
              {yes}{no}}

accept   condition    = \
         ${if and {{match{$local_part}{(.*)-bounces\+.*}} \
                   {exists {MAILMAN_HOME/lists/$1/config.pck}}} \
              {yes}{no}}
              {yes}{no}}

# そして, SMTP 呼出し検証で送信者アドレスを調べる.
deny   !verify = sender/callout=90s

ヘッダのアドレスにも SMTP 呼出し検証をしたければ, 次のようなものを DATA ACL に入れるとよいでしょう.

deny   !condition = $header_X-WhitelistedRCPT-nohdrfromcallback:
       !verify = header_sender/callout=90s

Exim と Mailman で VERP を使う

VERP では, 一つのメールを, リストの購読者ごとに別々の送信者 (返送経路) で送ります – VERP を使えるようにするためのオプションについては $prefix/Mailman/Defaults.py の情報を読んでください. まとめると, Exim で VERP を有効にするのに必要なことは, $prefix/Mailman/mm_cfg.py に次の行を追加することです:

VERP_PASSWORD_REMINDERS = Yes
VERP_PERSONALIZED_DELIVERIES = Yes
VERP_DELIVERY_INTERVAL = Yes
VERP_CONFIRMATIONS = Yes

(先に説明したダイレクタ (ルータ) は, VERP のバウンスメッセージをちゃんと処理できるようになっています. )

仮想ドメイン

仮想ドメインを扱う手法のひとつとして, 仮想ドメインごとに別々の Mailman をインストールするというものがあります. 現時点では, ひとつの計算機で異なる仮想ドメインが同じ名前のリストを別々に持てるようにするには, この方法しかありません [11].

この場合, マクロ MAILMAN_HOMEMAILMAN_WRAP は使えません – 削除してしまってかまいません. ダイレクタ (ルータ) を次のように変更します:

require_files = /virtual/${domain}/mailman/lists/${lc:$local_part}/config.pck

そして, トランスポートを次のように変更します:

command = /virtual/${domain}/mailman/mail/mailman \
          ${if def:local_part_suffix \
               {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}}
               {post}} \
            $local_part
current_directory = /virtual/${domain}/mailman
home_directory = /virtual/${domain}/mailman

リストの検証

ここでは, Exim のアドレステストセットを使って, システムの動作の様子を調べる方法を説明します. 問題のリストを quixote-users@mems- exchange.org とし, 次の一連のコマンドを mems-exchange.org メールサーバで実行します (“% ” は Unix のシェル プロンプトを表します):

% exim -bt quixote-users
quixote-users@mems-exchange.org
  router = mailman_main_router, transport = mailman_transport

% exim -bt quixote-users-request
quixote-users-request@mems-exchange.org
  router = mailman_router, transport = mailman_transport

% exim -bt quixote-users-bounces
quixote-users-bounces@mems-exchange.org
  router = mailman_router, transport = mailman_transport

% exim -bt quixote-users-bounces+luser=example.com
quixote-users-bounces+luser=example.com@mems-exchange.org
  router = mailman_router, transport = mailman_transport

exim -bt の出力がここに示したようなものになっていれば, ここまでは順調と言えます: 少なくとも, Exim が適切なメッセージを適切な Mailman のコマンドに渡していることは確認できました. しかし, インストールしてある Exim/Mailman が, 完全に正しく動作しているという保証はありません!

この文書の履歴

元になる文書は Nigel Metheringham postmaster@exim.org が書きました. Marc Merlin marc_soft@merlins.org が Mailman 2.1 と Exim 4 用に改訂しました. Greg Ward gward@python.net が書き直し/再構成/明確化/簡略化しました.

Sendmail メールサーバを使う場合

警告

Sendmail メールサーバを使うとき, mm_cfg.py の中に DELIVERY_MODULE 設定変数として 'Sendmail' を入れたいと思うかもしれませんが, そうしては**いけません**. Sendmail.py のモジュール名は 間違って付けられています. デフォルトの SMTPDirect.py で使う SMTP 方式に対して, コマンドラインで メッセージを渡す方式を表しています. Sendmail.py ファイルには既知のセキュリティホールがあり 概念的可能性を証明するために提供されています [12]. もし SMTPDirect.py の利用で問題があるなら Sendmail.py を 使うのでなく, 問題を直すことです. でないとセキュリティ悪用にさらす ことになりかねません.

Sendmail の “smrsh” との適合

新しいバージョンの Sendmail は Sendmail がメールプログラムとして 使うことを制限するために “smrsh” という制限実行ユーティリティが 付いてきます. 明示的に Mailman のラッププログラムが smrsh で使える ようにしてあげないと Mailman は動作しません. もしメールが Mailman の ラッププログラムに届かず, “operating system error” がメールの ログに記録されていれば, この問題に突き当たっていることになります.

これを解決するのによい方法は:

  • Sendmail が smrsh ラッププログラムをどこで実行しているかを探す:

    % grep smrsh /etc/mail/sendmail.cf
  • 実行許可するメールプログラムを smrsh がどこにシンボリック リンクしているかを探す. 次のコマンドの最初のほうでどこかの ディレクトリ(例えば /var/adm/sm.bin みたいな)のパス が出てくるでしょう:

    % strings $path_to_smrsh | less
  • /var/adm/sm.bin あるいは自分のシステムで見つけた ディレクトリ (/etc/smrsh とか /var/smrsh とか /usr/local/smrsh とか...) へ移って:

    % cd /var/adm/sm.bin
  • Mailman のラッププログラムへのシンボリックリンクを作成します:

    % ln -s /usr/local/mailman/mail/mailman mailman

Sendmail と Mailman の統合

David Champion は Sendmail と Mailman をより密接に統合する, つまり リストが作成されたときにエイリアステーブルを手で編集しなくても, Sendmail が自動的に認識し新しいリストに配送するようにするための レシピを寄贈してくれました.

Mailman のソース配布物 contrib ディレクトリに次の4つの ファイルがあります:

  • mm-handler.readme - セットアップする方法の説明
  • mm-handler - メール配送エージェント (MDA)
  • mailman.mc - 設定ファイルの例
  • virtusertable - RFC 2142 アドレスを例外にする例

性能について

Sendmail で性能を落とす要因として確実なのは, 受信者のホストを DNS で同時に検証するように設定されている場合です. Mailman からサーバに メールが送信されるときにこれをやると非常に性能が落ちます. Mailman は localhost (つまり, 127.0.0.1) から Sendmail の SMTP ポートに接続しますので, ローカルホストからの接続については DNS での同時検証を**しない**ように Sendmail を設定してください.

qmail メールサーバを使う場合

ここでは, qmail メール配送エージェントを使うユーザがぶつかった問題をいくつかとりあげます. Mailman の中心的なメンテナで qmail を使っている者はいませんので, 以下の情報はすべて, Mailman のユーザ コミュニティから寄贈されたものです. とりわけ, Martin Preishuber と Christian Tismer, そして Balazs Nagy (以下 BN) と Norbert Bollow (以下 NB) の注釈に負っています.

  • --with-mail-gid configure オプションを使って, mail-gid のユーザを, qmail, mailman, nofiles のいずれかにする必要がありそうです.

    BN: どれを選ぶかは, メール格納の方針に大いに依存します. たとえば, 単純な ~alias/.qmail-* ファイルを使っているのなら, ‘id -g alias’ を使います [13]. しかし /var/qmail/users を使っているのなら, そこで指定したメール gid を使うことになります.

    仮想ドメインのアドレスが直接 mailman ユーザに向かうようにしている (たとえば, メーリングリスト専用のドメインに “virtualdomains” を使っている) のなら, --with-mail-gid`=*mailmanユーザのグループのGID* を使わなければならないでしょう. これは, リストのエイリアスを :file:`~alias に入れることとは両立しません. こういうエイリアスは, mailman-リスト名* を転送するものになってしまいます.

  • システムにユーザ mailman があると, エイリアス mailman-owner~mailman の中でだけ動作します. ~mailman ディレクトリの中で touch .qmail-owner すると, このエイリアスを作成できます.

    NB: かわりに, 私がより良い解決策かと思うのが, chown root ~mailman をすることで, こうすると qmail は mailman を, メールを配送できるユーザとみなさなくなります (“man 8 qmail-getpw” を見てください) [14].

  • 関連する話題として, メーリングリストのどれかと同じ名前のユーザがあると, - があるリスト名で問題が起きる, というものがあります. そのユーザのホームディレクトリに .qmail リダイレクションファイルを置いても, Mailman のラッパを正しい GID で呼び出せないため, 動作しません. 解決策は, /var/qmail/users/assign ファイルに次のような行を入れることです:

    +zope-:alias:112:11:/var/qmail/alias:-:zope-:
    .

    これは, リスト名が zope-users などである場合です.

    NB: かわりに, リストを仮想ドメインで扱うことにして, /var/qmail/control/virtualdomains ファイルを使って この仮想ドメインを mailman ユーザで管理させることもできます.

  • BN: 受け取るメッセージを mailman 以外のユーザで配送するときは, そのユーザが ~mailman にアクセスできるようになっていることが必須です. ~mailman にグループ書き込み権限があって, setgid ビットがセットしてあることを確かめます. そして, 配送するユーザを mailman グループに入れますが, ほかのユーザは ~mailman にアクセスできなくしてもよいでしょう. WWW サービスについても同じようにできます.

    とにかく, すべてのメールを扱う仮想メールサーバをつくるのが最善のやりかたです. NB: たとえば, 仮想メールサーバ用に 自分の IP アドレスを指す DNS “A” レコードを追加した上で, /var/qmail/control/virtualdomains ファイルに lists.kva.hu:mailman という行を, /var/qmail/control/rcpthosts ファイルに lists.kva.hu という行を, それぞれ追加します. “virtualdomains” を変更したら, qmail-send に HUP シグナルを送るのを忘れないようにしてください. これで, lists.kva.hu 宛のすべてのメールは mail.kva.hu の mailman ユーザに届くようになります.

    それから, エイリアスを作成します:

    .qmail              => mailman@...へのメール
    .qmail-owner        => mailman-owner へのメール

    リストのエイリアスについては, 次のように手動で作成することもできます:

    .qmail-list         => 'list' リストへの投稿
    .qmail-list-admin   => 'list' の管理者への投稿
    .qmail-list-request => 'list' への要求
    など

    あるいは, (上のように, lists.kva.hu を仮想で使っているときは) リストエイリアスの自動把握をすることもできます. Mailman のソース配布物にある contrib/qmail-to-mailman.py を見てください [15]. ~mailman/.qmail-default を変更して, 次のものを含めます:

    |preline /path/to/python /path/to/qmail-to-mailman.py

    すると, 新しいリストを自動的にみつけてくれるようになります.

  • localhost がメールをリレーできるように気をつけなければいけません. qmail を inetd と tcpenv を通じて起動しているのなら, /etc/hosts.allow につぎのような行が必要です:

    tcp-env: 127. 10.205.200. : setenv RELAYCLIENT

    ここで 10.205.200. は, 自分の IP アドレスブロックです. tcpserver を使っているのなら, /etc/tcp.smtp ファイルに 次のようなものが必要です:

    10.205.200.:allow,RELAYCLIENT=""
    127.:allow,RELAYCLIENT=""
  • BN: /var/qmail/control/concurrencyremote の値は, 常識的な範囲で増やせば, メッセージの送出がより速く動作するようになります. ただし, システムがさばける数 だと分かっていない限り, この値は 120 より大きくしてはなりません.

  • qmail とリレーの設定についてのさらなる情報は, qmail の文書にあります.

BN: 最後に, リストのエイリアスを生成するスクリプトを挙げておきます (なんらかの理由で, contrib/qmail-to-mailman.py を使って自動的にエイリアスを拾い出すことができなかったり, そうしたくないときに使います):

Mailman 2.0 系列のためのスクリプト:

#!/bin/sh
if [ $# = 1 ]; then
    i=$1
    echo カレントディレクトリに $i へのリンクを作っています...
    echo "|preline /home/mailman/mail/mailman post $i" > .qmail-$i
    echo "|preline /home/mailman/mail/mailman mailowner $i" > .qmail-$i-admin
    echo "|preline /home/mailman/mail/mailman mailowner $i" > .qmail-$i-owner
    echo "|preline /home/mailman/mail/mailman mailowner $i" > .qmail-owner-$i
    echo "|preline /home/mailman/mail/mailman mailcmd $i" > .qmail-$i-request
fi

ノート

以下のスクリプトは, 新たにインストールした Mailman 2.1 のためのものです. Mailman 2.0 からアップグレードするユーザだと, ディレクトリを /usr/local/mailman から /home/mailman に変えたがるかもしれません. これをはっきり指定するには, コンパイルのときに configure--prefix オプションを渡します.

#!/bin/sh
if [ $# = 1 ]; then
    i=$1
    echo カレントディレクトリに $i へのリンクを作っています...
    echo "|preline /usr/local/mailman/mail/mailman post $i" > .qmail-$i
    echo "|preline /usr/local/mailman/mail/mailman admin $i" > .qmail-$i-admin
    echo "|preline /usr/local/mailman/mail/mailman bounces $i" > .qmail-$i-bounces
    # 次の行は VERP 用
    # echo "|preline /usr/local/mailman/mail/mailman bounces $i" > .qmail-$i-bounces-default
    echo "|preline /usr/local/mailman/mail/mailman confirm $i" > .qmail-$i-confirm
    echo "|preline /usr/local/mailman/mail/mailman join $i" > .qmail-$i-join
    echo "|preline /usr/local/mailman/mail/mailman leave $i" > .qmail-$i-leave
    echo "|preline /usr/local/mailman/mail/mailman owner $i" > .qmail-$i-owner
    echo "|preline /usr/local/mailman/mail/mailman request $i" > .qmail-$i-request
    echo "|preline /usr/local/mailman/mail/mailman subscribe $i" > .qmail-$i-subscribe
    echo "|preline /usr/local/mailman/mail/mailman unsubscribe $i" > .qmail-$i-unsubscribe
fi

VERP についての情報

上記の 2.1 用エイリアス生成スクリプトでは, VERP 用の行がコメントアウト してあるのに気づいたことでしょう. VERP に関心があるのなら, 2つの選択 肢があります. 一つめは Mailman に VERP 書式化をおこなわせるものです. これを有効にするには, 上のスクリプトでコメントを外し, mm_cfg.py ファイルに次の行を加えます:

VERP_FORMAT = '%(bounces)s-+%(mailbox)s=%(host)s'
VERP_REGEXP = r'^(?P<bounces>.*?)-\+(?P<mailbox>[^=]+)=(?P<host>[^@]+)@.*$'

別の選択肢として, SourceForge にあるパッチも使えます. 次の場所にあります:

http://sourceforge.net/tracker/?func=detail&atid=300103&aid=645513&group_id=103

このパッチは現時点では, テストが充分とは言えないので, 開発者や qmail についてよく分かっている人向きでしょう. 聞くところによると, このパッチは qmail とより調和するアプローチで, 効率を大きく改善させるとのことです.

仮想メール サーバ

qmail メールサーバを使う場合 節でも仮想メールサーバについては触れましたが, テスト中のパッチが以下の場所にあります:

http://sf.net/tracker/index.php?func=detail&aid=621257&group_id=103&atid=300103

念のため. このパッチも, qmail のインストールについてよく分かっている人向けです.

更なる情報

メッセージフッタの変更についての情報に関心があるようなら, Norbert Bollow が Mailman と qmail について書いたものがあります. 次の場所にあります:

http://mailman.cis.to/qmail-verh/ [16]

サイトのデフォルトを点検

Mailman には沢山のサイト全体の設定オプションがありますので, ここで点検し, 必要に応じて変更してください. オプションのいくつかは Mailman があなたの環境でどう動作するかを制御し, あるいは新規に作成したリストのデフォルトを選びます [17]. またシステムチューニングのパラメータや統合のオプションがあります.

$prefix/Mailman/Defaults.py ファイルにサイト全体の デフォルトの全部が入っています. しかし, 絶対 このファイルを 変更してはいけません. その代わり, 同じディレクトリにある, mm_cfg.py ファイルを変更してください. Defaults.py に 入っているのと違うものだけ mm_cfg.py に書き加えればよいだけです. 将来 Mailman をバージョンアップする時に, mm_cfg.py が書き換えられる ことはありません.

Defaults.py ファイルにはコメントが沢山書いてあります. そこで オプションをここで説明することはしません. Defaults.pymm_cfg.py はどちらも Python ファイルなので Python の文法を守るようにしないといけません. でないと Mailman は動きません.

ノート

HOME_DIRMAILMAN_DIR 変数を変えては いけません. これらは configure スクリプトで自動的に設定されます. もし変えると Mailman のインストールが壊れます.

mm_cfg.py の変更は Mailman の構築とインストール 節で Mailman を インストールしたときのユーザでおこなう必要があります.

サイト全体のメーリングリストを作る

Mailman とメールサーバの統合を完成させたら, 次に “サイト全体” の メーリングリストを作る必要があります. これはパスワード備忘通知の発信者 として現れるものであり, Mailman を正しく運用するのに必要なものです. 通常, これは mailman という名前のリストですが, 変更する必要が ある場合は, mm_cfg.py の中で MAILMAN_SITE_LIST 変数を 変更してください. 次のプロンプトに続くコマンドでこのサイトリストを 作成することができます.

% bin/newlist mailman

ここで, サイトリストの設定をします. これの助けになるように, サイトリストの便利なひな形が data/sitelist.cfg に作って あります. このひな形の設定オプションについて見ておいてください. sitelist.cfg ファイルに名前が出ていないオプションについては 変更されないことも注意してください.

このひな形を適用するには次のようにします:

% bin/config_list -i data/sitelist.cfg mailman

sitelist.cfg のオプションを適用の後で, リストの管理ページで 設定を見ておくことを忘れないでください. ください.

サイトリストには自分自身を登録しておいてください.

Cron の設定

多くの Mailman の仕事は定常的なスケジュールで発生します. そのため, 正しい時刻に正しいプログラムを実行するよう cron を設定しなければ なりません [18].

もし, あなたの crontab が -u オプションをサポートして いたら, root になって次のステップを実行してください. 次のコマンドを実行して $prefix/cron/crontab.in を crontab のエントリに入れます.

% cd $prefix/cron
% crontab -u mailman crontab.in

もし, --with-username オプションを使っていたら, -u の引数には mailman の代わりにそのユーザ名を使います. もし, crontab が -u オプションをサポートしていなければ, 次のようにしてください:

% cd $prefix/cron
% su - mailman
% crontab crontab.in

Mailman の qrunner を起動する

Mailman は全てのメール配送に “qrunner” と呼ばれるプロセスを使います. $prefix に移動して, 次のコマンドを実行することで qrunner を 起動する必要があります:

% bin/mailmanctl start

システムをリブートするたびに Mailman を起動したほうがよいでしょう. 実際にどうするかは使用するオペレーティングシステムに依存します. OS が chkconfig コマンドをサポートしていれば (例えば Red Hat や Mandrake の Linux) 次のようにしてください (Mailman の インストールディレクトリから, root になって):

% cp scripts/mailman /etc/init.d/mailman
% chkconfig --add mailman

/etc/init.d はシステムによっては /etc/rc.d/init.d かも しれません.

Gentoo Linux では次のようにします:

% cp scripts/mailman /etc/init.d/mailman
% rc-update add mailman default

Debian ではこうするとよいでしょう:

% update-rc.d mailman defaults

chkconfig をサポートしない Unix では次の一連のコマンド を試してみるとよいかもしれません:

% cp scripts/mailman /etc/init.d/mailman
% cp misc/mailman /etc/init.d
% cd /etc/rc.d/rc0.d
% ln -s ../init.d/mailman K12mailman
% cd ../rc1.d
% ln -s ../init.d/mailman K12mailman
% cd ../rc2.d
% ln -s ../init.d/mailman S98mailman
% cd ../rc3.d
% ln -s ../init.d/mailman S98mailman
% cd ../rc4.d
% ln -s ../init.d/mailman S98mailman
% cd ../rc5.d
% ln -s ../init.d/mailman S98mailman
% cd ../rc6.d
% ln -s ../init.d/mailman K12mailman

ホスト名の設定をチェックする

Defaults.py の中の DEFAULT_EMAIL_HOSTDEFAULT_URL_HOST をチェックしてください. 変更が必要な場合は Defaults.pyなく mm_cfg.py に書きます. また, どちらかの値を変更したときには, mm_cfg.py の変更の後に, 次のように追加してください.

add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)

もし既に作成したリストがあったら, bin/fix_url.py を使って ドメイン名を変更してください.

サイトパスワードの作成

bin/mmsitepass スクリプトを使用すると, コマンドラインから 2つのサイト全体のパスワードを作成できます. 一つ目は, “サイトパスワード” でシステム上でパスワードが必要の 場合はどこでも使うことができます. サイトパスワードはどのリストの 管理ページへも入ることができますし, どのユーザとしてもログインできます. Unix システムでの root を考えてください. このパスワードは 賢く考えて選んでください.

2番目のパスワードはサイト全体の “リスト作成” パスワードです. これを使うと, サイトパスワードの全ての特権を与えずに, 新しいリストを 作成するだけの権限を持たせることができます. もちろん, サイトパスワードでも新しいメーリングリストを作成できますが, リスト作成パスワードは特別の役割だけに限定するものです.

サイトパスワードの設定には次のコマンドを使います:

% $prefix/bin/mmsitepass <あなたのサイトパスワード>

リスト作成パスワードの設定は次のコマンドを使ってください:

% $prefix/bin/mmsitepass -c <リスト作成パスワード>

リスト作成パスワードを設定しなくても結構ですが, サイトパスワードは 必要になるはずです.

初めてリストを作成する

Mailman を使うに当たってリストを作成したり設定したりといった詳しい情報 については, Mailman リスト管理マニュアルを参照してください. ここでは, ウェブインタフェースを使って最初のメーリングリストを作成 するための簡単なガイドを説明します:

  • まず URL http://my.dom.ain/mailman/create を開いてください.
  • 画面に出ている指示に従ってフォームに記入して, “リスト作成者の パスワード” のところに サイトのデフォルトを点検 節で作成した パスワードを入れてください. 自分のメールアドレスを “リスト管理者アドレスの初期設定” のところに入れ, “「リスト作成完了」をメールで管理者に知らせますか” で “はい” を 選んでください.
  • “リストを作成する” ボタンをクリックしてください.
  • Mailman からあなた宛に新しいメーリングリストが作成されたことを メールで知らせますのでチェックしてください.
  • 確認のウェブページか Mailman が送信したメールに書かれたリンクを たどって, リストの管理ページへ行って下さい. たいがいは, URL は http://my.dom.ain/mailman/admin/mylist みたいになってる はずです.
  • リストのパスワードを入れて, “ログイン...” をクリックします.
  • “会員管理” をクリックし, 続いて “まとめて入会登録” へ行って ください.
  • 大きいテキスト入力エリアに自分のメールアドレスを入れ, “変更を送信する” をクリックしてください.
  • 自分のメールソフトで, mylist@my.dom.ain 宛てにメールを 出してください. 1,2分のうちに, Mailman 経由で自分のメールが返って 来るでしょう.

おめでとう! あなたの最初のメーリングリストの設定とテストが完了しました. 何か問題が起こったら, トラブルと対策 節を見てください.

トラブルと対策

もし, Mailman の実行で問題が発生したら, まず以下の「一般的な 問題」の節をチェックしましょう. もし, 問題がそこに含 まれていなければ, オンラインヘルプ を見てください. そこから, FAQインタラクティブな FAQ ウィザード へ行くことができます.

それから, システムの syslog と, Mailman の $prefix/logs/error ファイルにエラーが入っていないかもチェック しましょう. それでも問題があれば, mailman-users@python.org メーリングリスト [19] に質問を書いてください. http://mail.python.org/mailman/listinfo/mailman-users に詳しい 案内があります.

オペレーティングシステムや, 使用している Python のバージョン, インストール中の Mailman のバージョンなどについての情報も 忘れずに入れてください.

以下は, 一般的な質問と回答のリストです: Here is a list of some common questions and answers:

  • 問題: Mailman の ウェブページが全て 404 File not found エラーに なります.

    解決法: ウェブサーバの設定で Mailman の CGI コマンドを正しく 扱えるように設定できていません. 以下を確認:

  1. ウェブサーバで $prefix/cgi-bin に正しく許可 (パーミッション) を設定する.
  2. ウェブサーバを正しく再起動する.
ウェブサーバの説明書をよく読んでどうしたらよいか調べてください.
  • 問題: Mailman のウェブページが全て “Internal Server Error” になります.

    解決法: 間違ったユーザまたはグループを使って CGI を 実行しようとしている可能性があります. ウェブサーバのログをチェックして ください. 例えば以下のような行があったら,

    Attempt to exec script with invalid gid 51, expected 99

    Mailman を再インストールしなければなりません.

    Mailman の構築とインストール 節に書かれていたように, 正しい CGI グループ ID を指定して ください.

  • 問題: メールをリストに送ったら, リストが見つからないという メールを受け取りました.

    解決法: 多分, システムのエイリアスデータベースに必要な エイリアスを登録していなかったのでしょう. あるいは, Mailman と メールサーバの組み合わせが正しく行われていないのかもしれません. エイリアスデータベースを更新していないか, あなたのシステムでは newaliases を明示的に実行する必要があるのかしれません. あなたがご利用のサーバについて:ref:mail-server 節で 確認してください.

  • 問題: リストにメールを送ったら, “unknown mailer error” が帰ってきました.

    解決法: メールラップで間違ったユーザまたはグループID を使っている可能性があります. メールサーバのログをチェックして ください. 次のような行があったら,

    Attempt to exec script with invalid gid 51, expected 99

    Mailman を再インストールしなければなりません.

    Mailman の構築とインストール 節に書かれていたように, 正しいメールグループ ID を指定して ください.

  • 問題: 私は Postfix をメールサーバに使っています. そして, メールラッププログラムは GID が違っていると不平をログに残します.

    解決法: $prefix/data/aliases.db ファイルの 所有者が mailman (又は configure コマンドで使った名前) であることを確認してください. もし mailman 以外のユーザに 所有されている場合は, Postfix は正しいユーザでメールプログラムを 実行しません.

  • 問題: 私は Sendmail をメールサーバに使っています. そして, メールをリストに送ると “sh: mailman not available for sendmail programs” というメールが返ってきます.

    解決法: あなたのシステムでは Sendmail restricted shell (smrsh) が使われています. メールラッププログラム ($prefix/mail/mailman) から smrsh で実行が許可されて いるディレクトリにシンボリックリンクを張る必要があります.

    一般的にこのディレクトリは /var/admin/sm.bin, /usr/admin/sm.bin, /etc/smrsh などに設定されています.

    Debian Linux ではシステムは /usr/lib/sm.bin を作成します が, これは間違っています. /usr/admin/sm.bin を 作ってそ こへリンクを作成する必要があります. 注::program:newaliases が吐き出すどのエイリアスもラップへの 安全なリンクを指す必要があります.

  • 問題: configure を呼び出すときに散らかして しまいました. 掃除をして再インストールするにはどうしたらいいですか?

    解決法:

    % make clean
    % ./configure --with-the-right-options
    % make install

プラットフォームやオペレーティング システムごとの注

一般に, Mailman は POSIX 準拠のシステム (Solaris, BSD のさまざまな変種, Linux 系システム, MacOSX, その他の Unix システムなど) でなら動作します. Windows では動作しません. たいていの場合, Mailman がサポートされているプラットフォームで動作するようにするには, この文書で説明した一般的な手順だけで充分です. しかし, 一部のオペレーティング システムでは, このほかに, インストールや設定の際に推奨される手順があります.

GNU/Linux について

Linux は, Mailman を実行するプラットフォームとしては, もっとも普及しているもののようです. Mailman を Linux で実行できるようにするためのヒントをいくつか挙げます:

  • ハードリンクの作成でエラーが起こったり, 特別なセキュア カーネル (securelinux/openwall/grsecurity) を使っているときは, Mailman のソース配布物のファイル contrib/README.check_perms_grsecurity を見てください.

    Linux Mandrake をセキュア モードで使っているのなら, これは役にたつでしょう.

  • Mandrake は 9.0 あたりから gcc の実行権限を変更しています. mailman ユーザになってビルドするのなら, mailmancctools グループにも所属しているようにします.

  • Python を Linux ディストリビューションのパッケージ管理 (例えば Redhat 系のシステムなら .rpm, Debian なら .deb) でインストールしたのなら, Python “開発用” パッケージもインストールしなければいけません. そうしないと期待したとおりの結果になりません.

    例えば, Debian で Python 2.2 を使っているのなら, python2.2-dev パッケージをインストールする必要があります. Redhat では, たぶん python2-devel パッケージが必要でしょう.

    Python をソースからインストールしたのなら, うまくいくはずです.

    理屈はよくわかりませんが, インストールの最中につぎのようなエラーが起こるのなら, この問題がおきていると判断してよいでしょう:

    Traceback (most recent call last):
      File "bin/update", line 44, in ?
        import paths
    ImportError: No module named paths
    make: *** [update] Error 1

    これがおこるのなら, Python の開発用パッケージをインストールしてから もう一度 configuremake install をやってみましょう. あるいは, 最新バージョンの Python (http://www.python.org で入手できる) をソースからインストールします.

    この問題は, 上記以外の Linux ディストリビューションでは 違ったふうに表れるかもしれませんが, 普通は ImportError として表れます.

BSD について

Vivek Khera によれば, 一部の BSD システムでは, 夜間のセキュリティ スキャンで setuid ファイルの変更を調べます. setgid ディレクトリも, 変更されるとスキャン結果に現れます. また, BSD システムでは, ディレクトリの中にファイルを作ると, ディレクトリのグループ所有権を自動的に継承するので, setgid ビットはなくてもいいのです. 他の Unix システムでは, ディレクトリの setgid ビットがオンになっていないと こうはなりません.

ディレクトリの setgid ビットをオンにせずにインストールするには, configure を実行したあとで, makeDIRSETGID 変数を渡せばいいです:

% make DIRSETGID=: install

これで, インストールされるディレクトリに対する chmod g+s コマンドが無効になります.

MacOSX について

Mailman を MacOSX で実行している人も大勢います. ここでは, Mailman を MacOSX で実行できるようにするために集めた 情報へのポインタを挙げておきます.

  • Jaguar (MacOSX 10.2) には Python 2.2 がついてきます. が, これは Python のあまり最近の安定バージョンではなく, Mailman 2.1 を実行するのには充分ではありません.

  • David B. O’Donnell は, Web サイトで, 自分の MacOSX 上の Mailman 2.0.13 と Postfix の設定を説明しています.

    http://www.afp548.com/Articles/mail/python-mailman.html

  • Kathleen Webb は, Jaguar で Sendmail を使って Mailman を実行できるように した経験を投稿してくれました.

    http://mail.python.org/pipermail/mailman-users/2002-October/022944.html

  • Panther サーバ (MacOSX 10.3) には Mailman が入っています; オペレーティング システムには助けになる文書が含まれていますし, Apple は, Mailman を MacOSX Server 10.3 で動作させる際にぶつかりそうな 問題についての技術文書を出しています:

    http://docs.info.apple.com/article.html?artnum=107889

Terry Allen は, 「クライアント」版の OSX や初期の版の OSX での Mailman の実行について, 以下のような詳細な説明を提供してくれました ——

Mac OSX の 10.3 以降では, Mailman ははじめからインストールしてあります. Mac OSX のそれ以前の版では [訳注: MTA として Postfix ではなく] Sendmail が入っているので, そういうユーザは, このマニュアルの Sendmail でのインストールの節を見て, こつをつかんでください. このマニュアルの前のほうで説明している基本的なインストール手順を, 本節で概説している手順で適当に読み換えながら, 実施します.

Mac OSX 10.3 の「クライアント」版には, 既定ではフル機能版の Postfix が入っていません. Postfix などの MTA を動作させる設定の説明はこの文書の範囲を超えますから, http://www.postfix.org を見て, Postfix が実行できるようにするこつをつかんでください. Postfix をインストールして動作するように設定する簡単な方法としては, Postfix Enabler を実行するというものがあります. Mac OSX で Postfix を設定するためのスタンドアロンのツールです. http://www.roadstead.com/weblog/Tutorials/PostfixEnabler.html にあります.

また, Mac OSX 「クライアント」版でも 10.1 以降なら, Apache ウェブサーバが動作するようになっています. 「システム管理設定」を使って「共有」タブの中で有効にします. Webmin というツールは, Mac OSX で Apache を設定するのに役立ちます. http://www.webmin.com で手に入ります.

Webmin では, システムのほかの機能についての設定もできます. Postfix の設定, crontab へのジョブの追加, ユーザやグループの追加, などができます. また, スタートアップジョブやシャットダウンジョブの追加もできます.

OSX の標準的なインストレーションでの Mailman の要求事項として, Python がインストールされていること, というものがありますが, Python は既定ではインストールされていません. そこで, 開発ツール パッケージをインストールすることをお勧めします. このパッケージは, システムとともに提供されているかもしれません. また, Apple Developer Connection サイト http://connect.apple.com からダウンロードすることもできます. 開発ツール パッケージは, Mailman をインストールするのにどうしても必要というわけではないのですが, いつか他のツールが必要になったときにも役立ちそうなものではあります. 開発ツールは XCode Tools ともいいます.

Python のバージョンは, 最低限, 2.2 でなければなりません. しかし, 2.3 をお勧めします.

Webmin などの GUI インタフェースではなく, OSX のコマンドラインを使ってユーザやグループを追加したければ, ターミナル アプリケーションを開き, 以下に示すコマンドを入力します (# ではじまるコメント行は, 単なる説明なので, 入力しません):

sudo tcsh
niutil -create / /users/mailman
niutil -createprop / /users/mailman name mailman
# xxx は, システム上で空いているユーザ ID 番号であることに注意
niutil -createprop / /users/mailman uid xxx
niutil -createprop / /users/mailman home /usr/local/mailman
mkdir -p /usr/local/mailman
niutil -createprop / /users/mailman shell /bin/tcsh
passwd mailman
# ここでは, 悪意のあるハッキングを防ぐため, セキュアなパスワードを与えること
niutil -create / /groups/mailman
niutil -createprop / /groups/mailman name mailman
# xxx は, システム上で空いているグループ ID 番号であることに注意
niutil -createprop / /groups/mailman gid xxx
niutil -createprop / /groups/mailman passwd '*'
niutil -createprop / /groups/mailman users 'mailman'
chown mailman:mailman /usr/local/mailman
cd /usr/local/mailman
chmod a+rx,g+ws .
exit
su mailman

OSX の Apache で Mailman が使えるように設定する手順は, [訳注: このマニュアルで説明しているのと] ほとんど同じです. Mac OSX クライアント版の標準的な設定ファイルは /etc/httpd/httpd.conf (これが標準の場所) あたりに格納されています.

AFP548.com のサイトには, スタートアップアイテムの自動作成ツールがあり, これを使うと手間が省けます. http://www.afp548.com/Software/MailmanStartup.tar.gz で見つかります.

インストールするには, このファイルを /Library/StartupItems ディレクトリにコピーします. ターミナルで root かスーパユーザになって, 次のものを入力します:

gunzip MailmanStartup.tar.gz
tar xvf MailmanStartup.tar

これでスタートアップアイテムが作成されるので, 再起動すれば Mailman が開始されます.

Footnotes

[1]訳注:現時点で翻訳は訳者(菊地・池田)の環境において確認できる部分 に限られています.
[2]訳註: wrapper ... ○○ラップ(商品名)と同じ 「包む」という意味なので, こう訳してみました
[3]インストールが完了してから パーミッションをチェックして修正することができます.
[4]これは Mailman 2.1 のデフォルトです. 以前のバージョンでは, /home/mailman に全てインストールしていました.
[5]もし, BSD システムを使うなら BSD について も読んでください
[6]訳注:原文は extended address semantics なので, ‘拡張されたアドレスの意味論’. 実際には, extended address とだけ書いてある文献が多いようなので, ‘意味論’ を省略した.
[7]訳注:virtual alias domains.
[8]訳注: “HOWTO - Using Exim and Mailman together”.
[9]訳注: 後の節で説明するダイレクタ (ルータ) の設定をしたあとで追加します.
[10]訳注: main section. Exim の設定ファイルで, 最初の “begin ...” 行より前の, 全般的な設定を記述する部分.
[11]訳注: Mailman は, MTA を通じてメールを送る際に, HELO (EHLO) コマンドの引数として, 自ホストのプライマリ FQDN を使います. スパム排除のために, HELO (EHLO) の引数に自ホスト名をかたるクライアントからの配送を拒否するような設定をしている場合は, localhost (127.0.0.1) からの配送が拒否されないように気をつけてください.
[12]訳注: recipient verification.
[13]訳注: SMTP callback.
[14]訳注: 異なる仮想ドメインで同じ名前のリストを別々に使えなくてもかまわなければ, 本節の設定は不要です.
[15]実際, Mailman の 最近のバージョンでは, このモジュールをわざと動かなくしてあります. もしこれを有効にしたいのであれば, なにが起こるかよく理解していなければ いけません.
[16]訳注: ユーザ alias の GID を使う, という意味です.
[17]訳注: mailman ユーザのホームディレクトリが存在しない場合 (「グループとユーザの追加」の節の手順のとおりにするとそうなります) も, qmail は mailman を, メールを配送できるユーザとみなしません.
[18]訳注: qmail-to-mailman.py は, 仮想メールサーバでないアドレスにも使えるでしょう.
[19]訳注: 翻訳時点ではアクセスできませんでした.
[20]一般的に, ここで変更したリストのデフォルトは既に作成済みのリストには 適用されません. リストが作成された後に変更を加えるには, ウェブインタフェース を使うか bin/withlistbin/config_list のような コマンド行スクリプトを使います.
[21]以前のバージョンから更新するときには, 新しい crontab を入れないといけないかもしれません. しかし, 複数の Mailman を インストールしている場合には注意が必要です. crontab を変更すると 他の平行した Mailman を壊すかもしれません.
[22]メールを投稿するにはこメーリングリストに入らないといけませんが, リストの保存書庫は一般公開されています.