Mailman
mailing list server を国産の fml (http://www.fml.org) で構築したが、管理を web 上で簡単ビジュアルに行える Mailman というメーリングリストマネジャーが「UNIX
USER」2003/11に掲載されたのでこちらに乗り換えてみようと思う。
Mailman 公式サイト (http://www.list.org/)
国際化 Mailman に関する日本語情報 (http://mm.tkikuchi.net/)
| Linux Server | since May.11 2003 |
|
|||
| Copyright sleepingbird, 1993- All rights reserved. | |||||
| Linux Server |
TOP > Linux Server > MailingList
mailing list server を国産の fml (http://www.fml.org) で構築したが、管理を web 上で簡単ビジュアルに行える Mailman というメーリングリストマネジャーが「UNIX
USER」2003/11に掲載されたのでこちらに乗り換えてみようと思う。
Mailman 公式サイト (http://www.list.org/)
国際化 Mailman に関する日本語情報 (http://mm.tkikuchi.net/)
Mailman は、Python Version 2.1 以上が必要である。 VineLinux3.1 をインストールした時点で、すでに 2.3.4
も同時に導入されている。
ただし、 devel パッケージが必要なのでインストールしておく。
# apt-get install python-develテストの結果、2.3.2 では日本語化部分に不具合が発生し、Mailman のスクリプトの一部が異常終了することが判明した。具体的には、月に1度自動配送される「メーリングリスト会員情報備忘通知」スクリプトにおいて、`unknown encoding: EUC-JP' を吐いて転けた。(後述の日本語コーデックを適用してもダメ)
$ wget http://www.python.org/ftp/python/2.2.3/Python-2.2.3.tgzデフォルトで /usr/local/bin/ にインストールされる。
$ tar xvzf Python-2.2.3.tgz
$ cd Python-2.2.3
$ ./configure
$ su
# make install
# wget http://www.python.jp/Zope/download/JapaneseCodecs/JapaneseCodecs-1.4.11.tar.gz
# tar zxvf JapaneseCodecs-1.4.11.tar.gz
# cd JapaneseCodecs-1.4.11
# /usr/local/bin/python2.2 setup.py install
実行ユーザー、グループ、ディレクトリを作成する。
$ suユーザー mailman で作業を続ける。
# groupadd mailman
# useradd -g mailman mailman
# mkdir /usr/local/mailman
# chown mailman:mailman /usr/local/mailman
# chmod 2775 /usr/local/mailman
# su - mailmanHTTPD と MTA の gid 、python のインストール位置を指定して configure する。
$ wget http://mm.tkikuchi.net/mailman-2.1.6.tgz
$ tar xvzf mailman-2.1.6.tgz
$ cd mailman-2.1.6インストールする。デフォルトでは /usr/local/mailman にインストールされる。
$ ./configure --with-cgi-gid=apache --with-mail-gid=nobody --with-python=/usr/local/bin/python2.2
$ make install
Apache の設定を変更し再起動する。mailman ディレクトリの cgi-bin がアクセスできるようにする。
# vi /etc/httpd/conf/httpd.conf
#mailman
ScriptAlias /mailman/ /usr/local/mailman/cgi-bin/
<Directory /usr/local/mailman/cgi-bin/>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
# /etc/rc.d/init.d/httpd restart
ここで接続確認をする。http://www.qcp.jp/mailman/listinfo にブラウザでアクセスし、下のような表示されれば
OK。なお、この段階では英語表記のままである。
管理者用メーリングリスト(サイトリスト)を作成する。
リスト名はデフォルトで mailman 。インストールフォルダの bin/newlist を使う。
$ bin/newlist mailman リスト管理者のメールアドレスを入力してください: mailman の初期パスワード: あなたのメーリングリスト作成を完了するには, /etc/aliases(または同等の ファイルに), 次の行を付け加えてやらなければなりません. また, 多分, `newaliases' プログラムを実行しなければならないでしょう. ## mailman mailing list mailman: "|/usr/local/mailman/mail/mailman post mailman" mailman-admin: "|/usr/local/mailman/mail/mailman admin mailman" mailman-bounces: "|/usr/local/mailman/mail/mailman bounces mailman" mailman-confirm: "|/usr/local/mailman/mail/mailman confirm mailman" mailman-join: "|/usr/local/mailman/mail/mailman join mailman" mailman-leave: "|/usr/local/mailman/mail/mailman leave mailman" mailman-owner: "|/usr/local/mailman/mail/mailman owner mailman" mailman-request: "|/usr/local/mailman/mail/mailman request mailman" mailman-subscribe: "|/usr/local/mailman/mail/mailman subscribe mailman" mailman-unsubscribe: "|/usr/local/mailman/mail/mailman unsubscribe mailman"表示された aliases を copy & paste で /etc/aliases 書き加え、newaliases する。
$ suテストとしてメイリングリスト mailman にメールを送ってみる。
# vi /etc/aliases
# newaliases
# mail mailman Subject: test test . Cc: # mailここまでの設定に問題がなければ何も送られてこない。
<mailman@sleepingbird.net>: Command died with status 2:mail-gid を間違って configure したようなので、指示に従って再度やり直し、メールが送られてこなくなるまで繰り返す。
"/usr/local/mailman/mail/mailman post mailman". Command output: Group
mismatch error. Mailman expected the mail wrapper script to be executed as
group "postfix", but the system's mail server executed the mail script as
group "nobody". Try tweaking the mail server to run the script as group
"postfix", or re-run configure, providing the command line option
`--with-mail-gid=nobody'.
画像ファイルを apache のディレクトリにコピーする。
$ su保存書庫ディレクトリの Alias 設定と、ディレクトリ属性の設定を行い、apache を再起動する。
# cp /usr/local/mailman/icons/*.{jpg,png} /home/httpd/icons/
# vi /etc/httpd/conf/httpd.conf
Alias /pipermail/ /usr/local/mailman/archives/public/
<Directory /usr/local/mailman/archives/public/>
AllowOverride None
Options FollowSymLinks Indexes
Order deny,allow
Allow from all
</Directory>
# /etc/rc.d/init.d/httpd restart
cron を設定する。なお、crontab.in の内容は一読してどんな処理がされているか位は確認しておく。# su - mailmanqrunner daemon を起動する。
$ cd /usr/local/mailman/cron
$ crontab crontab.in
$ cd /usr/local/mailmanここまで、設定が正しければ、次の二つのメールが管理者宛に送信されてくる。
$ bin/mailmanctl start
Mailman のマスター qrunner を起動します
Subject: Your new mailing list: mailmanMailman の使用言語のデフォルトを日本語にする。
メーリングリスト mailman を作成したときの管理者宛通知
Subject: Your message to Mailman awaits moderator approval
メーリングリスト mailman にテストメールを送信したときの保留通知
$ vi /usr/local/mailman/Mailman/mm_cfg.pyここで再度 http://www.sleepingbird.net/mailman/listinfo にブラウザでアクセスすれば、日本語のページが確認できる。
DEFAULT_SERVER_LANGUAGE = 'ja'
$ bin/mailmanctl restart
Mailman のマスター qrunner を再起動します
$ bin/rmlist -a mailman作成した mailman メーリングリストは管理用として Mailman で定義済みなので、 cron のエラーなど Mailman 運用中の重要なメールが配信されるため、必ず入会しておく。
$ vi /usr/local/mailman/Mailman/mm_cfg.py
DEFAULT_EMAIL_HOST = 'sleepingbird.net'
DEFAULT_URL_HOST = 'www.sleepingbird.net'
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
3行追加
$ bin/mailmanctl restart
Mailman のマスター qrunner を再起動します
$ newlist mailman
管理ページからmailman メーリングリストは一般には参加を募らないので「ようこそ!」ページに表示しないようにしておく。
「プライバシー・オプション」の「送信者フィルター」サブメニューを開く
設定項目の下から二番目の「動作が定義されていない非会員からの投稿があった場合の動作」を「承認」に変更しておく。
「プライバシー・オプション」の[入会規則]最初の項目メーリングリストを作成するためのパスワードを設定しておく。以後、メーリングリストを作成するにはこのパスワードが必要となる。
「このマシンでどんなリストがあるか聞かれた時に広告しますか? 」を「いいえ」に変更する。
$ cd /usr/local/mailman新たにメーリングリストが作成された場合、サイト管理者あてに /etc/aliases に追加する項目がメールされるので、それを追加して newaliases して運用開始となる。
$ bin/mmsitepass
mailman 自体をコントロールするのはインストールディレクトリ下の bin にあるコマンド群である。これらの一覧を次に示す。なお、使用方法は
--help オプションで起動すると表示される。
| コマンド | 処理概要 |
|---|---|
| bin/add_members | コマンド行から会員登録する. |
| bin/arch | リストの保存書庫を再構築する. このコマンドでメーリングリストの保存書庫を再構築します. 保存書庫内の メールを編集したり削除したときに, このコマンドを実行するとよいでしょう. |
| bin/b4b5-archfix | MM2.1b4 形式の保存書庫を修正する. |
| bin/change_pw | リストのパスワードを変更する. |
| bin/check_db | リストの設定データベースをチェックする. |
| bin/check_perms | Mailman インストールのためのパーミッションをチェックする. |
| bin/cleanarch | .mbox の過去メールファイルをきれいにする. |
| bin/clone_member | 会員アドレスのクローン作成. 会員アドレスのクローン作成とは, 元の会員アドレスと全く同じオプションとパスワードで新しい会員を登録することを意味します. |
| bin/config_list | テキストファイルの記述からリストの設定を行う. |
| bin/discard | 保留メールを破棄する. |
| bin/dumpdb | Mailman のデータベースファイルの内容を表示する. |
| bin/find_member | 会員が属するリストを検索する. |
| bin/fix_url | url 情報をサーバーに整合させる |
| bin/genaliases | Mailman の aliases を再生成する. 実際の出力は, mm_cfg.py ファイルの `MTA' 変数の値によって変わります. |
| bin/inject | Mailman の incoming キューにファイルからメールを入れる. |
| bin/list_admins | メーリングリストの管理者を表示する |
| bin/list_lists | 全てのメーリングリストを表示する. |
| bin/list_members | メーリングリストの会員全員を表示する. |
| bin/list_owners | 全部または一部のメーリングリストの管理者を表示する. |
| bin/mailmanctl | Mailman の qrunner デーモンをスタート/停止するスクリプト. |
| bin/mmsitepass | 端末から入力することで, サイトのパスワードを設定する |
| bin/newlist | 新しく会員未登録のメーリングリストを作成する. |
| bin/qrunner | ひとつ以上の qrunner を, 一度か繰り返し実行する. |
| bin/remove_members | リストから会員を削除する. |
| bin/rmlist | メーリングリストを削除する (完全に) - 注意! |
| bin/show_qfiles | Mailman の qfiles にあるメールの内容を表示する. |
| bin/sync_members | リストの会員を平文のファイルと同期させる. |
| bin/unshunt | Mailmanの翻訳をチェックする. 翻訳の中の変数とタグが原本の変数とタグに一致するかどうかを調べる. |
| bin/unshunt | メールを shunt キューから元のキューに移動する. |
| bin/update | 必要なアップグレードを行う. |
| bin/version | 使用中の Mailman バージョンはを表示する. オプションは無い. |
| bin/withlist | メーリングリストオブジェクトとやりとりするために一般的枠組み. |
Mailman ソースの展開ディレクトリに README.POSTFIX という POSTFIX 固有の設定解説があるので、これに基づいて設定を行う。
/etc/postfix/main.cf に次の行を追加する。
owner_request_special = no/usr/local/mailman/Mailman/mm_cfg.py に次の行を追加する。
recipient_delimiter = +
unknown_local_recipient_reject_code = 550
MTA = 'Postfix'/usr/local/mailman/Mailman/Defaults.py の次の値がシステムの設定と整合しているかを確認しておく。もし、違っていたら mm_cfg.py で修正値を追加する。VineLinux3.1 では整合していた。
POSTFIX_ALIAS_CMD = '/usr/sbin/postalias'ここで、ユーザー mailman で bin/genaliases を実行すると、/usr/local/mailman/data 下に aliases と aliases.db が生成されるようになる。このファイルを POSTFIX で参照できるように /etc/postfix/main.cf を変更しておく。なお、生成されたファイルの所有者とグループが maillman であることを確認し、もし違っていたら変更しておく。また、aliases.db のパーミッションも変更する。(これは README.POSTFIX に記述がないので注意)
POSTFIX_MAP_CMD = '/usr/sbin/postmap'
# su mailman
$ cd /usr/local/mailman
$ bin/genaliases
$ ls -l data/aliases*
$ chmod g+w data/aliases.db
# vi /etc/postfix/main.cf最後に、Mailman を --with-mail-gid=mailman で configure し直す。
alias_maps = hash:/etc/postfix/aliases
↓
alias_maps = hash:/etc/postfix/aliases,hash:/usr/local/mailman/data/aliases
# /etc/rc.d/init.d/postfix reload
# su mailman問題なければ qrunner を再起動する。
$ cd /home/mailman/mailman-2.1.6b3
$ ./configure --with-cgi-gid=apache --with-mail-gid=mailman --with-python=/usr/local/bin/python2.2
$ make install
$ cd /usr/local/mailman
$ bin/check_perms -f
$ bin/mailmanctl restartこれで、新しいメーリングリストを作った時に newaliases しなくてもリストが運用できる。ただし、POSTFIX の reload 操作は必要。 cron/mailpasswds の修正も忘れないこと。
Mailman のマスター qrunner を再起動します
サーバー起動時の自動起動用スクリプトが /usr/local/mailman/scripts/mailman
として生成されているので、これを利用する。
# cp /usr/local/mailman/scripts/mailman /etc/init.d/mailman # cd /etc/init.d # chkconfig --add mailman # chkconfig mailman on # chkconfig --list mailman mailman 0:off 1:off 2:on 3:on 4:on 5:on 6:off
次の設定をしておくと便利。/usr/local/mailman/Mailman/mm_cfg.py に追記する。
メール配送の個別化
メールのヘッダやフッタに個別のデータを差し込むことが出来るようになる。
「普通配送オプション」に「普通配送について、配送を個別化しますか?」という項目が追加される。
「完全個別配送」にすると、宛先(To:)が会員個人のアドレスになる。
ただし、システムのオーバーヘッドが大きくなるので注意する。
OWNERS_CAN_ENABLE_PERSONALIZATION = YesVERP 配送先トラッキング
VERP_PERSONALIZED_DELIVERIES = Yes添付ファイル削除
管理ページから
「内容フィルター」の「以下の設定に従ってメールの内容によるフィルターをおこないますか?」を「はい」
「この内容(Content-Type)に合わない添付ファイルは取り除きます. このチェックを行わないようにするには,ここを空白にしておいてください. 」の右枠内に次のように入力しておく。
multipart
text/plain
管理ページから以上の設定で、送信後、自分自身で配信を承認することによって、偽装メールを防止する。また、送信用アドレスも隠蔽できる。
「会員管理」 の[会員リスト]
「その他の会員に関する操作」
「全員の発言制限(モデレーション)・ビットをセットする. (隠れ会員を含む)」を「オン」にする。
「プライバシー・オプション... 」の[送信者フィルター]で「デフォルトで, 新会員からの投稿は制限しますか?」
を「はい」にする。
「投稿があると司会承認のため直ちに保留される非会員のメールアドレス」に投稿に使うメールアドレスを入力しておく。
「一般オプション」の「メッセージの送信者を隠して, リストのアドレスに置きかえる (From, Sender と Reply-To を削除します)」を「オン」にする。
普通配送会員へのメールに付加されるフッタの例示
_______________________________________________post_id (通し番号) を変更する
%(real_name)s mailing list
このリストの案内ページ
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
退会・変更・配送一時停止は以下へ
%(user_optionsurl)s
$ /usr/local/bin/python2.2 -i bin/withlist sbinfo
sbinfo のリストを読み込中 (ロック解除)
変数 `m' が sbinfo の MailList インスタンスです
>>> m.Lock()
>>> m.post_id
10
>>> m.post_id = 30
>>> m.Save()
>>> ^D
>>> ^D
リストをロック解除 (保存はしてません): sbinfo
最終処理中
$
aaaaa@exsample.net (nameA) bbbbb@exsample.net (nameB) ccccc@exsample.net (nameC)
mailman が自動送信するメッセージのテンプレートは /usr/local/mailman/templates/ja
にあるので、これを修正すればカスタマイズできる。
主なものは次のとおり。
| cronpass.txt | メーリングリストが毎月自動送信する備忘通知 |
| help.txt | メーリングリストのヘルプ |
| subscribeack.txt | メーリングリストへようこそ! |
/usr/local/mailman/messages/ja/LC_MESSAGES/mailman.po(毎月送信される備忘通知は 11,294 行目辺りに記述されている。)
# su - mailman $ cd /usr/local/mailman/messages/ja/LC_MESSAGES $ vi mailman.po変更後、
$ ../../../bin/msgfmt.py -o mailman.mo mailman.poで変更を反映させ、mailman を再起動する。
$ ../../../bin/mailmanctl restart
今回、サーバーの移行とドメイン名の変更を行った。メーリングリストの全データは次の手順で引き継いだ。
移行元なお、templates ディレクトリ内のテキスト類も上書きされているので確認する。
$ su -
# cd /usr/local
# tar cvf mailman.tar mailman
移行先
$ su -
# /etc/init.d/mailman stop
# mv ./mailman.tar /usr/local
# tar xfv mailman.tar
# su mailman
$ cd /home/mailman/mailman-2.1.6b3
$ ./configure --with-cgi-gid=apache --with-mail-gid=mailman --with-python=/usr/local/bin/python2.2
$ make install
$ cd /usr/local/mailman
$ bin/check_perms -f
$ exit
# cd /usr/local/mailman
# ./bin/withlist -l -r fix_url リスト名 -v
# su mailman
$ vi /usr/local/mailman//Mailman/mm_cfg.py
$ su
# /etc/init.d/mailman start
新しいバージョンのパッケージがリリースされたら、次の手順でアップデートする。
というか、単純にオーバーライトすれば良い。
なお、この時 templates ディレクトリ内のテキスト類も上書きされるので、カスタマイズしてある場合には待避しておく。
# su - mailman問題なければ qrunner を再起動する。
$ wget http://mm.tkikuchi.net/mailman-2.1.8.tgz
$ tar xvzf mailman-2.1.8.tgz
$ cd mailman-2.1.8
$ ./configure --with-cgi-gid=apache --with-mail-gid=mailman --with-python=/usr/local/bin/python2.2
$ make install
$ cd /usr/local/mailman
$ bin/check_perms -f
$ bin/mailmanctl restart待避済の templates ディレクトリ内テキストがある場合には、再起動前に戻しておく。
Mailman のマスター qrunner を再起動します
メーリングリストの案内ページに管理者のメールアドレスがそのまま掲載されているため、最近 SPAM が多く届くようになった。確認してみるとメーリングリストのアドレスも不用心に掲載されている。対策が後手になってしまったが一応これらのアドレスを表示しないようにしておく。
まず、トップページに掲載されている mailman@ドメイン名 を隠す。
# su - mailman
$ cd /usr/local/mailman/Mailman/Cgi
$ vi listinfo.py
welcome.extend(
(_(''' To visit the general information page for an unadvertised list,
open a URL similar to this one, but with a '/' and the %(adj)s
list name appended.
<p>List administrators, you can visit '''),
Link(Utils.ScriptURL('admin'),
_('the list admin overview page')),
_(''' to find the management interface for your list.
<p>If you are having trouble using the lists, please contact '''),
Link('mailto:' + siteowner, siteowner),
'.<p>'))
下から2行目の行を削除してリンクを切る。ついでに最後の行のピリオドを取る。
welcome.extend(
(_(''' To visit the general information page for an unadvertised list,
open a URL similar to this one, but with a '/' and the %(adj)s
list name appended.
<p>List administrators, you can visit '''),
Link(Utils.ScriptURL('admin'),
_('the list admin overview page')),
_(''' to find the management interface for your list.
<p>If you are having trouble using the lists, please contact '''),
'<p>'))
このままだと文言の整合性が無くなるので次を書き換える。
$ cd /usr/local/mailman/messages/ja/LC_MESSAGES $ vi mailman.po msgid "" " to find the management interface for your list.\n" " <p>If you are having trouble using the lists, please contact " msgstr "" " で自分の管理ページを探してください.\n" "<p>リストの利用に関するトラブルは, 次の宛先に連絡してください: "内容は随意に。
msgid "" " to find the management interface for your list.\n" " <p>If you are having trouble using the lists, please contact " msgstr "" " で自分の管理ページを探してください.\n" "<p>リストの利用に関するトラブルは, サイト管理人に連絡してください: "言語ファイルを .mo ファイルに変換して変更を反映させる。
$ msgfmt -o mailman.mo mailman.po各メーリングリスト案内ページのリストアドレスへの mailto リンクをはずす。
<td colspan="2">
メーリングリストの全会員に送るメールは,
<A HREF="mailto:<MM-Posting-Addr>"><MM-Posting-Addr></A>
のアドレス宛に送信してください.
ここのリンクを削除する。
<td colspan="2">
メーリングリストの全会員に送るメールは,
<MM-Posting-Addr>
のアドレス宛に送信してください.
なお、/usr/local/mailman/templates/ja/listinfo.html が新規にリストを作成したときのテンプレートになっているのでこれも変更しておく。$ cd /usr/local/mailman/Mailman
$ vi HTMLFormatter.py
owner_link = Link('mailto:' + self.GetOwnerEmail(), ownertext).Format()
↓
owner_link = Link('http://www.sleepingbird.net/mail/cmfmail.cgi', ownertext).Format()