質問

私はPHPのSwiftMailerライブラリを使用して、電子メールを大量に送信します(CanSpamおよびRFCをフォローしています)。

DNSに対応するMXエントリがないドメインを越えて実行するまで、すべてが正常に機能します。その時点で、私のスクリプトはただぶら下がっています - 私はそれがSendMailが返されていないからだと思います。これは数分続くか、何時間も続くことがあります。

私のスクリプト(Slash Sendmail)がDNS MXエントリのないアドレス(Slash Sendmail)がハングしていることを確認しました。他のすべては正常に送られます。

メッセージを送信する前に、PHPの内部にDNS MXが存在するかどうかを確認する方法はありますか?これはスケーラブルですか(つまり、DNSの追加の検索が本当に遅くなりますか、それともMXはメッセージを配信する際に使用するためにsendmailがローカルにキャッシュされますか)?

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

---更新---以下のソリューションを試しましたが、これは問題が何であるかを絞り込むのに役立ちました。 MXエントリが存在するかどうかの問題ではないようです。問題は、DNSルックアップが戻ってきて永遠に時間がかかっていることです。タイムアウトを設定できる簡単な方法はありますか?DNSが5秒未満で戻らない場合、先に進むことができますか?

役に立ちましたか?

解決

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';

他のヒント

使用できます getMXRR:

if (getmxrr($hostname, $mxhosts)) {
   // MX record exists
   var_dump($mxhosts);
}

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top