Shigeharu TAKENO <shige@iee.niit.ac.jp> writes:

> お尋ねしたいのですが、local の MTA が SMTP で remote の MX である
> メールサーバ host1 に接続してコード 421 で拒否された場合、もしそ
> の MX のセカンダリ host2 (preference 値が host1 より大きいもの) 
> があったとして、その後どう動作するのが MTA の正しい挙動なのでしょ
> うか。
> 
> [a] local のキューに入れ、後で host1 に再送を試みて、何回かやって
>   ダメならエラーメールとして送信元に返す
> [b] (必要ならば host1 への再送を試みた後で) host2 に送ろうとする
> [c] MTA の実装依存で、[a],[b] どちらが正しいとは決まっておらず、
>   どちらでもよい
> [d] [a],[b] どちらでもない

qmailの作者の解釈では[c]のようです。
http://cr.yp.to/im/remote.html には、

    The client can stop at any point in the list after the first
    address. (For example, most mailers will stop if an SMTP
    connection is established but then fails temporarily. Lotus Notes
    reportedly stops after two MX records in all cases.) This means
    that, if all of the lowest-distance hosts are persistently
    unreachable, there is no guarantee that mail will be delivered,
    even if there are reachable higher-distance hosts in the MX list.

とあります。また、http://qmail.jp/QA/implementation.html には

    Q: 優先度の低いMXホスト[Secondary MX]へメイルが送られませんでした。
    なぜですか。

    A: 優先度の高いMXホストの「SMTPポートへの接続に成功した」後は 途中
    で配送に失敗(4xx:一時的問題)しても、 ほかのホストへの配送は試みま
    せん。優先度の高いホストのSMTPポートに接続できなかったときは次の優
    先度のホストに 接続を試みますので、心配はありません。

とありますから、この振舞いについては良く知られているのでしょう。

一方RFC2821には、

    To provide reliable mail transmission, the SMTP client MUST be
    able to try (and retry) each of the relevant addresses in this
    list in order, until a delivery attempt succeeds.  However, there
    MAY also be a configurable limit on the number of alternate
    addresses that can be tried.  In any case, the SMTP client SHOULD
    try at least two addresses.

とあります(Section 5)。「until a delivery attempt succeeds」をDJBは
「SMTPで接続できるまで」と解釈しているのでしょうか。良く分かりません。

いずれにせよ、

> ・host1 は外部からのメールは拒否する内部向けメールサーバである
> ・外部からのメールは [b] となる挙動を期待している

この場合「421(あとでもう一度試みて)」という返答はおかしいですね。
フィルタで接続を拒否するべきでしょう。

しかも、外から送れないサーバをなぜMXで外に宣伝するのか...謎だ。

> そして、もう一件、qmail の挙動が [a] で、かつ他の MTA が [b] だと
> すると、qmail に [b] を行なわせるための設定等はあるのでしょうか。

qmail自体を改造しない限り無理でしょう。[b]の挙動はqmail-remote.c自体に
hard codeされています。

                                前田敦司