Class: SafetyMailer::Carrier

Inherits:
Object
  • Object
show all
Defined in:
lib/safety_mailer/safety_mailer.rb

Overview

Carrier class implements a delivery method for ActionMailer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = {}) ⇒ Carrier



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/safety_mailer/safety_mailer.rb', line 10

def initialize(params = {})
  self.matchers = params[:allowed_matchers] || []
  self.settings = params[:delivery_method_settings] || {}
  self.logger = determine_logger(params[:logger])
  delivery_method_name = params[:delivery_method] || :smtp
  @delivery_method = if defined?(ActionMailer)
                       ActionMailer::Base.delivery_methods[delivery_method_name].new(settings)
                     else
                       Mail::Configuration.instance.lookup_delivery_method(delivery_method_name).new(settings)
                     end
  @sendgrid_options = {}
end

Instance Attribute Details

#loggerObject

Returns the value of attribute logger.



8
9
10
# File 'lib/safety_mailer/safety_mailer.rb', line 8

def logger
  @logger
end

#mailObject

Returns the value of attribute mail.



8
9
10
# File 'lib/safety_mailer/safety_mailer.rb', line 8

def mail
  @mail
end

#matchersObject

Returns the value of attribute matchers.



8
9
10
# File 'lib/safety_mailer/safety_mailer.rb', line 8

def matchers
  @matchers
end

#settingsObject

Returns the value of attribute settings.



8
9
10
# File 'lib/safety_mailer/safety_mailer.rb', line 8

def settings
  @settings
end

Instance Method Details

#deliver!(mail) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/safety_mailer/safety_mailer.rb', line 23

def deliver!(mail)
  self.mail = mail
  original_recipients = recipients
  allowed = filter(original_recipients)

  log_delivery_summary(original_recipients, allowed)

  if allowed.empty?
    log 'SafetyMailer: No allowed recipients found - suppressing delivery altogether'
    return
  end

  if sendgrid?
    sendgrid_header = prepare_sendgrid_delivery(allowed)
    mail.header.fields.delete_if { |f| f.name =~ /X-SMTPAPI/i }
    mail['X-SMTPAPI'] = sendgrid_header
    log 'SafetyMailer: Updated SendGrid header with filtered recipients'
  end
  mail.to = allowed

  log "SafetyMailer: Delivering email to #{allowed.size} allowed recipient(s)"
  @delivery_method.deliver!(mail)
end

#filter(addresses) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/safety_mailer/safety_mailer.rb', line 51

def filter(addresses)
  return [] if addresses.nil? || addresses.empty?

  allowed, rejected = addresses.partition { |r| whitelisted?(r) }

  rejected.each { |addr| log "SafetyMailer: Suppressed delivery for #{addr} (no matching allowed pattern)" }
  allowed.each { |addr| log "SafetyMailer: Allowed delivery for #{addr}" }

  allowed
end

#whitelisted?(recipient) ⇒ Boolean



47
48
49
# File 'lib/safety_mailer/safety_mailer.rb', line 47

def whitelisted?(recipient)
  matchers.any? { |m| recipient =~ m }
end