Linux上のsendmailの設定に関する顛末

 大それた「マニュアル」を公開するつもりは全く無いのですが、 Webで調べながら試行錯誤で設定していて、 あまりにも断片的で中途半端な情報ばっかりだったので、 後続諸氏の参考になればと思って報告する次第です。

筆者の個人的環境条件

 筆者は別稿でも 述べたような確たる意図に基づいて 「unix系OS上の原始的なメール環境」を使っています。 そして、メール受信環境については、 別稿のような自作環境です。

 一方、メール発信環境については、 単純にsendmailのコマンドモード(非デーモンモード)を使っています。 これは、かつて所属の公式メールサーバであった機械を常用環境としているため、 その当時の設定を微調整すれば問題なく使えたからです。 「NEWS-OS Rel.6」という古い環境ですが、 ファイヤーウォールの中で、純然たるクライアントとして使う分には 問題無いだろうという判断です。

 しかし、この機械もいつ壊れるか予測不能なので、 入手容易な代替環境であるLinuxで同様の環境を整備してみよう と思い立った次第です。

本稿の前提条件

 Windows NTベースのデータベースサーバに使っていた機械の ハードウェアだけを使い回し、 元のOSを完全に潰してLinuxをインストールしました。 「RedHat Linux 9 Publisher's Edition」というやや古い環境ですが、 ファイヤーウォールの中で、純然たるクライアントとして使う分には 問題無いだろうという判断です。 unix系のテキスト処理環境を駆使するのが目的なので、 X等のグラフィック環境は一切排除してインストールしてあります。 ワードプロセッサ処理やグラフィック処理等は Windows環境でないと同僚との互換性が確保できないので、 そちらからtelnetクライアントで入ることによって マルチウィンドウ環境を確保するのが得策ということもあります。

 「発信したい全てのメールを、 特定のメールサーバへ有無を言わせず転送させること」を目標にしています。 ローカルメールを能動的に出すことはありません。 もちろん、諸デーモンが出すメールは存在するわけですが、 そういうメールの宛先アドレスには「@」が入っていません。 一方、筆者が発信したいメールの宛先アドレスには全て「@」が入りますし、 「@」の後に自分自身を示すホスト名が入ることはない (自分自身が属するドメイン名が来ることはある)ので、 要するにsendmailが「自マシン自身あて」でないと判断したら 全て特定のメールサーバへ丸投げしてくれれば良いわけです。

 なお、発信操作は今のところ/bin/mailで行っています。 sendmail.cfに記述されている自分自身のバージョンは8.12.8です。

まずやってみたこと

 /etc/mailディレクトリ内にあったsendmail.mcとsubmit.mcから sendmail.cfとsubmit.cfに相当するファイルをm4で再生成し、 現に使っているものと冒頭の生成履歴記録を除いて一致することを確認しました。

 そのうえで、*.mcをいろいろ試行錯誤的に書き換えて、 *.cfを再生成しながら状況を確認しました。

 とりあえず、sendmail.mcの

define(`SMART_HOST',`smtp.your.provider')dnl
を設定して有効化するだけで、メールは目的のサーバに飛びました。 しかし、これではエラーメールが正しく返って来ないハズです。 リターンアドレスが「ユーザ名@localhost.localdomain」になってしまうからです。 この問題は、
MASQUERADE_AS(`mydomain.com')dnl
を設定して有効化し、
FEATURE(masquerade_envelope)dnl
を有効化することで対処できました。

 他に、

LOCAL_DOMAIN(`localhost.localdomain')dnl
を書き換えるとか、
FEATURE(`nodns')dnl
FEATURE(`nocanonify')dnl
define(`confDONT_EXPAND_CNAMES', `True')dnl
を設定するとか、sendmail.mcではなくsubmit.mcの方の
define(`confDIRECT_SUBMISSION_MODIFIERS',`C')
を有効化するとかいうのを勧めているページがありましたが、 とりあえず現時点では、筆者は、その必要は無いと思っています。 いくつかは試してみましたが、見ている範囲では何も変わらないので、 どういう副作用があるか予測できないため元に戻してあります。

 とまあ、ここまでは、ちょっとWebを検索すれば 簡単に解決したのですが、ここからがちょっと大変でした。 このことが、この文書を公開しようと思い立った動機です。

苦労したこと……自ホスト名の認識

 以上でメールは目的のところへ無事に飛ぶようになったのですが、 Message-Id:やReceived:の内容がどうにも拙いのです。 Message-Id:は最後が「@localhost.localdomain>」で終わるし、

Received: from localhost.localdomain 
        by localhost.localdomain (8.12.8/8.12.8) with ESMTP
なんていう冗談のようなヘッダになっています。 要するに、発信環境のsendmailが自ホスト名を全く認識できていないってことです。

 NEWS-OSで使っている古いsendmail.cfを眺めてみると、 「Dj」の記述で無理矢理認識させることができそうです。 この方法を試してみたら、巧く行く場合があったという報告もありました。 そこで、sendmail.cfとsubmit.cfの中の

#Dj$w.Foo.COM
とあるところを、
Dj自ホストのFQDN
に書き換えたら巧く行きました。 しかし、この方法だと、*.mcの方を書き換えて*.cfを再生成すると、 設定が消えてしまいます。

 いろいろ調べているうちに、*.mcの方に

define(`confDOMAIN_NAME', `$w.$m')dnl
と書いている例を発見しました。これだと、
Dj$w.$m
の記述が生成されます。しかし、これではダメでした。 直前に手動で
Dw自ホスト名
Dm自ドメイン
と書け足せば巧く行くのですが、これでは意味がありません。 そこで、これを応用して、*.mcに
define(`confDOMAIN_NAME', `自ホストのFQDN')dnl
としたところ、巧く解決しました。

補足情報

 似たようなことを試みたものの、 中途半端にしか巧く行かないという報告を見掛けましたが、 どうもこの方はsendmail.*しか調整していないのではないかと思われます。 後半のMessage-Id:やReceived:の問題を解決するには、 sendmail.*とsubmit.*の両方に同様の処置が必要なようです。 特にMessage-Id:については、専らsubmit.*が利くようです。


2007年5月19日初稿/2014年1月23日ホスト移転

戸田孝の雑学資料室へ戻る

Copyright © 2007 by TODA, Takashi