Sha256: 6374ba6ceffa07533285f8be1fac6748b3e7a455610a3c6ab7479600a540c0dd

Contents?: true

Size: 1.67 KB

Versions: 7

Compression:

Stored size: 1.67 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::Mx.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 request
        smtp_results.last
      end

      def attempts
        @attempts ||=
          mail_servers.one? ? { attempts: configuration.connection_attempts } : {}
      end

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

      def establish_smtp_connection
        mail_servers.each do |mail_server|
          smtp_results << Truemail::Validate::Smtp::Request.new(
            host: mail_server, email: result.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

7 entries across 7 versions & 1 rubygems

Version Path
truemail-1.2.1 lib/truemail/validate/smtp.rb
truemail-1.2.0 lib/truemail/validate/smtp.rb
truemail-1.1.0 lib/truemail/validate/smtp.rb
truemail-1.0.1 lib/truemail/validate/smtp.rb
truemail-1.0.0 lib/truemail/validate/smtp.rb
truemail-0.2.0 lib/truemail/validate/smtp.rb
truemail-0.1.10 lib/truemail/validate/smtp.rb