Domain MXが存在しない場合、SendMailはハングアップします
-
30-09-2019 - |
質問
私は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がこれを行っていない場合は、その構成を確認する必要があります。また、メールを配信できないメールアドレスで何をすべきかを検討する必要があります。