trabajo-afectivo/lib/core_ext/net/smtp.rb
2018-05-04 22:05:10 +08:00

57 lines
1.8 KiB
Ruby

# rubocop:disable all
module Net
class SMTP
def do_start(helo_domain, user, secret, authtype)
raise IOError, 'SMTP session already started' if @started
if user or secret
check_auth_method(authtype || DEFAULT_AUTH_TYPE)
check_auth_args user, secret
end
s = Timeout.timeout(@open_timeout, Net::OpenTimeout) do
tcp_socket(@address, @port)
end
logging "Connection opened: #{@address}:#{@port}"
@socket = new_internet_message_io(tls? ? tlsconnect(s) : s)
check_response critical { recv_response() }
do_helo helo_domain
if starttls_always? or (capable_starttls? and starttls_auto?)
if !capable_starttls?
raise SMTPUnsupportedCommand,
"STARTTLS is not supported on this server"
end
starttls
@socket = new_internet_message_io(tlsconnect(s))
# helo response may be different after STARTTLS
do_helo helo_domain
end
# ADD auto detection of authtype - https://github.com/zammad/zammad/issues/240
# set detected authtype based on smtp server capabilities
if user or secret
if !authtype
if auth_capable?(DEFAULT_AUTH_TYPE)
authtype = DEFAULT_AUTH_TYPE
elsif capable_plain_auth?
authtype = 'PLAIN'
elsif capable_login_auth?
authtype = 'LOGIN'
elsif capable_cram_md5_auth?
authtype = 'CRAM-MD5'
end
end
end
# /ADD auto detection of authtype - https://github.com/zammad/zammad/issues/240
authenticate user, secret, (authtype || DEFAULT_AUTH_TYPE) if user
@started = true
ensure
if !@started
# authentication failed, cancel connection.
s.close if s and not s.closed?
@socket = nil
end
end
end
end
# rubocop:enable all