class Truemail::Validate::Smtp::Request

Constants

CONNECTION_DROPPED
CONNECTION_TIMEOUT_ERROR
RESPONSE_TIMEOUT_ERROR
SMTP_PORT

Attributes

attempts[R]
configuration[R]
email[R]
host[R]
port_open_status[R]
response[R]

Public Class Methods

new(configuration:, host:, email:, attempts: nil, port_open_status: proc { true }) click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 16
def initialize(configuration:, host:, email:, attempts: nil, port_open_status: proc { true })
  @configuration = Truemail::Validate::Smtp::Request::Configuration.new(configuration)
  @response = Truemail::Validate::Smtp::Response.new
  @host = host
  @email = email
  @attempts = attempts
  @port_open_status = port_open_status
end

Public Instance Methods

check_port() click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 25
def check_port
  response.port_opened = ::Socket.tcp(
    host,
    Truemail::Validate::Smtp::Request::SMTP_PORT,
    connect_timeout: configuration.connection_timeout,
    &port_open_status
  )
rescue => error
  retry if attempts_exist? && error.is_a?(::Errno::ETIMEDOUT)
  response.port_opened = false
end
run() click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 37
def run
  session.start(configuration.verifier_domain) do |smtp_request|
    response.connection = response.helo = true
    smtp_handshakes(smtp_request, response)
  end
rescue => error
  retry if attempts_exist?
  assign_error(attribute: :connection, message: compose_from(error))
end

Private Instance Methods

assign_error(attribute:, message:) click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 83
def assign_error(attribute:, message:)
  response.errors[attribute] = message
  response.public_send(:"#{attribute}=", false)
end
attempts_exist?() click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 62
def attempts_exist?
  return false unless attempts
  (@attempts -= 1).positive?
end
compose_from(error) click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 74
def compose_from(error)
  case error.class.name
  when 'Net::OpenTimeout' then Truemail::Validate::Smtp::Request::CONNECTION_TIMEOUT_ERROR
  when 'Net::ReadTimeout' then Truemail::Validate::Smtp::Request::RESPONSE_TIMEOUT_ERROR
  when 'EOFError' then Truemail::Validate::Smtp::Request::CONNECTION_DROPPED
  else error.message
  end
end
session() click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 67
def session
  ::Net::SMTP.new(host, Truemail::Validate::Smtp::Request::SMTP_PORT).tap do |settings|
    settings.open_timeout = configuration.connection_timeout
    settings.read_timeout = configuration.response_timeout
  end
end
session_data() click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 88
def session_data
  {
    mailfrom: configuration.verifier_email,
    rcptto: email
  }
end
smtp_handshakes(smtp_request, smtp_response) click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 101
def smtp_handshakes(smtp_request, smtp_response)
  session_data.all? do |method, value|
    smtp_response.public_send(:"#{method}=", smtp_resolver(smtp_request, method, value))
  end
end
smtp_resolver(smtp_request, method, value) click to toggle source
# File lib/truemail/validate/smtp/request.rb, line 95
def smtp_resolver(smtp_request, method, value)
  smtp_request.public_send(method, value)
rescue => error
  assign_error(attribute: method, message: compose_from(error))
end