В спецификации POP3 говорится, что вам необходимо отправить STLS
, чтобы инициировать квитирование TLS.Поэтому сначала вы должны отправить STLS
на незашифрованный сокет, а после этого вы сможете вызвать connect
на уровне OpenSSL, который затем выполнит фактическое рукопожатие.
Если вы позвоните connect
перед отправкой STLS
, сервер не будет знать, что происходит, и будет интерпретировать его как ввод мусора.
Рабочий пример:
tcp = TCPSocket.new(host, port)
puts tcp.gets
tcp.puts 'STLS'
puts tcp.gets
ssl_context = OpenSSL::SSL::SSLContext.new
ssl_client = OpenSSL::SSL::SSLSocket.new(tcp, ssl_context)
ssl_client.connect
puts ssl_client.state
ssl_client.puts "NOOP"
puts ssl_client.gets
Вывод:
+OK POP3 ready <2067986403.1526483285@....>
+OK
SSLOK
+OK