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