【CentOS - Linux】

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]にきちんとメールが配信されるようにするには、どうすればいいでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/07/27 18:24:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント100pt

そこで、

/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 が含まれている場合、考えられるのは

  • hostname が example.com
  • /etc/mail/sednmail.mc の LOCAL_DOMAIN に指定
  • /etc/mail/local-host-names に 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 がローカル扱いから外す方向での原因究明を優先させた方が良いと思います。

id:keijiro

とても、ご丁寧な回答、ありがとうございます。

 

試してみましたが、結論から言えば、ダメでした。(現状と変わらず)

 

試した内容ですが、まず、

========================================

ウェブサーバ[1] の HOSTNAME を www.example.com にして、example.com でも Web サーバへアクセス出来るように、DNS 上で example.com の A レコードにウェブサーバの IP アドレスを指定する(もしくは example.com と www.example.com の間で、どっちかを他方の CNAME とする)

========================================

これは、もともと、この内容で設定しておりました。

DNSは、外部のサービス(つまり、今回の2台とは別サーバ)を使用しており、

⇒ example.comのAレコードと*.example.comのCNAMEをウェブサーバ[1]のIPアドレスに向けています

⇒ example.comのMXレコードをメールサーバ[2](Gmail)に向けています

 

次に、

========================================

LOCAL_RELAY の設定

========================================

LOCAL_RELAYをよく知らなかったので、検索したのですが、情報が少なく、良く分からなかったので、なにもしなかったのです。

sendmail-8.13.1-6を使用していまして、/etc/mail/sendmail.mcには、LOCAL_RELAYの記述が(コメントアウトも含む)ありませんでした。

 

ちなみに、/etc/mail/sendmail.mcで、

LOCAL_DOMAIN(`www.example.com')dnl

を記述しています。

 

また、/etc/mail/local-host-namesにも、

www.example.com

を記述しています。

 

 

ここで、/etc/sysconfig/networkのHOSTNAME欄に、wwwをつけてみようと、試みました。

HOSTNAME=www.example.com

 

結果、やはり、

(略)relay=[127.0.0.1] [127.0.0.1], dsn=5.1.1, stat=User unknown

となって、ローカルに配信を試みているようでした。

 

※別ドメインへの配信は正常に動いています。

※PHPのプログラムは、PEAR_Mailを使用し、ローカルのsendmailに送っています。

 

【追記】

ご丁寧に、ありがとうございます。

========================================

$=w

========================================

知りませんでした。

おかげで、色んな実験をしながら、結果的には成功しました。

 

まず、

/etc/sysconfig/network

のHOSTNAME欄に

www.example.com

を書いて、

/etc/hostsに

10.11.12.13 www.example.com

を書いて再起動しました。

 

これで、ウェブサーバ[1]のメールフォームから、メールサーバ[2]にメールが届きました。

 

原因がはっきりしないままですが、お陰様で解決いたしました。

ありがとうございます。

2011/07/27 18:23:46
  • id:JULY
    回答に追記しました。

    そういえば、MAIL_HUB や LOCAL_RELAY を使って別の MTA へ送ろうとすると、エンベロープの宛先アドレスのドメインパートが、指定した MTA の FQDN(もしくは IP アドレス)に置き換わってしまって、受ける側の MTA によっては、これはこれで問題になる事があったなぁ。

    やっぱり、example.com が自分宛てでないと判断されるようにする方が良さそう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません