James君!〜他のMTAと協調するには?

3つの方法論

さて、前のページなぞは、「こんなん誰でも書けるじゃん!」程度のものだ。今からが本番である。

今からの話題は通常の MTA と James とをどう協調させるか?というやり方の話である。言い替えると、通常の MTA が受け取ったメールを、James がゲットするにはどうすればイイのか??という話だな、これ。でこれには言うまでもなく3通りのやり方が考えられる。

  1. その MTA が受け取ったメールを James に向けて送り出す
  2. James の側で MTA まで取りにいく
  3. fetchmail を使って、外部経由で MTA から取得して James に流す

で、実をいうと一番簡単なのは「3. fetchmail を使う」だ。まあ、これは簡単な上に、「2.James の側で MTA まで取りにいく」が実際には「FetchMail みたいな機能」なので、そっちと併せて説明した方がいい。というわけでまず最初は「MTA が James に向けて送り出す」である。

まあ、最近では MTA もかつてのような sendmail の覇権はオシマイになり、Postfix や qmail で運用されているケースが増えてきている。で、一応ドキュメントに「Apache Jakarta James - Sendmail integration - Java Mail and News server, SMTP POP3 NNTP」(docs/james_and_sendamil.html)があり、これの翻訳もあったりするので、sendmail についての説明はなしだ(自分の環境に今なかったりするし...)。その代わり Postfix と qmail でどうやるのか?を説明していく。

まず今からすることの仕様をまとめておこう。

  1. 通常の MTA が SMTP でメールを受け取る。
  2. 受け取ったメールがローカルユーザ宛の場合には、通常のローカル配信をする。
  3. 宛先がローカルユーザではない場合には、同じホストの 1025 番ポートで待ち受けている James の SMTP に対して、受け取ったメールを流す。

というわけだ。ここで問題なのは、この処理がSMTPの手順どおりにメールを「出し直す」、いわゆる「フォワード」ではない、ということである。まあ、内部で使う別なドメイン名を決めて、DNS サーバにちょこっと細工してそれ用の MX レコードを作ってやれば、いわゆる「フォワード」でもこの転送処理は可能だ。まあ、だけどこのためにわざわざ DNS サーバを立てる、というのも重装備すぎる。ここでのポイントは「MXレコードを参照せずに、IP固定ホスト(ここではlocalhost)のSMTPポート(ここでは1025)に受け取ったメールを流す」という処理の可能性である。まあ、これはたとえば、IMAP サーバを立てることにして、そこに MTA が受け取ったメールを「お任せする」ケースの変形のようなものだ。

実際、これはやろうと思えば出来る。とはいえ、設定はなかなか面倒だ。それを解説する。

Postfixの場合

Postfix の場合、ここらへんの処理を設定するのは /etc/postfix/main.cf だ。Postfix の「ローカルに存在しないアカウント宛メールの処理」を決めるのは「fallback_transport」というディレクティブである。だから、main.cf を次のように変更をする。

# もし宛先がローカルにない場合には、SMTP で転送
fallback_transport = smtp
# 具体的な転送の記述は /etc/postfix/transport にある
transport_maps = hash:/etc/postfix/transport
# 必ずしもローカルユーザのみを受け取るだけではない
local_recipient_maps = 

ここでは、「どのユーザをどこに転送するのか?」というのは、/etc/postfix/transport に書く、という風にしてある。まあ、このファイルはデフォルトだとコメントばっかり...のファイルだが、読むと「どう書けばイイのか?」はきっちり書いてあるので参考になる。要するに、

# 例
# (略)
# 以下の例では、すべての foo.org とそのサブドメイン宛メールは、
# gateway.foo.org ホストに送られる。
# 
#             foo.org      :[gateway.foo.org]
#             .foo.org     :[gateway.foo.org]
# 
# 上の例で、[] はMXレコードを参照するのを抑止する。その結果、
# ローカルなマシンに送ることができるようになる。
# 
# このケースでは、配送は SMTP で行われ、「ホスト名:サービス」をただの
# 「ホスト:」だけの代わりとしてつかうと...
# 
#             foo.org      smtp:bar.org:2025
# 
# user@foo.org のメールは、bar.org というホストの 2025番ポートに向けて
# 転送される。ポートの番号ではなく、シンボルの名前を使ってもよい。ホスト
# 名を囲む [ ] は MX レコードの参照を抑止するためのものである。

使えるね、これ。だから /etc/postfix/transport への記述内容は次の通りだ。

info@mydomain.jp    smtp:[127.0.0.1]:1025
james@mydomain.jp   smtp:[127.0.0.1]:1025
必要なだけアカウントを並べてやればよし

で、transport は効率のために、コンパイルして使うことになっているので、次のコマンドを実行すると、/etc/postfix/transport がコンパイルされて、/etc/postfix/transport.db が出来る。これでOKだ。

# cd /etc/postfix
# postmap /etc/postfix/transport

qmailの場合

qmail の場合は残念ながら、こういう器用なことはできないようである...残念だが仕方がない。次節で説明する /usr/sbin/fetchmail かJames の FetchMail 機能を使ってくれ。



copyright by K.Sugiura, 1996-2006