14.電子メ−ルの仕組みと使い方
       
 14-1. 電子メ−ル設定の基本

  (1) メ−ル配送の仕組み
     
   * 基本

    メ−ル配送は郵便の配送に似ている。郵便は中央郵便局から地域の郵便局へ、そして各家
    に届けられる。メ−ルが届けられる過程をみると、中央郵便局であるメ−ルサ−バから地
    域の郵便局の各ホストに来て、そして各家のユ−ザに届けられる。メ−ルサ−バは、メ−
    ルをどこのホストに送ればいいか知っていて、各ホストではどのユ−ザに送るのか知って
    いなければならない。これら配送を制御するために、一般的には sendmail というデ−モ
    ンと sendmail.cf という制御ファイルを使う。それにインタ−ネットの世界では、 メ−
    ルの宛先の検索に DNS を使う。sendmail、sendmail.cf、DNS の組み合わせでメ−ル配送
    が実現されている。しかし、後で読み返したところこの説明はあまりよくない。この文書
    を書いた時、イメ−ジしていた中央郵便局は、ロ−カルなネットワ−クの中でのメ−ルサ
    −バである。地域の郵便局は各ユ−ザが使用するEWSで、クライアントとしてsendmail 
    が稼働している。各家のユ−ザとは、そのEWSホストのマルチユ−ザとしてのそれぞれ
    のユ−ザのことである。

    インタ−ネットには実は、中央郵便局に相当するものは存在しない。あるのは全て地域郵
    便局である。ただし先の説明の地域郵便局とは意味が異なり、その組織のメ−ルの窓口と
    してのメ−ルサ−バである。地域郵便局をインタ−ネットにおいて識別するのがドメイン
    名である。そしてドメイン名に対応するそのメ−ルサ−バのホストのIPアドレスが最終
    的な識別子ということになる。このドメイン名からIPアドレスへの対応を検索するのが 
    DNS という訳である。

    EWSでは sendmail はメ−ルサ−バ、メ−ルクライアントのホストで稼働させる必要が
    ある。サ−バとクライアントの区別は、sendmail.cf の制御ファイルの記述で区別される。
    sendmail.cf は極めて複雑なフォ−マットで、理解することはほとんどできないと思った
    方がいい。 本書では、少しの変更でどのEWSでも使える万能 sendmail.cf を用意した。
    EWSでメ−ルを読み書きするには、メ−ルクライアントのソフトの mail、ucb mail と
    言ったコマンドをかつては用いた。その後GUIで使えるソフト、INDY では Zmail と言
    ったのも出て来るようになった。これらはメ−ルを送るのは SMTP、 受けるのも SMTP で
    直接配送ができる。Windows の DOS/V パソコンや Macintosh では、メ−ルのやりとりが
    何とかできるようになったのは、1996年頃からである。メ−ルを送るのはSMTP、受け
    るのは POP という方法を使う。 POP ではユ−ザがメ−ルサ−バまで来たメ−ルを自分で
    取りに行くことになる。詳しくは "15-2. POPサ−バの設定" を見られたい。


    [設定の手順]

        1. DNS の MX レコ−ドの設定
        2. メ−ルサ−バとクライアントの sendmail.cf の設定
        3. メ−ルサ−バでの aliases ファイルの記述
        4. メ−ル配送先EWSでのユ−ザ passwd の登録
        5. POP サ−バ、クライアントの設定


   * 用語の定義

    メ−ルの集配収するホストを、先にメ−ルサ−バと呼んだ。これにはさまざまな呼び方が
    されている。雑誌等ではメ−ルホストをよく使っているみたいである。しかし本書ではメ
    −ルクライアントに対するサ−バという意味で、メ−ルサ−バを使うことにする。よって
    単なる電子メ−ルのクライアントでないものは、すべて総称してメ−ルサ−バと呼ぶ。メ
    −ルサ−バの中で、インタ−ネットの接続口にあたるものを特にメ−ルゲ−トウェイとも
    呼ぶことにする。メ−ルリレ−は、最終的にメ−ルをクライアントに配送しない中継サ−
    バである。ただし単にメ−ルリレ−といった場合は、メ−ルゲ−トウェイのこととする。

        メ−ルサ−バ:メ−ルホスト、メ−ルエクスチェンジャ−、
                      メ−ルリレ−やメ−ルリレ−ホスト、メ−ルゲ−トウェイ

    下の図で hostA には外部からの電子メ−ルがいったん入り、すぐ hostB に転送するとし
    よう。hostB は内部ネットのメ−ルクライアントの hostC などに配送する。 hostC が外
    部に電子メ−ルを送る場合は、この逆で hostB に送り、hostB から hostA に行き、イン
    タ−ネットに出ていくことになる。この場合 hostA と hostB はそれぞれメ−ルを中継す
    るだけだがら、メ−ルリレ−としての機能も持っていることになる。


