class Runner

Public Class Methods

new(params) click to toggle source
# File lib/mailtest/runner.rb, line 9
def initialize(params)
  setup_logger!(params['debug'].value)
  setup_mail!(params)
  setup_receivers!(params)
  setup_tokens!(params)
  @bar = ProgressBar.new(@receivers.count)
  @dry_run = params['dry-run'].value
  @messages = []

  create_emails!(params)
end

Public Instance Methods

debug() click to toggle source
# File lib/mailtest/runner.rb, line 44
def debug
  @messages.each do |m|
    ap m
  end
end
run() click to toggle source
# File lib/mailtest/runner.rb, line 21
def run
  errors = []
  success = 0

  @logger.info "Sending '#{@tokens[:word]}' to #{@tokens[:count]} recipient(s)"

  @messages.each_with_index do |m, i|
    receivers = m.to.join(', ')
    @logger.debug "Sending to: #{receivers} #{x_of_y(i)}"
    begin
      m.deliver unless @dry_run
      success += 1
    rescue StandardError => e
      errors << receivers
      @logger.error Rainbow(e.message).red
    ensure
      @bar.increment!
    end
  end

  show_result!(success, errors)
end

Private Instance Methods

add_or_replace_domain(receiver, domain) click to toggle source
# File lib/mailtest/runner.rb, line 145
def add_or_replace_domain(receiver, domain)
  if valid_email?(receiver) && domain
    user = receiver.split('@')[0]
    return [user, domain].join('@')
  elsif valid_email?(receiver)
    return receiver
  elsif domain
    return [receiver, domain].join('@')
  end
  @logger.error "Receiver: #{receiver}, domain: #{domain}"
  raise ArgumentError, 'Unable to read/generate email address'
end
color_number(number, color, color_zero = false) click to toggle source
# File lib/mailtest/runner.rb, line 124
def color_number(number, color, color_zero = false)
  return number.to_s if number.zero? && !color_zero
  Rainbow(number.to_s).color(color)
end
create_emails!(params) click to toggle source
# File lib/mailtest/runner.rb, line 107
def create_emails!(params)
  @logger.debug 'Creating mails'
  @receivers.each_with_index do |receiver, i|
    @tokens[:index] = i + 1
    @tokens[:receiver] = receiver
    subjectp = replace_tokens(params['subject'].value)
    bodyp = replace_tokens(params['body'].value)
    @messages << Mail.new do
      from    params['from'].value
      to      receiver
      subject subjectp
      body    bodyp
      cc      params['cc'].value
    end
  end
end
replace_tokens(str) click to toggle source
# File lib/mailtest/runner.rb, line 158
def replace_tokens(str)
  s = str

  %w[count index receiver timestamp word].each do |t|
    s = s.gsub("@#{t}@", @tokens[t.to_sym].to_s)
  end
  s
end
setup_logger!(debug) click to toggle source
# File lib/mailtest/runner.rb, line 52
def setup_logger!(debug)
  @logger = Logger.new(STDOUT)
  @logger.level = debug ? Logger::DEBUG : Logger::INFO
end
setup_mail!(params) click to toggle source
# File lib/mailtest/runner.rb, line 57
def setup_mail!(params)
  Mail.defaults do
    delivery_method :smtp,
                    address: params['host'].value,
                    port: params['port'].value
  end
end
setup_receivers!(params) click to toggle source
# File lib/mailtest/runner.rb, line 65
def setup_receivers!(params)
  @logger.debug 'Creating receiver list'
  receivers = []
  receiver = params['receiver'].value
  if File.exist?(receiver)
    begin
      receivers = YAML.load_file(receiver)
    rescue StandardError => e
      @logger.error e.message
    end
    @logger.debug "#{receiver} is a file with email addresses"
  elsif receiver =~ /,/
    receivers = receiver.split(',')
    @logger.debug "#{receiver} is a list of email addresses"
  elsif valid_email?(receiver)
    # we expect an array
    receivers << receiver
    @logger.debug "#{receiver} is a valid email address"
  else
    raise "#{receiver} is neither an email address nor a file with addresses"
  end

  @receivers = receivers.map do |r|
    add_or_replace_domain(r, params['domain'].value)
  end

  @logger.debug "Receivers: #{@receivers}"
  @count = @receivers.length
end
setup_tokens!(params) click to toggle source
# File lib/mailtest/runner.rb, line 95
def setup_tokens!(params)
  @logger.debug 'Creating tokens'
  length = params['word_length'].value
  @tokens = {
    count: @receivers.count,
    index: 0,
    receiver: nil,
    timestamp: Time.now,
    word: RandomWord.nouns(not_shorter_than: length).next
  }
end
show_result!(success, errors) click to toggle source
# File lib/mailtest/runner.rb, line 129
def show_result!(success, errors)
  success_str = color_number(success, :green, true)
  errors_str = color_number(errors.length, :red)

  @logger.info "Finished: [#{success_str}/#{errors_str}/#{@count}]"
  if errors.empty?
    @logger.info Rainbow('Success!').green
  else
    @logger.error Rainbow("Errors: #{errors.join(', ')}").red
  end
end
valid_email?(str) click to toggle source
# File lib/mailtest/runner.rb, line 141
def valid_email?(str)
  !str !~ /@/
end
x_of_y(x) click to toggle source
# File lib/mailtest/runner.rb, line 167
def x_of_y(x)
  "[#{x + 1}/#{@tokens[:count]}]"
end