"Data format error" でメール送信が拒否される場合 (CentOS 5.5)


"Data format error" で送信できない

あるサーバーから mail コマンドでメールを送信してみたところ、メールが正しく届く気配がありませんでした。

構成としては、送信元のサーバーでは Sendmail が稼働していて、そこでは REMOTE_HOST で別の Sendmail で運用されたリレーサーバーへメールをリレーして、さらにそこから REMOTE_HOST で目的のメールサーバーへメールをリレーするという少し複雑なメールの流れになっていました。

リレー先のサーバーでは、自ドメインのメールを担っていて、送信元のメールサーバーでも自ドメインのアドレスを送信元アドレスとしてメールを送信していました。

どうやらそれが、今回のメールが送信できない原因となっていたようです。

 

まず、送信元のメールサーバーのログを確認してみたのですが、次のような感じで問題なく送信元の Sendmail では正しく受理されているようでした。

to=<username@domain.xxx.xx.jp>, ctladdr=<root@my.domain.xxx.xx.jp> (0/0), delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=120351, relay=[192.168.0.2] [192.168.0.2], dsn=2.0.0, stat=Sent (oBI1Frwf007114 Message accepted for delivery)

ただ、このメールサーバーで、mail コマンドを実行した時の "username" アカウントに送信元のドメイン "my.domain.xxx.xx.jp" が付与されたあと、それを "domain.xxx.xx.jp" に置き換える形で "username@domain.xxx.xx.jp" を送信元として次のリレーサーバーに送っています。

そして、次のリレーサーバーのログを確認してみると、次のような不達を示すと思われるログを確認することができました。

from=<username@domain.xxx.xx.jp>, size=549, class=0, nrcpts=1, msgid=<201012180116.oBI1GN1S031819@my.domain.xxx.xx.jp>, proto=ESMTP, daemon=MSA, relay=[192.168.0.100]

to=<username@domain.xxx.xx.jp>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, priri=31794, relay=smtp.domain.xxx.xx.jp, dsn=5.3.0, stat=User unknown

return to sender: User unknown

ここで、最終到達先のメールサーバー "smtp.domain.xxx.xx.jp" で "User unknown" という結果が返されているような感じが伺えました。

ただ、送信先として指定されている "username@domain.xxx.xx.jp" は、最終到達先のメールサーバーに存在しているアドレスで、外部メールサーバーからは正しくメールを受け取ることができているため、これが "User unknown" と判断されてしまうことは考えにくいところでした。

 

そこで、もしかしたらと、送信元としてメールアドレスについても注目してみることにしました。

今回、ローカルネットワークから mail コマンドを使用して送ったメールには、最終到達先で運用しているドメインの送信元が設定されています。

ただ、もともとは送信元のメールサーバー上に存在するアカウント名 "username" に対して、送信の過程で運用ドメイン "domain.xxx.xx.jp" を付与した形になっていて、最終到達先ではそのアドレス "username@domain.xxx.xx.jp" に該当するメールボックスが存在していませんでした。

そこで仮に、そのメールアドレスを最終到達先のメールサーバーに登録してみたところ、問題なくメールが到着するようになったようでした。

 

送信元を見て "User Unknown" と判断するというのは、これまで考えもしなかったのですけど、これはこれであってもおかしくはない仕様ですね。

これを踏まえて、ローカルアカウントを MASQUERADE_AS するときには、必ず置き換え後の送信元メールアドレスが存在するように、送信元や送信先のメールサーバーで調整してあげるのがよさそうです。

REMOTE_HOST のように無条件でリレーするような構造の場合には、実在するドメインである必要はなくて、例えば送信元で "hostname.localmail" というドメインに MASQUERADE_AS するように設定しておいて、リレー先のサーバーでは "hostname.localmail" を "local-host-names" に登録した上で、"virtusertable" で "@hostname.localmail" を任意のアカウントへ振り分けるなどしておくという方法もありそうでした。

こうしておけば、ローカルシステムから送信されたメールが、送信元アドレス "username@hostname.localmail" が "User Unknown" であるという理由で届かないということはなくなってくると思います。