Fig. e11

   * sendmail.cf 作成の変遷   `23/05

    1996年当時、トッパン刊の「インタ−ネット構築入門」を元に万能 sendmail.cfなる
    ものを自作した。その当時、すでにWIDEプロジェクトの sendmail.cfを作成するフリ
    −ソフト、CF ツ−ルがあったかどうかは知らない。ともかく、いつの間にか国内では CF 
    ツ−ルを用いるのが当り前になり、SPAMメ−ルも対応して行った。万能 sendmail.cf 
    はSPAMにまで対応させるのは、小生の力量として難しかった。その後1998年9月 
    CF-3.7Wpl2 で、CF の開発およびメンテナンスは止まり、sendmail 8.10.0 以降に対応し
    ないことになった。ただし、ユ−ザ認証や暗号化機能を使わないのであれば、使うことは
    まだできる。そして今日では、sendmail 自体に入っている sendmail.cf 作成ツ−ル、cf
    と呼ばれるのを用いるのが通例となっていく模様である。その後そうなりました。


   * 直接相手メ−ルサ−バにメ−ルを送る  `24/05

    通常のメ−ルサ−バは sendmail や qmail といったソフトで複雑な動きをし、 かなり設
    定も難しい。 それがばかちょんで設定できる Windows OS用のメ−ルサ−バのソフトと
    いうのがある。ざっと調べたところ MELON, Neon, easmtp, Radish, melon とたくさんあ
    る。これらのソフトは Windows に常駐して SMTP サ−バとしてメ−ルを待ち受ける。 同
    じパソコンにあるメ−ルソフトを使い、メ−ルソフトの設定を SMTP サ−バをロ−カルに
    向け、メ−ルを送る。すると常駐しているこうしたソフトがメ−ルを受け、相手先のメ−
    ルサ−バを DNS で検索し、 相手先 SMTP サ−バへ直接に接続してメ−ルを送る動きをす
    る。ここでは、Portable SMTP サ−バ Radish というのを試してみた。サッポロソフト開
    発工場が作成したフリ−ソフトである、http://homepage2.nifty.com/spw/。 親切なログ
    が出て、メ−ル送信に際して何をやっているかよく分かる。

    Radish の最新バ−ジョンは 2004/05/03 リリ−スの Version 3.0.0-b026 で、SMTP,POP3,
    DNS サ−バの機能がある。精力的にバ−ジョンアップしているもよう。しかしバ−ジョン
    3は機能が豊富になっている分、設定がややこしい。DNS の指定は付属の named.ca ファ
    イルで行うようになっている。 これはインタ−ネットの DNS のル−トファイルそのもの
    である。バ−ジョン2では DNS の指定は、 画面の項目にIPアドレスを入れることによ
    る。その方が分かりやすいので、Version 2.2.8 をダウンロ−ドした。圧縮ファイルを展
    開して、できた Radish.exe をクリックすると5つのファイルができた。Windows 画面右
    下のタスクトレイに "だいこん" のアイコンが出る。これをクリックして[表示]->[設定]
    で {●指定があるまで送信しない}、{メ−ル保存場所} c:\my documents\katou\radish\、
    {プライマリDNS} 202.241.128.3、そして {〆デバッグモ−ド} と設定した。

    同じパソコンの Netscape Messenger からメ−ルを東海インタ−ネットの自分宛にメ−ル
    を送ってみる。Netscape Messenger の送信メ−ル(SMTP)サ−バは [ 127.0.0.1 ] にして
    である。すると次の Radish では、c:\my documents\katou\radish\mail_00000 にメ−ル
    のメッセ−ジが一時的に置かれる。 Radish の [メ−ルボックス]->[すべて送信] をクリ
    ックすると、以下のログの "メールファイルの処理を開始します" から実行されて相手メ
    −ルサ−バにメ−ルが行く。 Radish で "受信したら直ちに送信" にチェックを入れてお
    けば、すぐにメ−ルは行く。そうそう Radish.exe をクリックしても、何も画面が現われ
    なかった。Windows 画面タスクトレイの "だいこん" のアイコンは、パソコンを終了させ
    ると同時に消える。再起動すると出て来ない。常駐させるにはどうしたらいいのかな?。


    [ デバッグモ−ドにして出たログ ]

    メールの受信を開始しました。                    ログには日付と時刻が付いていたが
    Message-ID: <40A1CA92.E1AFD95B@nix.co.jj>       紙面の都合、取った。直ちに処理さ
    Date: Wed, 12 May 2004 15:56:19 +0900           せれば、全処理ものの数秒で終わる。
    From: =?iso-2022-jp?B?GyRCJCskSCQmGyhC?= 
    X-Mailer: Mozilla 4.78 [ja] (Win98; U)
    X-Accept-Language: ja                           パソコンは Windows 98 を使用した。
    MIME-Version: 1.0                               Radishのバ−ジョン3でもやってみ
    To: ikken@tcp-ip.or.jj                          たと。ログ出力は何段階かあって詳
    Subject: test                                   細ログにしたところ、ログのメッセ
    Content-Type: text/plain; charset=iso-2022-jp   −ジは英語で、かなり一杯でてきた。
    Content-Transfer-Encoding: 7bit
    
    katou
    
    .
    受信完了 [FROM:katou@nix.co.jj TO:ikken@tcp-ip.or.jj FILE:c:\my documents\kat...
    メールファイルの処理を開始します。[FILE:c:\my documents\katou\radish\mail_00000]
    アドレスの検索を開始します。[DOMAIN:tcp-ip.or.jj]
    DNSサーバとの接続を開始します [DNS:202.241.128.3]
    DNSサーバと接続しました。[DNS:202.241.128.3]
    DNSサーバから データを検索しました。 [10] mailgw.tcp-net.ad.jj 157.14.7.8
    MX 検索結果 優先順位[1] 157.14.7.8
    メールを送信します。[FROM:katou@nix.co.jj TO:ikken@tcp-ip.or.jj ADDR:157.14.7.8] 
    メールサーバとの接続を開始します [ADDR:157.14.7.8]
    メールサーバと接続しました。 [ADDR:157.14.7.8]
    R:220 mailgw.tcp-net.ad.jj ESMTP
    S:HELO Radish
    R:250 mailgw.tcp-net.ad.jj
    S:MAIL From:
    R:250 ok
    S:RCPT TO:
    R:250 ok
    S:Received: from nix.co.jj ([127.0.0.1]) by Radish(2.2.8) with SMTP; Wed, 12 May
    S:Message-ID: <40A1CA92.E1AFD95B@nix.co.jj>                  2004 15:56:19 +0900
    S:Date: Wed, 12 May 2004 15:56:19 +0900
    S:From: =?iso-2022-jp?B?GyRCJCskSCQmGyhC?= 
    S:X-Mailer: Mozilla 4.78 [ja] (Win98; U)
    S:X-Accept-Language: ja
    S:MIME-Version: 1.0
    S:To: ikken@tcp-ip.or.jj
    S:Subject: test
    S:Content-Type: text/plain; charset=iso-2022-jp
    S:Content-Transfer-Encoding: 7bit
    S:
    S:katou
    S:
    S:.
    R:250 ok 1084348173 qp 14637
    S:QUIT
    送信完了 [FROM:katou@nix.co.jj TO:ikken@tcp-ip.or.jj]


  (2) sendmail.cf について

   * sendmail.cf 自動作成プログラム

    sendmail.cf ファイルの作成、記述は電子メ−ルをセットアップするには避けて通れない。
    しかしこれ程やっかいな代物はない。 少し前までなら mailconf という sendmail.cf 作
    成プログラムが使えたが、これは DNS に対応していないのでもう使えない。 DNS 対応の
    sendmail プログラムは、今では CF-3.3 を使うことになっている。 これで sendmail R8
    の V5 フォ−マットや R5 の V1 フォ−マットが作成できることになっている。詳しくは
   「UNIX MAGAZINE」'94/05、P.32〜 "電子メ−ルの応用(2)" を参照のこと。


   * 万能 sendmail.cf 

    しかし sendmail.cf ファイルは色々なEWSのものと見較べると、 ほとんど同じである。
    そこで違いを探し、どのEWSでも共通な sendmail.cf  を作成しようと考えていた。同
    じことを考えた人がいて、米 Texas Internet Consulting 社 が書いた「インタ−ネット
    接続」(株)トッパン刊に掲載されていた。sendmail.cf はその会社の ftpサイトにある。
    ftp.tic.com/pub/cf.pn.tar.gz。ここに m4 ファイルという形式で書かれている。またこ
    の本ではメ−ルサ−バ用、メ−ルクライアント用などと、 それぞれの sendmail.cf に分
    けて書かれていた。そこでこれらの sendmail.cf を少し修正し、万能 sendmail.cf ファ
    イルを作ってみた。


   * m4 マクロファイルの使い方

    m4 マクロというのは、簡単に言えばC言語の include と全く同じ。ソ−スを展開して挿
    入するだけのことである。sendmail.cf はややこしいけど、部分的には共通なところがあ
    るので、include 風に記述したわけである。非常にエレガントなやり方である。下手に自
    動作成プログラムを使うより、はるかにスマ−トだし、理解するにも役立つ。

        tcp.m4              nnn.m4
        ----------------    ---------------
        |heno heno mohe     |KONNITIWA
        |katoukun desu      |
                            |include(tcp.m4)  << tcp.m4 ファイルを挿入するだけのこと。
                                                 m4 プログラムが無ければ、手作業でや
        $ /usr/bin/m4 nnn.m4 > nnn.cf            ってしまう。

        nnn.cf
        -------------------
        |KONNITIWA
        |
        |heno heno mohe
        |katoukun desu


   * sendmail.cf の読み方のポイント
        
    [ 例1 ]

    ----------------------------
    |DDnix.co.jj    << ホストのドメイン名。
    |DMtcp          << SMTP でメ−ルを転送する。
    |   |
    |CS cad gear    << C はクラス定義を表わす。S というクラスがト−クン cad, gear を
    |   |                                                                       もつ。
    |R$*<@$=S.$D>$*  $#$M  $@mail_relay.$2.$D  $:$1<@$2.$D>$3  << ル−ルセット

        $+              1個以上のト−クン              大文字、小文字は区別しない。
        $-              ちょうど1個のト−クン
        $*              0個以上のト−クン
        $=class_name    クラスの値に1つマッチする

    $=S は cad, gear とマッチしているか調べていることになる。 結局 R$*<@$=S.$D>$* は
    katou@cad.nix.co.jj や haruo@gear.nix.co.jj といった文字列になっているかどうか調
    べている。

    [ 例2 ]

    /etc/aliases
    ----------------------------
    |katou:katou@hostA.nix.co.jj     

    ----------------------------
    |DDnix.co.jj
    |   |
    |R$*<@$-.$D>$*   $#$M $@$2.$D  $:$1<@$2.$D>$3    [a]
    |R$*<@$+>$*      $#$M $@$2     $:$1<@$2>$3       [b]

     1) このような状況で katou 宛に電子メ−ルを送ると、エイリアス展開されて [a] のと
        ころでは katou@hostA.nix.co.jj となって入ってくる。ちょうど [a] の左のル−ル
        セットにマッチするので、それに続く評価がされ sendmail.cf を抜けることになる。

                         SMTP で配送
                           ↓
          R$*<@$-.$D>$*   $#$M $@$2.$D   $:$1<@$2.$D>$3
                ↑               ↑       ↑   ↑
        katou@hostA.nix.co.jj   hostA   katou  hostA   $3 は何もなし。
                               配送先の   配送先の電子メ−ルアドレス
                               ホスト名

     2) 外部宛の電子メ−ル、 例えば hanako@iij.ad.jj は [a] のル−ルにマッチしないの
        で、下に降りてきて [b] のル−ルにマッチするかチェックする。 R$*<@$+>$* の $+
        は1個以上のト−クンなので、マッチする。

          R$*<@$+>$*      $#$M $@$2    $:$1<@$2>$3        
                ↑               ↑      ↑   ↑
        hanako@iij.ad.jj    iij.ad.jj  hanako iij.ad.jj
                            
        $@$2 は配送先のドメイン名となる。iij.ad.jj の DNS にアクセスして MX レコ−ド
        を調べ、iij.ad.jj のメ−ルサ−バのIPアドレスを得る。そしてそのメ−ルサ−バ
        に SMTP で電子メ−ルを送る。iij.ad.jj のメ−ルサ−バはこの電子メ−ルを受ける
        と、自前の sendmail.cf により該当ユ−ザにメ−ルを配送することになる。


  (3) 万能 sendmail.cf ファイル

   * サブドメイン対応の万能 sendmail.cf

    米 Texas Internet Consulting 社の sendmail.cf を元に作成したのが以下である。先ず
    は UUCP をはサポ−トしないため、UUCP に関係する部分を削除した。 それで動作は確認
    した。しかしまだ uucp と bitnet という文字が残っている。もう少し整理できるはずで
    ある。UUCP はまだインタ−ネットがIP接続する以前に、 普通の電話回線で電子メ−ル
    や Net-News をバケツ・リレ−式で転送し合っていた時の、Unix-to-Unix Copy というプ
    ロトコルである。現在でもまだ一部残ってはいる。 BITNET はインタ−ネットとは違って
    大学や研究機関が独自に形成していたコンピュ−タ・ネットワ−クの1つである。それに
    インタ−ネットと相互接続するため sendmail.cf に書かれているのである。 もうBITNET
    の記述も無くても問題ないだろう。以下は付録では sendmail.cf.txt である。 空白がタ
    ブ・コ−ドであったりするので、下記をそのまま sendmail.cf としても動かない。


    ####################################################################
    #   万能 sendmail.cf ファイル  [ made by katou refered to tic.om ]
    #
    #   Apollo SR10.4, SunOS 4.1.2-JLE, 4.1.4-JLE, Solaris 2.5.1,
    #   INDY IRIX 5.3 で使用を確認。uucp のメ−ル配送はサポ−トしない。
    #------------------------------------------------------------------
    #   Dj$w.$D 部は注意が必要。hostname が FQDN の場合はこのまま。
    #   hostname が FQDN でない場合は Dj$w とする。sendmail-8.8.x を
    #   使う場合は FQDN 関係なく Dj$w とすること。
    ####################################################################
    DVnix.1.0
    #
    # [ 共通、ドメイン名が nix.co.jj の例 ]
    #
    DDnix.co.jj     << ホストのドメイン名。
    Dj$w.$D         << $w は /etc/hostname を拾ってくる。ここの $w 部分
                       はホスト名(マシン名+ドメイン名)を期待している。
    DMtcp           << SMTP でメ−ルを転送する。
     
    # [ メ−ルクライアント用 ]
    #
    # メ−ルサ−バ名が host1 とした例。local_names はファイルで、メ−ル
    # を受けるユ−ザ名を記入する。サブドメインのあるなしは関係しない。
    #
    #FL/etc/local_names
    #DRhost1.$D
    
    # macros
    De$j Sendmail $v/$V ready at $b
    DlFrom $g  $d
    DnMailer-Daemon
    Do.:%@!^=/[]|
    Dq$g$?x ($x)$.
    # options
    
    # INDY
    #OA/etc/aliases
    #OF660
    #OH/etc/sendmail.hf
    #OL9                    << syslog へのログ出力レベル。
    #OQ/var/spool/mqueue       通常はこのレベルでよい。
    #OS/var/sendmail.st
    
    # Apollo
    OA/usr/lib/aliases
    OF660
    OH/usr/lib/sendmail.hf
    OL9
    OQ/usr/spool/mqueue
    OS/usr/lib/sendmail.st
    
    # SunOS 4.1.x
    #OA/etc/aliases
    #OF660
    #OH/usr/lib/sendmail.hf
    #OL9
    #OQ/usr/spool/mqueue
    #OS/etc/sendmail.st

    # Solaris 2.5.1
    #OA/etc/mail/aliases
    #OF0600
    #OH/etc/mail/sendmail.hf
    #OL9
    #OQ/var/spool/mqueue
    #OS/etc/mail/sendmail.st

    OT14d                   << 相手のメ−ルサ−バが止まっていたりした場
    Odbackground               合、メ−ルを再送し続ける期間。14d は14
    Og1                        日間ということである。
    Oo
    Or15m
    Os
    Ou1
    Pfirst-class=0
    Pspecial-delivery=100
    Pjunk=-100
    T root daemon uucp
    # header definition
    H?P?Return-Path: <$g>
    HReceived: $?sfrom $s $.by $j ($v/$V)
        id $i; $b
    H?D?Resent-Date: $a
    H?D?Date: $a
    H?F?Resent-From: $q
    H?F?From: $q
    H?x?Full-Name: $x
    HSubject:
    H?M?Resent-Message-Id: <$t.$i@$j>
    H?M?Message-Id: <$t.$i@$j>
    HErrors-To:

    S1
    S2

    S3
    R<>             $@@
    R$*<$+>$*       $2

    R@$+,$+:$+      @$1:$2:$3
    R@$+:$+         $@<@$[$1$]>:$2
    R$+:$*;@$+      $@$1:$2;@$3
    
    R$+@$+          $:$1<@$2>
    R$+<$+@$+>      $1$2<@$3>
    R$+<@$*.$=Z>    $@$1<@$2.$3>
    R$+<@$+>        $@$1<@$[$2$]>
    
    R$-!$+          $@$2<@$1.uucp>
    R$-.$+!$+       $@$3<@$1.$2>
    R$+%$+          $@$>3$1@$2
    
    S4
    R$+<@$+.uucp>   $2!$1         \  
    R$+             $: $>9 $1      | これだけがル−ルセット4の範囲。
    R$*<$+>$*       $1$2$3        /

    S9
    R@              $@$n
    R<@$+>$*:$+:$+  <@$1>$2,$3:$4

    S29
    R$*             $: $>3 $1
    R$*             $@ $>0 $1
    
    CZ uucp bitnet      << 多分これも削ることができる。Z というクラスはこれ以下では
                           使われていないため。
    # -----------------------------------------------------------
    #   これ以外のEWSまたは、うまく働かない場合は、それぞれの
    #   EWSの sendmail.cf のサンプルを見て、記述すること。
    # -----------------------------------------------------------
    #
    # SunOS & tic.com original
    #Mlocal, P=/bin/mail, F=rlsDFMmnP, S=10, R=20, A=mail -d $u
    #Mprog,  P=/bin/sh,   F=lsDFMeuP,  S=10, R=20, A=sh -c $u
    
    # Apollo 
    #Mlocal, P=/bin/mail, F=rlsDFMmn,  S=10, R=20, A=mail -d $u
    #Mprog,  P=/bin/sh,   F=lsDFMe,    S=10, R=20, A=sh -c $u
    
    # INDY
    Mlocal,  P=/bin/mail, F=EDFMlsmhu, S=10, R=20, A=mail -s -d $u
    Mprog,   P=/bin/sh,   F=lsDFMe,    S=10, R=20, A=sh -c $u

    # Solaris
    #Mlocal, P=/usr/lib/mail.local, F=flsSDFMmnP, S=10, R=20, A=mail.local -d $u
    #Mprog,  P=/bin/sh,   F=lsDFMeuP,  S=10, R=20, A=sh -c $u

    S10
    S20

    # -----------------------------------------------------------
    #   ここもおなじく。多分 F=CDFMXmu のとこが違ってくるだけ。
    # -----------------------------------------------------------
    #
    # Apollo original
    #Mtcp, P=[IPC], F=CDFMXmu,   S=22, R=22, E=\r\n,  A=IPC $h
    # SunOS 4.1.x original
    #Mtcp, P=[IPC], F=msDFMuCX,  S=22, R=22, A=IPC $h
    # Solaris original
    #Mtcp, P=[IPC], F=msDFMuCX,  S=22, R=22, A=IPC $h, E=\r\n

    # INDY original ( Apollo, SunOS, INDY 全てOK, Solaris もいいと思う )
    Mtcp,  P=[IPC], F=msDFMhuXC, S=22, R=22, A=IPC $h, E=\r\n

    S22
    R$*<@$+>$*      $@$1<@$2>$3
    R$+             $@$1<@$D>
    
    S0
    R@              $?R $#$M $@$R $:$n $|#local $:$n $.
    R<@[$+]>:$*     $:$>9 <@[$1]>:$2
    R<@[$+]>:$*     $#$M $@[$1] $:$2
    R<@[$+]>,$*     $#$M $@[$1] $:$2

    R$*<@[$+]>      $#$M $@[$2] $:$1
    R$*<@$j>$*      $1<@>$2
    R$*<@$=U.uucp>$*    $1<@>$3
    R$*<@$D>$*      $1<@>$2
    R$*<$*.>$*      $1<$2>$3
    R<@>:$*         $@$>29$1
    R$*<@>          $@$>29$1
    # 元は $j だが、Dj$w.$D の場合 local の配送ができない。$w に変更する。
    #R$*<@$j>		$@$>29$1
    R$*<@$w>        $@$>29$1
    R<@$j>:$+       $@$>29$1

    R$*             $:$>9 $1
    # ==========================================================
    #   以下の 1 から 4 のうちどれかのコメントを外して使うこと。
    #
    #       注.ここはタブでなければならない。
    #             ↓
    #  R$*<@$+>$*   $#$M $@$2 $:$1<@$2>$3
    #                 ↑   ↑        ↑
    #             $#メイラ $@配送先 $:宛先
    # ==========================================================
    #
    # [ 1. メインドメインのメ−ルサ−バ用 ]
    #
    # nix.co.jj に cad という sub domain があり、そのメ−ルサ−バ名が
    # host1 とした例。sub domain が幾つかある場合は、同じように追加する。
    # sub domain が無い場合は、ここは記述しない。
    # 
    #R$*<@$=cad.$D>$*   $#$M $@host1.$2.$D $:$1<@$2.$D>$3
    #
    # ここからは 3. 単体ドメイン と同じ。
    #R$*<@$-.$D>$*  $#$M $@$2.$D $:$1<@$2.$D>$3
    #R$*<@$+>$*     $#$M $@$2 $:$1<@$2>$3
    #R$+%$+         $@$>29$1@$2
    #R$+            $#local $:$1

    # [ 2. サブドメインのメ−ルサ−バ用 ]
    #
    # メインドメインのメ−ルサ−バ名が host1 とした例。2行目に記入。
    #
    #R$*<@$-.$D>$*  $#$M $@$2.$D $:$1<@$2.$D>$3
    #R$*<@$+>$*     $#$M $@host1.$D $:$1<@$2>$3
    #R$+%$+         $@$>29$1@$2
    #R$+            $#local $:$1

    # [ 3. 単体ドメインのメ−ルサ−バ用 ]
    #
    R$*<@$-.$D>$*   $#$M $@$2.$D $:$1<@$2.$D>$3
    R$*<@$+>$*      $#$M $@$2 $:$1<@$2>$3       
    R$+%$+          $@$>29$1@$2
    R$+             $#local $:$1            << 上記までのル−ルにマッチしないのは
                                               自ホスト宛のメ−ルである。
    # [ 4. メ−ルクライアント用 ]
    #
    # サブドメインのあるなしは関係しない。
    #
    #R$=L           $#local $:$1
    #R$+            $#$M $@$R $:$1

  
   * メ−ルリレ−専用の万能 sendmail.cf

    メ−ルリレ−のホスト、メ−ルサ−バのホスト、 クライアント用の sendmail.cf である。
    サブドメインは対応しない。付録では sendmail.cf.relay.txt である。 本書で設定する
    万能 sendmail.cf はこちらを使っている。

    DVnix.1.0
        |       ここまでは上記と同じ
    # -----------------------------------------------------------
    # メ−ルゲ−トウェイのホスト用は、この間コメントにする。
    # ル−ルセット0が効かないようにするため。
    # -----------------------------------------------------------
    #R$*<@[$+]>     $#$M $@[$2] $:$1
    #R$*<@$j>$*     $1<@>$2             
    #R$*<@$=U.uucp>$*   $1<@>$3
    #R$*<@$D>$*     $1<@>$2
    #R$*<$*.>$*     $1<$2>$3
    #R<@>:$*        $@$>29$1
    #R$*<@>         $@$>29$1
    #R$*<@$w>       $@$>29$1
    #R<@$j>:$+      $@$>29$1
    
    R$*             $:$>9 $1
    # ==========================================================
    #   以下の 1 から 3 のうちどれかのコメントを外して使うこと。
    # ==========================================================
    # [ 1. メ−ルゲ−トウェイのホスト用 ]
    # hostB はメ−ルリレ−先のメ−ルサ−バのホストである。
    # hostB をドメイン指定する場合は $@hostB.$D とする。
    #
    R$*<@$D>        $#$M $@hostB $:$1<@$D>
    R$*<@$+.$D>     $#$M $@hostB $:$1<@$D>
    R$*<@$+>$*      $#$M $@$2 $:$1<@$2>$3
    R$+%$+          $@$>29$1@$2
    R$+             $#local $:$1
    
    # [ 2. メ−ルサ−バのホスト用 ]
    # hostG はメ−ルゲ−トウェイのホスト名。
    # R$*<@$+.$D>$*	$#$M $@$2 $:$1<@$2.$D>$3  初めこれだった。
    #
    #R$*<@$-.$D>$*  $#$M $@$2.$D $:$1<@$2.$D>$3     << 内部ネットのメ−ル配送用。
    #R$*<@$+>$*     $#$M $@hostG $:$1<@$2>$3        << メ−ルゲ−トウェイにリレ−。
    #R$+%$+         $@$>29$1@$2
    #R$+            $#local $:$1
    
    # [ 3. メ−ルクライアント用 ]
    #R$=L           $#local $:$1
    #R$+            $#$M $@$R $:$1


  (4) DNS による電子メ−ル配送の仕組み  '96

   * DNS での配送
    
    自ドメインのメ−ルサ−バ(正確にはメ−ルゲ−トウェイ)がどれか、named.hosts の中
    で MX レコ−ドでもって指定する。下の例では nix.co.jjドメインのホストへの電子メ−
    ルは、hostA.nix.co.jj ホストで稼働しているメ−ルサ−バに送ることになる。sendmail 
    は DNS に問い合わせて、MX レコ−ドを見て SMTP で配送するIPアドレスを得る。宛先
    がマシン名も含んでいて、DNS に該当する A レコ−ドがある場合は直接送る。

        /etc/named.hosts
        -------------------------------------
        |nix.co.jj. IN MX 0  hostA.nix.co.jj.   << 指定のポイント。

                                     SMTP     メ−ルキュ−
                          mqueue/   ------>    mqueue/ 
                            ↑                   ↓          スプ−ル
    % mail yosi@hostB  → sendmail            sendmail → mail/yosi
                           ↓↑                 ↓↑            ↑
                        sendmail.cf          sendmail.cf      mail コマンドで
                         -------                -------       電子メ−ルを読む
                         |hostA|                |hostB|   
                         -------                ------- 

   * DNS の完全な記述

    /etc/named.hosts
    --------------------------------------------------------------
    |@          IN  SOA hostA.nix.co.jj. katou.hostA.nix.co.jj. (
    |                   1996040101 3600 300 3600000 360000 ) 
    |           IN  NS    hostA.nix.co.jj.
    |           IN  MX 0  hostB.nix.co.jj.  << メ−ルサ−バ
    |localhost. IN  A  127.0.0.1
    |hostA      IN  A  192.9.200.1
    |hostB      IN  A  192.9.200.2  << メ−ルサ−バのIPアドレスも記入すること。
                                        
    ※ MX 0 hostB.nix.co.jj. の 0 のところの値は、予備のメ−ルサ−バを設ける場合に使
       用される。メ−ルサ−バが1個の場合は、数字としては 0 以上なら何でも構わない。


   * マシン名とホスト名の注意

    sendmail.cf の変更      
    ------------------
    |#DDnix.co.jj
    |#Dj$w.$D
    |Dj$w           << $w は hostname コマンドで定義された名前を拾ってくる。

           hostname     | sendmail.cf       
       -----------------|--------------     hostname がドメインを含まないホスト名だ
        hostA           |   Dj$w.$D         けの場合は、Dj$w.nix.co.jj と記述するか、
        hostA.nix.co.jj |   Dj$w            Dj$w.$D と記述する。
                    

  (5) ドメイン構成によるメ−ルサ−バの設定

   * 単一ドメインの場合

    ホスト hostA,B,C では sendmail デ−モンを稼働させる。 hostA ではメ−ルサ−バ用の
    sendmail.cf を、hostB,hostC ではメ−ルクラインアント用の sendmail.cf をおく。

        ユ−ザ taro         jiro         hana               
             -------       -------      ------- DNS  
             |hostC|       |hostB|      |hostA| hostA,B,C のメ−ルサ−バ
             -------       -------      ------- 
                |             |            |
            ---------------------------------------- nix.co.jj
            sendmail     sendmail      sednmail
            sendmail.cf  sendmail.cf   sendmail.cf
            resolv.conf  resolv.conf   resolv.conf & named

    
    hostA /etc/named.hosts
    ---------------------------------------
    |ホスト A,B,C を管理する。
    |
    | ドメイン               ホスト
    |nix.co.jj.  IN MX 10  hostA.nix.co.jj.     << 電子メ−ルを管理するホスト。

   
    メ−ルサ−バ hostA sendmail.cf
    -------------------------------------------
    |DDnix.co.jj         << ホストのドメイン名。
    |Dj$w                << ホストのホスト名、hostname コマンドで得られる名前。
    |DMtcp               << SMTP でメ−ルを転送する。
    |   |
    |R$*<@$-.$D>$*  $#$M $@$2.$D $:$1<@$2.$D>$3 
    |R$*<@$+>$*     $#$M $@$2    $:$1<@$2>$3    
    |R$+%$+         $@$>29$1@$2
    |R$+            $#local $:$1               

                                               
    メ−ルクライント hostB,C の sendmail.cf
    -------------------------------------------
    |DDnix.co.jj
    |FL/etc/local_name   << /etc/local_name も設定すること。
    |Dj$w
    |DMtcp
    |DRhostA.$D          << メ−ルサ−バのドメイン名。
    |   |
    |R$=L    $#local $:$1
    |R$+     $#$M $@$R $:$1      


    [ メ−ルの別名処理 ]

    ホストが A,B,C とあれば、メ−ルは katou@hostA.nix.co.jj, yasu@hostB.nix.co.jj の
    ようにマシン名を付けて送ることになる。マシン名をつけずに katou@nix.co.jj  という
    アドレスでメ−ルを送るようにするために、メ−ルの別名処理を行う。nix.co.jj 内のべ
    つのクライアントにメ−ルを送ってもメ−ルサ−バを通り、この別名処理を受けることに
    なる。/etc/aliases ファイルをいじったら、newaliases コマンドを実行しておくこと。
    
    /etc/aliases                    
    --------------------------      ※ メ−ルサ−バは "別名リスト" を管理すること
    |hana:hana@hostA.nix.co.jj      
    |jiro:jiro@hostB.nix.co.jj      
    |taro:taro@hostC.nix.co.jj


   * サブドメインがある場合
                            
      hostB □    hostA □ DNS,メ−ルサ−バ  
            |          |            
        --------------------------------- ドメイン a
               |                       
               |  hostD □     hostC □ DNS,メ−ルサ−バ
               |        |           |
        --------------------------------- サブドメイン b.a

    hostA /etc/named.hosts
    ---------------------------
    |a.     IN NS hostA.a.
    |b.a.   IN NS hostC.b.a.        
    |                                   xxx@b.a 宛のメ−ルはサブドメイン b.a でメ
    |a.     IN MX 10 hostA.a.           −ルを管理している hostC.b.a に送ってくれ。
    |b.a.   IN MX 10 hostC.b.a.    

    hostA sendmail.cf
    ------------------------------------
    |DDa  
    |Dj$w
    |DMtcp
    |CS b              << 追加。サブドメイン b があることと示す。
    |   |                  
    |R$*<@$=S.$D>$* $#$M $@hostC.$2.$D $:$1<@$2.$D>$3   << hostC の所に注意。
    |R$*<@$-.$D>$*  $#$M $@$2.$D $:$1<@$2.$D>$3
    |R$*<@$+>$*     $#$M $@$2    $:$1<@$2>$3   
    |R$+%$+         $@$>29$1@$2
    |R$+            $#local $:$1            


    hostC /etc/named.hosts
    ---------------------------
    |a.     IN MX 10 hostA.a.
    |b.a.   IN MX 10 hostC.b.a.

    hostC sendmail.cf
    ------------------------------------
    |DDb.a   
    |Dj$w
    |DO hostA.a
    |DMtcp
    |   |
    |R$*<@$-.$D>$*  $#$M $@$2.$D  $:$1<@$2.$D>$3   
    |R$*<@$+>$*     $#$M $@$O  $:$1<@$2>$3    << 宛先がわからないのは hostA.a に送る。
    |R$+%$+         $@$>29$1@$2                        
    |R$+            $#local  $:$1          


   * サブドメインに予備のメ−ルサ−バがある場合

    サブドメイン b.a のホストに電子メ−ルを送るのに、先ず hostC.b.a に送り、ダメなら
    hostD.b.a に送るという設定。hostD が予備のメ−ルサ−バである。

      hostB □    hostA □ DNS,メ−ルサ−バ  
            |          |            
        --------------------------------- ドメイン a
               |                       
               |  hostD □予備  hostC □ DNS,メ−ルサ−バ
               |        |            |
        --------------------------------- サブドメイン b.a

    hostA /etc/named.hosts
    ---------------------------
    |a.     IN NS hostA.a.
    |b.a.   IN NS hostC.b.a.        
    |a.     IN MX 10 hostA.a.      
    |
    |b.a.   IN MX 10 hostC.b.a.     << ここ追加。10,20 というのは優先を決める。
    |b.a.   IN MX 20 hostD.b.a.        値が小さい方が優先度が高い。0 が一番高い。


    [ 単一ドメイン内でも同じ ]

    メ−ルサ−バの予備を持つ場合の DNS の設定は、 特にサブドメインでなくとも単一ドメ
    インでも同じことである。MX レコ−ドを2つ設定する。 しかしメ−ル・クライントのソ
    フトで、2つのメ−ルサ−バを指定できるか、その方が問題である。通常の hostC.b.aが
    止まって、手動で予備の hostD.b.a を指定し直す。 一般ユ−ザ全員にそんな操作をして
    もらうのは現実的でない。Windows パソコンではメ−ル・クライントは POP だが、 そも
    そも2つメ−ルサ−バを指定することはできない。