1

PHP の SwiftMailer ライブラリを使用してメールを一括送信しています (CANSPAM および RFC に従っています)。

DNS に対応する MX エントリがないドメインに遭遇するまで、すべて正常に動作します。その時点で、私のスクリプトはただハングします。おそらく、sendmail が戻ってこないからだと思います。これは、ほんの数分続くこともあれば、何時間も続くこともあります。

スクリプト (スラッシュ sendmail) がハングするアドレスは、DNS MX エントリのないアドレスであることを確認しました。それ以外は問題なく送信されます。

メッセージを送信する前に、PHP 内に DNS MX が存在するかどうかを確認する方法はありますか? これはスケーラブルですか (つまり、DNS で余分なルックアップを行うと実際に速度が低下するのでしょうか、それとも sendmail がメッセージの配信に使用するために MX がローカルにキャッシュされるので問題ないでしょうか)?

ご協力いただきありがとうございます

--- 更新 --- 以下の解決策を試してみました。これにより、問題を絞り込むことができました。MX エントリが存在するかどうかの問題ではないようです。問題は、DNS ルックアップが返されるまでに時間がかかることです。タイムアウトを設定できる簡単な方法はありますか? DNS が 5 秒以内に返されない場合は、次に進むことができますか?

4

3 に答える 3

3
getmxrr(substr($email,strrpos($email,'@')+1),$hosts);
if (!$hosts)
    echo 'No MX record found';

getmxrrブロッキングを防ぐためにこれを試すこともできます (タイムアウトを調整するオプションはありません)。

if (!@fsockopen(substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5))
    echo 'No MX record found';
于 2010-11-10T19:28:08.673 に答える
2

getmxrrを使用できます:

if (getmxrr($hostname, $mxhosts)) {
   // MX record exists
   var_dump($mxhosts);
}
于 2010-11-10T19:27:17.463 に答える
1

DNS ルックアップは、繰り返されるリクエストに対して適切にスケーリングします。最も近い DNS サーバーは、検索された値を一定期間キャッシュします。ローカル DNS キャッシュ サーバーを使用すると、パフォーマンスが向上しますが、より多くのメモリを使用します (ソフトウェアとキャッシュされたアドレスの数に応じて、少量または大量)。

RFC を正しく覚えていれば、A レコードを持つホストも有効な電子メールの宛先であるはずです。ただし、A レコードしかないドメインでは、そのアドレスにメール サーバーがない場合があります。(MX ターゲットにも同じことが当てはまりますが、これはあまり頻繁ではなく、通常は一時的なものです。)

適切な電子メール サービスは、電子メールをスプールし、時間の経過とともに配信を再試行する必要があります。sendmail がこれを行っていない場合は、その構成を確認する必要があります。また、メールが届かないメールアドレスの扱いについても検討する必要があります。

于 2010-11-10T19:44:28.787 に答える