example.comというドメインを運用しているとします。
サーバは、二つあって、
片方は、ウェブサーバ[1]で、
もう片方は、メールサーバ[2](Gmail)です。
ウェブサーバ[1]のメールフォームから、メールサーバ[2]にメールを送っても、届きません。
ログを見るとUser Unknownなので、ウェブサーバ[1]からウェブサーバ[1]自身にメールを送ったけど、ユーザが居なかったんだと思います。
そこで、
/etc/sysconfig/network
HOSTNAME=example.com
の行を
HOSTNAME=localhost.localdomain
に変更しました。
再起動し、これで、ウェブサーバ[1]のメールフォームから、メールサーバ[2]にメールが届くようになりました。
ただ、ウェブサーバ[1]のメールフォームから、別のドメインにメールを送ると、localhost.localdomainから送られているからスパムだと判別されているようです。
localhost.localdomainを使わず、メールサーバ[2]にきちんとメールが配信されるようにするには、どうすればいいでしょうか?
そこで、
/etc/sysconfig/network
HOSTNAME=example.com
の行を
HOSTNAME=localhost.localdomain
に変更しました。
再起動し、これで、ウェブサーバ[1]のメールフォームから、メールサーバ[2]にメールが届くようになりました。
ウェブサーバ[1] の HOSTNAME を www.example.com にして、example.com でも Web サーバへアクセス出来るように、DNS 上で example.com の A レコードにウェブサーバの IP アドレスを指定する(もしくは example.com と www.example.com の間で、どっちかを他方の CNAME とする)、というケースが一般的だと思います。であれば、ウェブサーバ[1]の MTA(おそらく、sendmail か postfix)も、~@example.com 宛のメールを自分宛のメールとしては扱わないはずです。
どうしても、www.example.com という名前にするのがイヤであれば、ウェブサーバ[1]上で動いている MTA が何かによって、設定が変わってきます。
sendmail であれば、/etc/mail/sendmail.mc で LOCAL_RELAY の設定をしたのち、/etc/mail 上で make を実行して sendmail.cf を生成、postfix であれば /etc/postfix/main.cf の relay_domains と relay_transport の設定、という方向になります。
その他にも sendmail であれば /etc/mail/local-host-names はどうなっているか、とか、postfix だと mydestination はどうなっているのか、など、確認する必要があるポイントがあります。
...ところで、
ウェブサーバ[1]のメールフォームから、メールサーバ[2]にメールを送っても、届きません。
おそらく、このメールフォームからの送信の際に、おそらく、ウェブサーバ[1]上の sendmail プログラムを呼び出す格好になっているのだと思いますが、そのメールフォームで送信する所の処理(CGI なのか、PHP なのか分かりませんが)で、直接、メールサーバへの SMTP(もしくは Submission)での送信が出来れば、「メールフォームからの送信」に限れば、HOSTNAME がどうだ、sendmail の設定がどうだ、という話にはなりません。
メールフォーム以外にも、このウェブサーバ[1]から送信するメールがあるのであれば、先の sendmail や postfix の設定の話が出てきますが、メールフォームからの送信に限れば、CGI や PHP のプログラム次第で、直接、メールサーバ[2]へ送信できる可能性があります。
追記:
sendmail なんですね。
であれば、まず、sendmail のテストモードを使って、sendmail が自分宛として扱う物を確認します。
# sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > $=w www [10.11.12.13] localhost.localdomain localhost www.example.com >/quit #
$=w で sendmai が自分宛として扱うドメイン名が列挙されます。恐らくはここに、example.com が入っている物と思われます。もし、ここに example.com が無ければ、別の原因を考える必要があります。
もし、example.com が含まれている場合、考えられるのは
のいずれかです。ちょっと気になったのは、
ここで、/etc/sysconfig/networkのHOSTNAME欄に、wwwをつけてみようと、試みました。
この /etc/sysconfig/network の設定が有効になるのは、OS を再起動するか、service network restart とする必要になります。sendmail が認識するのは hostname コマンドを実行した時の結果です。もし、hostname コマンドを実行して、その結果が example.com のままでしたら、再起動か service network restart を行って、もう一度確認して下さい。
もし、$=w に example.com が含まれていない場合...。ちょっと原因が分からないのですが、もし、SMART_HOST が設定されていて、それが自分自身だとか...。あるいは、フォームからのメールの宛先が、実は ~@www.example.com になっているとか...。
$=w の確認で紹介した sendmail のテストモードを使って、指定したアドレスがどのように処理されるかを見ることができます。
# sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > /parse xyz@example.com Cracked address = $g Parsing envelope recipient address canonify input: xyz @ example . com Canonify2 input: xyz < @ example . com > ........ final input: xyz < @ example . com . > final returns: xyz @ example . com mailer esmtp, host example.com., user xyz@example.com >/quit #
もし、本当に xyz@example.com 宛のメールが sendmail の処理でローカル扱いになっているのであれば、最後の行が「mailer local, user xyz」といった感じになるはずです。もし、これでローカル扱いになっていないのであれば、そもそも宛先がどうなっているかを確認した方が良いと思います。
余談:
LOCAL_RELAY を使う話ですが、意図としては、ローカル配信宛と判断された物を、無理やり、別のサーバへ送ろう、というものです。同様の動きをするものに MAIL_HUB というのもあって、今回の場合だと、MAIL_HUB の方が適切な気がしてきました。これに stickyhost の話が加わると複雑怪奇になるので、この方法は余り、これ以上追求せずに、example.com がローカル扱いから外す方向での原因究明を優先させた方が良いと思います。
そういえば、MAIL_HUB や LOCAL_RELAY を使って別の MTA へ送ろうとすると、エンベロープの宛先アドレスのドメインパートが、指定した MTA の FQDN(もしくは IP アドレス)に置き換わってしまって、受ける側の MTA によっては、これはこれで問題になる事があったなぁ。
やっぱり、example.com が自分宛てでないと判断されるようにする方が良さそう。