Sha256: 4393759368f03b0531f11056ed12853cf7203ea711238b542b3ad83710db1cb2

Contents?: true

Size: 1.98 KB

Versions: 9

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true

module Truemail
  module Validate
    class Smtp < Truemail::Validate::Base
      ERROR = 'smtp error'

      attr_reader :smtp_results

      def initialize(result)
        super(result)
        @smtp_results = []
      end

      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

      def fail_fast?
        configuration.smtp_fail_fast
      end

      def filtered_mail_servers_by_fail_fast_scenario
        fail_fast? ? mail_servers.first(1) : mail_servers
      end

      def attempts
        @attempts ||= begin
          return {} if fail_fast? || !mail_servers.one?
          { attempts: configuration.connection_attempts }
        end
      end

      def request
        smtp_results.last
      end

      def rcptto_error
        request.response.errors[:rcptto]
      end

      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

      def success_response?
        smtp_results.map(&:response).any?(&:rcptto)
      end

      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
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
truemail-2.4.8 lib/truemail/validate/smtp.rb
truemail-2.4.7 lib/truemail/validate/smtp.rb
truemail-2.4.6 lib/truemail/validate/smtp.rb
truemail-2.4.5 lib/truemail/validate/smtp.rb
truemail-2.4.4 lib/truemail/validate/smtp.rb
truemail-2.4.3 lib/truemail/validate/smtp.rb
truemail-2.4.2 lib/truemail/validate/smtp.rb
truemail-2.4.1 lib/truemail/validate/smtp.rb
truemail-2.4.0 lib/truemail/validate/smtp.rb