From 4f3db3dcdbf5a0b9d727bd6d58e8d9c756f3f28a Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Thu, 27 Aug 2026 23:54:59 +0300 Subject: [PATCH 1/2] Reset SMTP error state before opening a fresh session --- lib/net/smtp.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/net/smtp.rb b/lib/net/smtp.rb index cca06e6..c9ba30d 100644 --- a/lib/net/smtp.rb +++ b/lib/net/smtp.rb @@ -668,6 +668,7 @@ def do_start(helo_domain, user, secret, authtype) if user || secret || authtype check_auth_args authtype, user, secret end + @error_occurred = false s = Timeout.timeout(@open_timeout, Net::OpenTimeout) do tcp_socket(@address, @port) end From 785cd1ced2a60c9c2fb43695679242dd7ce150dc Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 15:24:18 +0300 Subject: [PATCH 2/2] Add regression coverage for reset smtp error state before opening a fresh session --- test/net/smtp/test_smtp.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/net/smtp/test_smtp.rb b/test/net/smtp/test_smtp.rb index 3b9e245..229b606 100644 --- a/test/net/smtp/test_smtp.rb +++ b/test/net/smtp/test_smtp.rb @@ -530,6 +530,32 @@ def test_start_instance smtp.finish end + def test_start_instance_after_failed_greeting + smtp = Net::SMTP.new("example.invalid", starttls: false) + socket = Object.new + socket.define_singleton_method(:close) {} + smtp.define_singleton_method(:tcp_socket) { |*| socket } + smtp.define_singleton_method(:new_internet_message_io) { |io| io } + greetings = 0 + smtp.define_singleton_method(:recv_response) do + greetings += 1 + raise EOFError if greetings == 1 + Net::SMTP::Response.parse("220 ready") + end + smtp.define_singleton_method(:do_helo) { |_| } + smtp.define_singleton_method(:do_finish) do + @started = false + @socket = nil + end + + assert_raise(EOFError) { smtp.start } + smtp.start + assert_equal 2, greetings + assert smtp.started? + ensure + smtp.finish if smtp&.started? + end + def test_start_instance_with_position_argument port = fake_server_start(auth: 'plain') smtp = Net::SMTP.new('localhost', port)