Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class EmailChecker
- extend Forwardable
- def_delegators :SendgridApi, :bounced?, :spam_reported?
- def initialize(original_address, override_sendgrid = false)
- @original_address = original_address
- @parsed = parse_address(original_address)
- @override_sendgrid = override_sendgrid
- end
- def error
- @error ||= compute_error.to_s.inquiry
- end
- delegate :valid?, to: :error
- def message
- I18n.t(error, scope: 'email_checker.errors')
- end
- def spam_or_bounce_occurred?
- [:spam_reported, :bounced].include?(error)
- end
- def reset_bounce?
- return false unless parsed
- override_sendgrid? && bounced?(parsed.address)
- end
- def reset_spam_report?
- return false unless parsed
- override_sendgrid? && spam_reported?(parsed.address)
- end
- private
- attr_reader :original_address, :parsed
- # rubocop:disable Metrics/CyclomaticComplexity
- # rubocop:disable Metrics/PerceivedComplexity
- def compute_error
- return :unparseable unless parsed
- return :domain_dot if domain_dot_error?
- return :malformed unless well_formed_address?
- return :no_mx_record unless mx_records?
- unless override_sendgrid?
- return :spam_reported if spam_reported?(parsed.address)
- return :bounced if bounced?(parsed.address)
- end
- :valid
- end
- def override_sendgrid?
- @override_sendgrid
- end
- def domain
- parsed.domain
- end
- def parse_address(addr)
- Mail::Address.new(addr)
- rescue Mail::Field::ParseError
- nil
- end
- def domain_dot_error?
- domain && domain.start_with?('.')
- end
- def well_formed_address?
- parsed.local && parsed.domain &&
- parsed.address == original_address && parsed.local != original_address
- end
- def mx_records?
- Resolv::DNS.new.getresource(domain, Resolv::DNS::Resource::IN::MX)
- rescue Resolv::ResolvError
- false
- rescue Resolv::ResolvTimeout
- true
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement