Sha256: 2a25d48428d2076dbfc01d24f3fe87be67797109b5cefec9f98c578172f0f729

Contents?: true

Size: 1.7 KB

Versions: 14

Compression:

Stored size: 1.7 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(
            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

14 entries across 14 versions & 1 rubygems

Version Path
truemail-2.1.0 lib/truemail/validate/smtp.rb
truemail-2.0.2 lib/truemail/validate/smtp.rb
truemail-2.0.1 lib/truemail/validate/smtp.rb
truemail-2.0.0 lib/truemail/validate/smtp.rb
truemail-1.9.2 lib/truemail/validate/smtp.rb
truemail-1.9.1 lib/truemail/validate/smtp.rb
truemail-1.9.0 lib/truemail/validate/smtp.rb
truemail-1.8.0 lib/truemail/validate/smtp.rb
truemail-1.7.1 lib/truemail/validate/smtp.rb
truemail-1.7.0 lib/truemail/validate/smtp.rb
truemail-1.6.1 lib/truemail/validate/smtp.rb
truemail-1.6.0 lib/truemail/validate/smtp.rb
truemail-1.5.1 lib/truemail/validate/smtp.rb
truemail-1.5.0 lib/truemail/validate/smtp.rb