SVX日記
2010-06-21(Mon) 参上ッ!! Mailmanッ!!
ふと「Webブラウザから過去のメールを閲覧したい」という要求が生じた。実現の方法は、いろいろと考えられるだろうが、メーリングリストのアーカイブ機能を流用してしまうのがラクではないかと考え、Mailmanによる実現を試みることにした。
ま、それはさておき、MTAをSendmailからPostfixに変更するところから、ボチボチと始めていくのである。なお「MTAをSentmailからPostfixに変更する理由」については、決して聞くことのないようにお願いしたい所存である。
# yum install postfix
# cd /etc/postfix
# vi main.cf
# diff -bc main.cf.org main.cf
*** main.cf.org 2010-06-21 13:12:32.000000000 +0900
--- main.cf 2010-06-21 13:13:43.000000000 +0900
***************
*** 68,73 ****
--- 68,74 ----
#
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
+ myhostname = zakato.itline.jp
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
***************
*** 75,80 ****
--- 76,82 ----
# parameters.
#
#mydomain = domain.tld
+ mydomain = itline.jp
# SENDING MAIL
#
***************
*** 104,113 ****
#
# Note: you need to stop/start Postfix when this parameter changes.
#
! #inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
! inet_interfaces = localhost
# The proxy_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on by way of a
--- 106,115 ----
#
# Note: you need to stop/start Postfix when this parameter changes.
#
! inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
! #inet_interfaces = localhost
# The proxy_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on by way of a
以上、Postfixの基本設定の完了である。Sendmailを消してもいいが、以下のようにすれば消さずに切り替えることも可能である。Sendmailを落としてPostfixを上げる。自動起動についても確認しておく。
# update-alternatives --config mta
2 プログラムがあり 'mta' を提供します。
選択 コマンド
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.sendmail
2 /usr/sbin/sendmail.postfix
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
# service sendmail stop
# service postfix start
# chkconfig sendmail off
# chkconfig postfix on
# telnet zakato.itline.jp 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 zakato.itline.jp ESMTP Postfix
helo hoge
250 zakato.itline.jp
mail from: root@zakato.itline.jp
250 2.1.0 Ok
rcpt to: user1@zakato.itline.jp
250 2.1.5 Ok
data
354 End data with .
test1
.
250 2.0.0 Ok: queued as 70DA014DB99
quit
221 2.0.0 Bye
Connection closed by foreign host.
# tail /var/log/maillog
# tail /var/spool/mail/user1
# yum install mailman
さて、これから設定の手順に入る……んが、このページにアクセスされている状態でこんなこというのもナンではあるが、ヘンな野良サイトを見るマネする前に、オフィシャルなドキュメントや、manページを見るべきである。
というのも、通常「RPMパッケージ化されている物件」は、インストールするだけで動く、というのが基本であり、そうでない場合は、ディストリビューション(Red Hat)として「こう使うべき」というドキュメントが用意されているのが世の常なのである。
オープンソース物件は、コミュニティ提供の物件と、ディストリビュータ提供の物件とで性格が違う。ディストリビュータ提供の物件を利用する場合、極力、ディストリビュータの意向を汲んで動かすべきである。勝手にやるなら、ディストリビュータ提供の物件を利用する価値がない。
# rpm -ql mailman | grep -i redhat
/usr/share/doc/mailman-2.1.9/INSTALL.REDHAT
# /usr/share/doc/mailman-2.1.9/INSTALL.REDHAT
ほれ、あった。基本的にはこれを読みつつ設定を進めるのがよろしい。まずは、WebからMLを管理するための、Mailmanの設定ファイルを読み込ませるため、インストール直後にapacheを再起動すれ、とあるので、素直に従う。
# service httpd restart
# LANG=C /usr/lib64/mailman/bin/mmsitepass
New site password: mmpassword
Again to confirm password: mmpassword
Password changed.
# cd /usr/lib/mailman/Mailman
# cp mm_cfg.py mm_cfg.py.org
# vi mm_cfg.py
# diff -bc mm_cfg.py.org mm_cfg.py
*** mm_cfg.py.org 2010-06-21 14:23:09.000000000 +0900
--- mm_cfg.py 2010-06-21 14:26:25.000000000 +0900
***************
*** 78,85 ****
except:
fqdn = 'mm_cfg_has_unknown_host_domains'
! DEFAULT_URL_HOST = fqdn
! DEFAULT_EMAIL_HOST = fqdn
# Because we've overriden the virtual hosts above add_virtualhost
# MUST be called after they have been defined.
--- 78,85 ----
except:
fqdn = 'mm_cfg_has_unknown_host_domains'
! DEFAULT_URL_HOST = 'zakato.itline.jp'
! DEFAULT_EMAIL_HOST = 'zakato.itline.jp'
# Because we've overriden the virtual hosts above add_virtualhost
# MUST be called after they have been defined.
***************
*** 91,95 ****
--- 91,98 ----
# Put YOUR site-specific configuration below, in mm_cfg.py . #
# See Defaults.py for explanations of the values. #
+ DEFAULT_SERVER_LANGUAGE = 'ja'
+ MTA = 'Postfix'
+
# Note - if you're looking for something that is imported from mm_cfg, but you
# didn't find it above, it's probably in Defaults.py.
# LANG=C /usr/lib/mailman/bin/newlist mailman
Enter the email of the person running the list: user1@zakato.itline.jp
Initial mailman password: mmpassword
Hit enter to notify mailman owner...<Return>
# service mailman start
# tail /var/spool/mail/user1
# cd /etc/mailman
# chown mailman:mailman aliases*
# chmod 660 aliases.db
ここは、ディストリビューションとしてどうにかして欲しかったところである。上述の手順書にもロクな記載がない。どうも、Webから管理するための権限と、Mailmanとして動くための権限が衝突しているような感じだが、正直、よくわからん。
このヘンの権限の設定を誤っていると、メーリングリスト作成時、Webブラウザ上に「We're sorry, we hit a bug!」と表示され、内部のログに「/usr/sbin/postalias /etc/mailman/aliases」が失敗した、などと出たり、はたまた、メール投稿後に「Undelivered Mail Returned to Sender」としてメールが戻ってきて、その中に「Group mismatch error.」なんてエラーが記されている、などという状態に陥ったりするのようである。
チマタでは、これを解決するために、Mailmanをリコンパイルしろ、などというアドバイスが飛び出したりしているが、リコンパイルなんかしたら、なんのためのディストリビューションによるバイナリ物件の提供なのか、という話になる。
# cd /etc/postfix
# vi main.cf
# diff -bc main.cf.org main.cf
*** main.cf.org 2010-06-21 13:12:32.000000000 +0900
--- main.cf 2010-06-21 15:01:19.000000000 +0900
***************
*** 374,380 ****
# "postfix reload" to eliminate the delay.
#
#alias_maps = dbm:/etc/aliases
! alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
--- 376,382 ----
# "postfix reload" to eliminate the delay.
#
#alias_maps = dbm:/etc/aliases
! alias_maps = hash:/etc/aliases, hash:/etc/mailman/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
***************
*** 665,667 ****
--- 667,671 ----
# readme_directory: The location of the Postfix README files.
#
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
+
+ owner_request_special = no
# service postfix restart
新しいメーリング リストを作成する
リストの名前: arctest1
リスト管理者アドレスの初期設定: user1@zakato.itline.jp
初期パスワードを自動生成しますか? ●はい
リスト作成者の認証パスワード: mmpassword
[リストを作成する]
リストの管理ページへ行く
リスト管理者パスワード: [mmpassword]
[ログイン]
全体的オプション
件名の先頭に付ける語句 [<空白>]
投稿メール本文の最大サイズ(KB). 0 を設定すると無制限. [0]
[変更を送信する]
プライバシーオプション
送信者フィルタ
動作が定義されていない非会員からの投稿に対する動作. ●承認
[変更を送信する]
宛先フィルタ
投稿にはリスト名が宛先(to, cc) に含まれてい なければならないでしょうか? ●いいえ
投稿を認めるメールに含まれる受信者数の上限. [0]
[変更を送信する]
# telnet zakato.itline.jp 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 zakato.itline.jp ESMTP Postfix
helo hoge
250 zakato.itline.jp
mail from: root@zakato.itline.jp
250 2.1.0 Ok
rcpt to: arctest1@zakato.itline.jp
250 2.1.5 Ok
data
354 End data with .
test2
.
250 2.0.0 Ok: queued as 332CD14DBB6
quit
221 2.0.0 Bye
Connection closed by foreign host.
「リスト総合案内のページ」を経由して「arc1test 保存書庫」へ移動する。投稿したメールが確認できれば、一応の目的の達成である。あとは、メールのインポートスクリプト等を利用して、既存のアーカイブ対象メールをメーリングリストに流し込むだけである……。
なにがどうおかしいのかわからんが、サブジェクトが文字化けしてしまう。おまけに、スレッドの認識もいまひとつような気がする。そもそも、メールのDateを見ずに、投入日時でアーカイブするのが、どーにもこーにも気に食わん……。Malimanでアーカイブされているメーリングリストは多く、あまりトラブっている様子を見たことがないので、前者ふたつは工夫の余地があるのだろうが、最後のひとつはいかんともしがたい。
Pythonが読めればどうにかなるかもしれんが、そこで思いついてしまった。我がメーラMaveのライブラリを使えば、メールのアーカイバなんぞ、ちょいちょいと書けてしまうのではないか、ということに。実装ができれば、Maveの新たな機能としてウリを追加することもできる。