root へのメール

root には、いろいろと大事なメールが送られてくる。たとえば、logwatch は、1日1回、ログをざっとまとめた結果を root にメールしてくる。他にも、cron が実行したプロセスが出力した結果は root へのメールになる*1
ところが、この root へのメール、悲しいほどに放置されている。「su すると、なんかメールがどうのこうのとかいう変な英語のメッセージ出ますよねぇ?」とか言われてしまう始末だ。
cron に仕込んだ自慢のバックアップスクリプトが実は失敗していて動いていなかった、なんていう悲劇を防ぐためにも、root へのメールはちゃんと読むようにしよう。
その際、root でログインして mail コマンド、なんてことはしないでいい。root へのメールを適当なところに転送するようにすればいいのだ。具体的には、/etc/aliases にこう書く:

root: いつものメールアドレス

/etc/aliases を変更したときには newaliases コマンドを実行するのを忘れずに。

スマートホストを使ったメール配送

root へのメールをいつものメールアドレスに転送しようとしてもうまくいかないことがある。
最近は迷惑メールがひどいことになっているので、大概の MTA は、どこの馬の骨とも分からないホストからの SMTP 接続なんて受け入れてくれない。ISP による OP25B も一般的になったし、会社の LAN なんかだと組織外への IP 接続が許されていないのが普通だ。
でも、普段、MUA を使ってのメール送信は普通にできている。ISP なり LAN なりは、内部からのメール送信のために SMTP サーバを置いてくれているからだ。ならば、Linux マシンのローカル MTA も、この枠組みに加えてやればいい。要するに、すべてのメールを ISP や LAN の内部向け SMTP サーバに送信するようにローカル MTA を設定すればいいわけだ。HTTP でいうところのプロクシだが、SMTP の場合は「スマートホスト」と呼ぶらしい。
スマートホストを使うように Sendmail を設定するのは非常に簡単だ。/etc/mail/sendmail.mc にある以下の記述を書き換えればいい:

dnl define(`SMART_HOST', `your.isp.mail.server')

dnl」を削除してコメントアウトを解除し、「`your.isp.mail.server'」に自分のスマートホストを書く。書き換えたら、/etc/mail で make して sendmail サービスを再起動するのを忘れずに。

エンベロープの送信者欄を ISP 提供のメールアドレスにする

自宅に設置した Linux マシンの場合、ISPSMTP サーバをスマートホストに指定してもローカル MTA からのメール送信ができないことがある。
自分が適当につけたホスト名がエンベロープの送信者欄((fromsender のどちらが正しい用語なのか分からないので、「送信者欄」と書くことにした。))に書かれているため、ISPSMTP サーバにメールの受け取りを拒否されてしまうのだ。SMTP セッションで「MAIL FROM: ユーザ名@自分で適当につけたホスト名」を発行した直後、ISPSMTP サーバに「そんなホストは存在しない」と言われてセッションを切られてしまう。エンベロープの送信者欄はバウンスメールの送り先なので、ドメイン部分が DNS の MX レコードで引けないようなアドレスは拒否するのが親切なのだ。
自分のホスト名を DNS に登録するのはちょっと大変なので、エンベロープの送信者欄を ISP 提供のメールアドレスにすることで対処する。SendmailPostfix での設定方法はよく分からなかった((エンベロープの送信者欄だけを書き換えたいのだが、From: ヘッダも書き換わってしまう。多分、僕が設定方法を分かってないだけだと思う。))ので、Exim を使うことにしよう。
設定は実に簡単で、/etc/exim/exim.conf で「begin rewrite」の次にこう書くだけでいい:


*@自分で適当につけたホスト名 ISP提供のメールアドレス F
ちなみに、Exim でスマートホストを使うには、/etc/exim/exim.conf をこんな感じで書き換える:
変更前
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more
変更後
send_to_smart_host:
  driver = manualroute
  route_list = !+local_domains スマートホストのFQDN
  transport = remote_smtp

自分用のスマートホストを作る

エンベロープの書き換え設定は大した作業ではないが、sendmail.mc をちょろっと弄るのに比べるとかなり面倒くさい。何度もやらなくて済むよう、この書き換えをやってくれる SMTP サーバを自分用のスマートホストとして運用してみよう。
まず、LAN 内のどのマシンから送られてきたメールに対してもエンベロープの書き換えが行われるように、さっきのエンベロープ書き換え規則をちょっとアレンジする:

変更前
*@自分で適当につけたホスト名 ISP提供のメールアドレス F
変更後
*@*.自分で適当につけたドメイン ISP提供のメールアドレス F
続いて、LAN 内のホストからのメールをリレーするように以下を設定する:

hostlist relay_from_hosts = 127.0.0.1 : LAN内のIPアドレスパターン
LAN内のIPアドレスパターン」は、たとえば「192.168.0.0/24」のように指定する。
最後に 25/tcp を LAN 内のホストに対して開放すれば、設定は完了だ。
他のホストでは、この SMTP サーバをスマートホストに指定するだけでよくなる。ただし、sendmail.mc の SMART_HOST に指定する値は、DNS で解決できるホスト名でなければならないっぽい*2。IP アドレスでの指定や /etc/hosts で解決できるようにした名前ではダメなので注意しよう。

*1:一般ユーザの cron ジョブの場合は、そのユーザにメールされる。

*2:きちんと調べたわけではないが、僕のところではそうだった。