ローカルメールサーバーのセットアップ

このweblogは長年自宅サーバーのMovableTypeで運用しているが、これまでメール通知の設定をしていなかった。従って、コメントがあってもメール通知されず、自らMovableTypeの管理画面を開かないと気付かなかった。

メール通知の設定をしなかったのは、その為にはMovableTypeが稼働するサーバーにメールサーバーを立ち上げる必要があり、セキュリティに自信が無かったからである。システムのどこかに欠陥が発生して、24時間、宅外に大量のメールを発信し続けてしまうような事態は絶対に発生させたくないのである。

しかし、コメントを頂いたのに気付かず、1週間くらい承認待ちのままだったことが何度かあり、その度に、やっぱりメールサーバーを立ち上げようかと思ったのだが、以前はコメントもトラックバックもSPAMの嵐だったので、メール通知しても紛れてわからないので無駄だと思った。

その後、ほとんどのSPAMがブロックできるようになったが、コメントもトラックバックも1通も届かない日が増えると油断するようになり、昨年夏にも1度、5日ほど未承認のコメントに気付かないことがあった。
それ以来、毎日確認するようにしているが、それが面倒になってきたので、やっぱりメールサーバーを立ち上げてメール通知の設定をすることにした。


メールサーバーのプログラムは、安全上の理由でSendmailを避け、Postfixを選択した。
POP3サーバーは、慣れ親しんだqpopperがDebianに見つからなかったので、Dovecotを選択した。安全で導入が簡単な、定番の組み合わせである。

その他に、メールサーバーの仕様として、次のように決めた。
・宅外にはリレーしない
・宅内でサーバーからPOP3で取り出す
・サーバー内の全てのアカウント宛のメールをPOP3で取り出せるようにする


以下、実際に行ったことを記す。

■Postfixのセットアップ
1. aptitudeで"postfix"を選択してインストール実行

2. Postfix Configurationの画面で
No configuration
Internet Site
Internet with smarthost
Satellite system
Local only
の中から"Local only"を選択

3. サービス起動時に

warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol
と出た(IPv6の準備はしていないから)ので、/etc/postfix/main.cfに
inet_protocols = ipv4
を追加

4. 念の為、

inet_interfaces = loopback-only
relayhost =
であることを確認


■Dovecotのセットアップ
1. aptitudeで"dovecot-pop3d"を選択してインストール実行

2. 途中、

Error: socket() failed: Address family not supported by protocol
というエラーになり(これもこのサーバーがIPv6に非対応だから)、aptitude上で"C"(= Half-configured)マークが付いたので、/etc/dovecot/dovecot.confに
listen = *
を追加して、aptitudeでそのまま(gを2回押して)再実行

3. LAN内のPCからメール受信すると、

pop3(user01): Error: file_dotlock_create(/var/mail/user01) failed: Permission denied (euid=1001(user01) egid=100(users) missing +w perm: /var/mail, we're not in group 8(mail), dir owned by 0:8 mode=0775) (set mail_privileged_group=mail)
というエラーが出て、受信したメールが/var/spool/mail/から消えなかったので、/etc/dovecot/conf.d/10-mail.confに
mail_privileged_group = mail
を追加


■全ての宛先のメールを特定のアカウントに転送する設定
Dovecotのデフォルト設定では、uidが500以上のアカウントしか受け付けないようになっており、しかもrootでのログインは一切受け付けないようになっている(/etc/dovecot/conf.d/10-mail.confのfirst_valid_uidの説明を参照)ので、root宛のメールも取り出したければ、root宛のメールを別のアカウントに転送するしかない。

1. /etc/postfix/main.cfに

virtual_alias_maps = regexp:/etc/postfix/virtual
を追加

2. /etc/postfix/virtualを次の内容で作成

/.+@.+/ user01
(postmap /etc/postfix/virtualは省略)

3. Postfixを再起動

Perlの正規表現しか覚えていない身としては、virtual_alias_mapsのregexp:pcre:にしたかったが、postfix-pcreというパッケージを別途インストールする必要があるので、諦めた。
※pcre = perl compatible regular expression

なお、Webで検索すると、virtual_alias_mapsを設定するのではなく、

luser_relay = user01
local_recipient_maps =
とすれば良いという情報がいくつもあるが、それだと実在のアカウントのメールが転送されなかった。
筆者の環境では他にも設定が必要なのかも知れない(これだけだとlocal_recipient_mapsがキャンセルされないのかも)が、深追いしなかった。


■MovableTypeのメールアドレス変更
プロバイダーのメールアドレスを設定していたので、ローカルサーバーのメールアドレスに変更する必要があったが、設定したメールアドレスが、MovableTypeの管理画面のシステム・メニューにもシステム全体の設定画面にも各ブログの設定画面にも見当たらず、CGIのスクリプトやmt-staticの中をgrepしても見当たらなかったので、結構難儀してしまった。

ネットでキャプチャー画面付きの説明を見つけてやっと、MovableTypeの管理画面の「現在のログイン名:」の横のユーザー名をクリックすれば出てくることがわかった。


メールサーバーを立てたら、色々なアカウントにcronの実行結果が届くようになって、システム構成やスクリプトの不備やcronの設定誤りがわかって、色々直した。
やっぱりローカルメールサーバーは立てておくべきだったと反省した。