class Postmark::SpamCheck::Report

Attributes

details[R]
email[R]
error[RW]
score[R]

Public Class Methods

new(email) click to toggle source
# File lib/postmark/spam_check/report.rb, line 7
def initialize(email)
  @email = email
  @score = nil
  @error = nil
  @details = []
end

Public Instance Methods

load_results(results) click to toggle source
# File lib/postmark/spam_check/report.rb, line 14
def load_results(results)
  # Truthy success means the report was generated successfully.
  if results['success']
    results_for_success(results)
  else
    results_for_failure(results)
  end

  self
end

Private Instance Methods

parse_spamassassin_report(report_text = nil) click to toggle source
# File lib/postmark/spam_check/report.rb, line 35
def parse_spamassassin_report(report_text = nil)
  return [] unless report_text

  # NOTE: Possible multi-line description. Example:

  #  pts rule name               description
  # ---- ---------------------- --------------------------------------------------
  #  0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail provider
  #                             (hello[at]example.com)
  last_rule = nil

  # Ignore the first two lines.
  report_text.split(/\n/)[2..-1].each do |line|
    rule, description = line[5..-1].strip.split(/\s{2,}/, 2).map(&:strip)

    if description
      points = line[0..3].strip.to_f
      last_rule = { points: points, rule: rule, description: description }
      @details << last_rule

    # Nil description means second line of description is in "rule".
    # Tack it on to the description of the last one.
    elsif last_rule
      last_rule[:description] << " #{rule}"
    end
  end
rescue StandardError => error
  @error = error.message
end
results_for_failure(results) click to toggle source
# File lib/postmark/spam_check/report.rb, line 31
def results_for_failure(results)
  @error = results['message']
end
results_for_success(results) click to toggle source
# File lib/postmark/spam_check/report.rb, line 26
def results_for_success(results)
  @score = results['score']
  parse_spamassassin_report(results['report'])
end