Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. class EmailChecker
  2. extend Forwardable
  3. def_delegators :SendgridApi, :bounced?, :spam_reported?
  4.  
  5. def initialize(original_address, override_sendgrid = false)
  6. @original_address = original_address
  7. @parsed = parse_address(original_address)
  8. @override_sendgrid = override_sendgrid
  9. end
  10.  
  11. def error
  12. @error ||= compute_error.to_s.inquiry
  13. end
  14.  
  15. delegate :valid?, to: :error
  16.  
  17. def message
  18. I18n.t(error, scope: 'email_checker.errors')
  19. end
  20.  
  21. def spam_or_bounce_occurred?
  22. [:spam_reported, :bounced].include?(error)
  23. end
  24.  
  25. def reset_bounce?
  26. return false unless parsed
  27. override_sendgrid? && bounced?(parsed.address)
  28. end
  29.  
  30. def reset_spam_report?
  31. return false unless parsed
  32. override_sendgrid? && spam_reported?(parsed.address)
  33. end
  34.  
  35. private
  36.  
  37. attr_reader :original_address, :parsed
  38.  
  39. # rubocop:disable Metrics/CyclomaticComplexity
  40. # rubocop:disable Metrics/PerceivedComplexity
  41. def compute_error
  42. return :unparseable unless parsed
  43. return :domain_dot if domain_dot_error?
  44. return :malformed unless well_formed_address?
  45. return :no_mx_record unless mx_records?
  46. unless override_sendgrid?
  47. return :spam_reported if spam_reported?(parsed.address)
  48. return :bounced if bounced?(parsed.address)
  49. end
  50. :valid
  51. end
  52.  
  53. def override_sendgrid?
  54. @override_sendgrid
  55. end
  56.  
  57. def domain
  58. parsed.domain
  59. end
  60.  
  61. def parse_address(addr)
  62. Mail::Address.new(addr)
  63. rescue Mail::Field::ParseError
  64. nil
  65. end
  66.  
  67. def domain_dot_error?
  68. domain && domain.start_with?('.')
  69. end
  70.  
  71. def well_formed_address?
  72. parsed.local && parsed.domain &&
  73. parsed.address == original_address && parsed.local != original_address
  74. end
  75.  
  76. def mx_records?
  77. Resolv::DNS.new.getresource(domain, Resolv::DNS::Resource::IN::MX)
  78. rescue Resolv::ResolvError
  79. false
  80. rescue Resolv::ResolvTimeout
  81. true
  82. end
  83. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement