Created
November 25, 2015 13:25
-
-
Save dan-palmer/bd5ca41c89ba9c878455 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment