web-dev-qa-db-ja.com

ポート465と587がPHPで開いているかどうかを確認するにはどうすればよいですか?

PHPMailerを使用してSMTPとGmailで電子メールを送信しようとしています。使用している正確なスクリプトは他のサーバーでは機能しますが、この特定のホスティング会社のサーバーでは機能しません。

phpinfo()を確認しましたが、allow_url_fopenonであり、fopenのようなdisabled_functionsはリストされていません。

スクリプトが失敗し、次のいずれかが表示されます。

SMTP -> ERROR: Failed to connect to server: Connection timed out (110) 

またはそうでなければ

SMTP Error: Could not authenticate.

これは接続できないためだと思います。これも他のサーバーで機能し、認証資格情報が正しいためです。

したがって、より一般的に質問します。PHPまたはjailshellsshを使用して、ポートが実際に開いているかどうかを確認する方法はありますか?

15
cwd

fsockopenを使用して、開いている/使用可能なポートを確認できます。

$fp = fsockopen('127.0.0.1', 25, $errno, $errstr, 5);
if (!$fp) {
    // port is closed or blocked
} else {
    // port is open and available
    fclose($fp);
}

...ここで、5は、呼び出しが失敗するまでの秒単位のタイムアウトです。

これはおそらく、ホスティングプロバイダーがアウトバウンドソケットや特定のポートへの接続をブロックしているファイアウォールの問題が原因です。アウトバウンドSMTPポートをブロックするのはごく普通のセキュリティ構成であることに注意してください。当時は、ポート25のみがブロックされていましたが、SSLバリアントもますますブロックされ始めています。

ほとんどのプロバイダーとホスティング会社は、スパマーが迷惑メールを中継するのを防ぐために、独自のSMTPサーバーへの接続のみを許可します。

23
netcoder