Fixed issue#240 - TLS/SSL for SMTP with exchange. Improved Net::SMTP.do_start to auto detect available auth types based on SMTP server capabilities.
This commit is contained in:
parent
f07013ac3c
commit
db2b329331
|
@ -10,8 +10,10 @@ class Channel::Driver::Smtp
|
||||||
host: 'some.host',
|
host: 'some.host',
|
||||||
port: 25,
|
port: 25,
|
||||||
enable_starttls_auto: true, # optional
|
enable_starttls_auto: true, # optional
|
||||||
|
openssl_verify_mode: 'none', # optional
|
||||||
user: 'someuser',
|
user: 'someuser',
|
||||||
password: 'somepass'
|
password: 'somepass'
|
||||||
|
authentication: nil, # nil, autodetection - to use certain schema use 'plain', 'login' or 'cram_md5'
|
||||||
},
|
},
|
||||||
mail_attributes,
|
mail_attributes,
|
||||||
notification
|
notification
|
||||||
|
@ -28,6 +30,9 @@ class Channel::Driver::Smtp
|
||||||
if !options.key?(:port)
|
if !options.key?(:port)
|
||||||
options[:port] = 25
|
options[:port] = 25
|
||||||
end
|
end
|
||||||
|
if !options.key?(:domain)
|
||||||
|
options[:domain] = Setting.get('fqdn')
|
||||||
|
end
|
||||||
if !options.key?(:enable_starttls_auto)
|
if !options.key?(:enable_starttls_auto)
|
||||||
options[:enable_starttls_auto] = true
|
options[:enable_starttls_auto] = true
|
||||||
end
|
end
|
||||||
|
@ -39,10 +44,11 @@ class Channel::Driver::Smtp
|
||||||
openssl_verify_mode: options[:openssl_verify_mode],
|
openssl_verify_mode: options[:openssl_verify_mode],
|
||||||
address: options[:host],
|
address: options[:host],
|
||||||
port: options[:port],
|
port: options[:port],
|
||||||
domain: options[:host],
|
domain: options[:domain],
|
||||||
user_name: options[:user],
|
user_name: options[:user],
|
||||||
password: options[:password],
|
password: options[:password],
|
||||||
enable_starttls_auto: options[:enable_starttls_auto],
|
enable_starttls_auto: options[:enable_starttls_auto],
|
||||||
|
authentication: options[:authentication],
|
||||||
}
|
}
|
||||||
mail.deliver
|
mail.deliver
|
||||||
end
|
end
|
||||||
|
|
52
lib/core_ext/net/smtp.rb
Normal file
52
lib/core_ext/net/smtp.rb
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# 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
|
Loading…
Reference in a new issue