class Truemail::Validate::Smtp

Constants

ERROR
RESPONSE_ATTRS
Response

Attributes

smtp_results[R]

Public Class Methods

new(result) click to toggle source
Calls superclass method Truemail::Worker::new
# File lib/truemail/validate/smtp.rb, line 10
def initialize(result)
  super(result)
  @smtp_results = []
end

Public Instance Methods

run() click to toggle source
# File lib/truemail/validate/smtp.rb, line 15
def run
  return false unless Truemail::Validate::MxBlacklist.check(result)
  establish_smtp_connection
  return true if success(success_response?)
  result.smtp_debug = smtp_results
  return true if success(not_includes_user_not_found_errors?)
  add_error(Truemail::Validate::Smtp::ERROR)
  false
end

Private Instance Methods

attempts() click to toggle source
# File lib/truemail/validate/smtp.rb, line 35
def attempts
  @attempts ||= begin
    return {} if fail_fast? || !mail_servers.one?
    { attempts: configuration.connection_attempts } # attempts should used for case with one mail server only
  end
end
establish_smtp_connection() click to toggle source
# File lib/truemail/validate/smtp.rb, line 50
def establish_smtp_connection
  filtered_mail_servers_by_fail_fast_scenario.each do |mail_server|
    smtp_results << Truemail::Validate::Smtp::Request.new(
      configuration: configuration, host: mail_server, email: result.punycode_email, **attempts
    )
    next unless request.check_port
    request.run || rcptto_error ? break : next
  end
end
fail_fast?() click to toggle source
# File lib/truemail/validate/smtp.rb, line 27
def fail_fast?
  configuration.smtp_fail_fast
end
filtered_mail_servers_by_fail_fast_scenario() click to toggle source
# File lib/truemail/validate/smtp.rb, line 31
def filtered_mail_servers_by_fail_fast_scenario
  fail_fast? ? mail_servers.first(1) : mail_servers
end
not_includes_user_not_found_errors?() click to toggle source
# File lib/truemail/validate/smtp.rb, line 64
def not_includes_user_not_found_errors?
  return unless configuration.smtp_safe_check
  result.smtp_debug.map(&:response).map(&:errors).all? do |errors|
    next true unless errors.key?(:rcptto)
    errors.slice(:rcptto).values.none? do |error|
      configuration.smtp_error_body_pattern.match?(error)
    end
  end
end
rcptto_error() click to toggle source
# File lib/truemail/validate/smtp.rb, line 46
def rcptto_error
  request.response.errors[:rcptto]
end
request() click to toggle source
# File lib/truemail/validate/smtp.rb, line 42
def request
  smtp_results.last
end
success_response?() click to toggle source
# File lib/truemail/validate/smtp.rb, line 60
def success_response?
  smtp_results.map(&:response).any?(&:rcptto)
end