52 lines
1.8 KiB
Ruby
52 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?)
|
||
|
unless 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
|
||
|
# ADD auto detection of authtype - https://github.com/zammad/zammad/issues/240
|
||
|
# set detected authtype based on smtp server capabilities
|
||
|
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
|
||
|
# /ADD auto detection of authtype - https://github.com/zammad/zammad/issues/240
|
||
|
end
|
||
|
authenticate user, secret, (authtype || DEFAULT_AUTH_TYPE) if user
|
||
|
@started = true
|
||
|
ensure
|
||
|
unless @started
|
||
|
# authentication failed, cancel connection.
|
||
|
s.close if s and not s.closed?
|
||
|
@socket = nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
# rubocop:enable all
|