PHPのmail
機能は、管理者やWebマスターによる明らかな構成がない(SMTP構成がないphp.ini
など)クリーンなシステムでメールを配信しているようです。この関数はどのようにしてmail
メールをリモートサーバーに配信しますか?
4 に答える
* nixでは、バイナリを呼び出し、sendmail
バイナリはメール構成を使用して電子メールをルーティングします。Windowsでは、SMTPサーバーに送信します。どちらの場合も、sysadminはメールシステムをセットアップします。
以下のように動作することがわかります。
最初の方法
$ ltrace php -r "mail('tester@127.0.0.1', 'Test', 'Hello world');" 2>&1 | grep sendmail
memcpy(0x095ea168, "sendmail_from", 14) = 0x095ea168
memcpy(0x095ea1e0, "sendmail_path", 14) = 0x095ea1e0
popen("/usr/sbin/sendmail -t -i ", "w") = 0x0977c7c0
上記のコマンドの結果から、popen()
関数がのプロセスを開くことがわかります/usr/sbin/sendmail -t -i
。
$ ls -l /usr/sbin/sendmail
... /usr/sbin/sendmail -> exim4
sendmail
へのシンボリックリンクもそうなexim4
ので、をsendmail -t -i
呼び出しますexim4 -t -i
。
そして、exim4
あなたのマニュアルページでこれらのオプションについて読むことができます-t -i
:
$ man exim4 | grep ' -t -i'
-ti This option is exactly equivalent to -t -i. It is provided for compatibility with Sendmail.
2番目の方法
スヌーピーをインストールして実行します。
# grep snoopy /var/log/auth.log | tail
... php -r mail('tester@127.0.0.1', 'Test', 'Hello world');
... /usr/sbin/sendmail -t -i
... /usr/sbin/exim4 -Mc 1YxxYn-0006a7-Nw
... /usr/sbin/exim4 -t -oem -oi -f <> -E1YxxYn-0006a7-Nw
... /usr/sbin/exim4 -Mc 1YxxYn-0006aB-Oj
上記のコマンドの結果は、実行されたコマンドのシーケンスを示しています。
mail()はsendmailを使用します。これは、DNSを使用してターゲットドメインのMXレコードを検索し、そこに直接配信します。それでおしまい。
また、宛先サーバーはおそらくIPアドレスを知らないため、特にNATされている場合は、スパムとしてマークされる可能性があります。
別の(既知のレギット広告)smtpサーバーを仲介として使用するように構成を変更できます。
sendmail
基礎となるものなどが適切に構成されていない限り、実際にはそれほど信頼性は高くありません。
Amazon SESは、使用しているどのサーバーよりも優れたサーバーを備えており、よりも多くの回数メールを受け取りますmail()
。
使用すべきでない本当の理由mail()
は、サーバーのIPアドレスがGMailやYahooなどのメールサービスに完全に知られていない可能性があり、スパムとしてマークされる可能性が高いためです。なぜスパムとしてマークされるのですか?mail()
スパム目的で悪用するのは非常に簡単で簡単だからです。