IO::Socket::INET
TCP:110 で開いているソケットの読み取りと書き込みに使用する POP3 ログイン テスト スクリプトがあります。これは私が慣れているものです: -
my $sock = IO::Socket::INET->new(
PeerAddr => "$h:$port",
Proto => "tcp",
) or die "$!\n";
ただし、SSL で保護された POP3S (TCP:995) を介して同じ POP3 会話をテストする必要もあります。
コマンドラインで次を使用できることがわかりました。これにより、「telnet hostname 110」と同様の状態になりますが、暗号化されます。
openssl s_client -crlf -connect hostname:995
私はopensslコマンドである種の読み取り/書き込みFileHandleまたはソケットを設定できる方法を見つけたいと思っています。これは空になるまで読み取ることができ、必要なPOP3コマンドを書き込み、応答を読み取ることができます。の上...
画面に表示されているので、つかむには十分近いように感じますが、「取得」して先に進むには、perl の使い方がよくわかりません!
残念ながら、このスクリプトが実行されるサーバーには、それ以上の perl モジュールをインストールすることができません。これは明らかな解決策であった可能性があります。
アップデート
インスピレーションをくれた @ventatsu のおかげで、私は今、次のIPC::Open2
ように使用しています: -
my ($sslread,$sslwrite);
my $ssl_fh = open2(
$sslread,
$sslwrite,
"openssl s_client -crlf -connect mail.example.com:995"
) or die "$!\n";
while (<$sslread>) {
print;
if (/^\+OK.*$/) {
## Try to log in
print $sslwrite "USER $u\r\n";
print "USER $u\n";
while (<$sslread>) {
print;
if (/^\+OK.*$/) {
## Keep going
print $sslwrite "PASS $p\r\n";
print "PASS $p\n";
while (<$sslread>) {
print;
}
}
}
print $sslwrite "QUIT";
print "QUIT\n";
}
}
waitpid( $ssl_fh, 0 );
my $child_exit_status = $? >> 8;
私の非SSLテストスクリプトは次のように機能します: -
Testing pop3 on mail.example.com:110
+OK The Microsoft Exchange POP3 service is ready.
USER mailtest@example.com
+OK
PASS Abcd3fGh
+OK User successfully logged on.
次のように、CLI のインタラクティブ SSL セッションで POP3 コマンドを実行すると、資格情報は正常に機能します。
openssl s_client -crlf -connect mail.example.com:995
<snip out the SSL bumph />
+OK The Microsoft Exchange POP3 service is ready.
USER mailtest@example.com
+OK
PASS Abcd3fGh
+OK User successfully logged on.
しかし、私の SSL テスト スクリプトは次のようにしか機能しません。
Testing pop3s on mail.example.com:995
<snip out the SSL bumph />
+OK The Microsoft Exchange POP3 service is ready.
USER mailtest@example.com
+OK
PASS Abcd3fGh
-ERR Logon failure: unknown user name or bad password.
私は何を間違っていますか?