88 lines
2.8 KiB
Ruby
88 lines
2.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'mail/network/delivery_methods/smtp'
|
||
|
|
||
|
# Monkey patch mail 2.8.1 to make it possible to disable STARTTLS.
|
||
|
# without having to change existing settings.
|
||
|
# This brings in changes from https://github.com/mikel/mail/pull/1536,
|
||
|
# which has not been released yet.
|
||
|
module Mail
|
||
|
class SMTP
|
||
|
def initialize(values)
|
||
|
self.settings = DEFAULTS
|
||
|
settings[:enable_starttls_auto] = nil
|
||
|
settings.merge!(values)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
# `key` is said to be provided when `settings` has a non-nil value for `key`.
|
||
|
def setting_provided?(key)
|
||
|
!settings[key].nil?
|
||
|
end
|
||
|
|
||
|
# Yields one of `:always`, `:auto` or `false` based on `enable_starttls` and `enable_starttls_auto` flags.
|
||
|
# Yields `false` when `smtp_tls?`.
|
||
|
def smtp_starttls
|
||
|
return false if smtp_tls?
|
||
|
|
||
|
if setting_provided?(:enable_starttls) && settings[:enable_starttls]
|
||
|
# enable_starttls: provided and truthy
|
||
|
case settings[:enable_starttls]
|
||
|
when :auto then :auto
|
||
|
when :always then :always
|
||
|
else
|
||
|
:always
|
||
|
end
|
||
|
elsif setting_provided?(:enable_starttls_auto)
|
||
|
# enable_starttls: not provided or false
|
||
|
settings[:enable_starttls_auto] ? :auto : false
|
||
|
else
|
||
|
# enable_starttls_auto: not provided
|
||
|
# enable_starttls: when provided then false
|
||
|
# use :auto when neither enable_starttls* provided
|
||
|
setting_provided?(:enable_starttls) ? false : :auto
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def smtp_tls?
|
||
|
(setting_provided?(:tls) && settings[:tls]) || (setting_provided?(:ssl) && settings[:ssl])
|
||
|
end
|
||
|
|
||
|
def start_smtp_session(&block)
|
||
|
build_smtp_session.start(settings[:domain], settings[:user_name], settings[:password],
|
||
|
settings[:authentication], &block)
|
||
|
end
|
||
|
|
||
|
def build_smtp_session
|
||
|
if smtp_tls? && (settings[:enable_starttls] || settings[:enable_starttls_auto])
|
||
|
# rubocop:disable Layout/LineLength
|
||
|
raise ArgumentError,
|
||
|
":enable_starttls and :tls are mutually exclusive. Set :tls if you're on an SMTPS connection. Set :enable_starttls if you're on an SMTP connection and using STARTTLS for secure TLS upgrade."
|
||
|
# rubocop:enable Layout/LineLength
|
||
|
end
|
||
|
|
||
|
Net::SMTP.new(settings[:address], settings[:port]).tap do |smtp|
|
||
|
if smtp_tls?
|
||
|
smtp.disable_starttls
|
||
|
smtp.enable_tls(ssl_context)
|
||
|
else
|
||
|
smtp.disable_tls
|
||
|
|
||
|
case smtp_starttls
|
||
|
when :always
|
||
|
smtp.enable_starttls(ssl_context)
|
||
|
when :auto
|
||
|
smtp.enable_starttls_auto(ssl_context)
|
||
|
else
|
||
|
smtp.disable_starttls
|
||
|
end
|
||
|
end
|
||
|
|
||
|
smtp.open_timeout = settings[:open_timeout] if settings[:open_timeout]
|
||
|
smtp.read_timeout = settings[:read_timeout] if settings[:read_timeout]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|