lib/snails/mailer.rb in snails-0.4.3 vs lib/snails/mailer.rb in snails-0.5.0
- old
+ new
@@ -14,18 +14,30 @@
# class Bounce < StandardError; end
# class SoftBounce < Bounce; end
# class HardBounce < Bounce; end
+ def self.backends
+ {
+ 'test_backend' => 'Snails::Mailer::TestBackend',
+ 'smtp' => 'Snails::Mailer::TuktukBackend',
+ 'mailgun' => 'Snails::Mailer::MailgunBackend'
+ }
+ end
+
+ def self.init_backend(backend_name, opts = {})
+ backend_name = backend_name.presence || 'test_backend'
+ backends[backend_name].constantize.new(opts)
+ end
+
def initialize(opts)
@from_email = opts[:from] or raise ":from required"
@base_subject = opts[:base_subject] || ''
@views = opts[:views] || Snails.root.join('lib', 'views')
@logfile = opts[:logfile] # || Snails.root.join('log', 'mailer.log')
- backend_name = opts[:backend_name] || 'TestBackend'
- @backend = self.class.backends[backend_name].new(opts[:backend_options])
+ @backend = self.class.init_backend(opts[:backend_name], opts[:backend_options])
end
def email(name, &block)
define_singleton_method(name) do |*args|
instance_exec(*args, &block)
@@ -75,11 +87,11 @@
send_email(to: to, subject: subject, body: content)
end
private
- def render(view_path, layout_lath = nil)
+ def render(view_path, layout_path = nil)
view = File.read(File.join(@views, "#{view_path}.erb"))
if layout_path
layout = File.read(File.join(@views, "#{layout_path}.erb"))
render_erb(layout) { render_erb(view) }
else
@@ -98,11 +110,11 @@
def logger
@logger ||= @logfile ? Logger.new(@logfile) : Snails.logger
end
- def send_email(from: @from_email, to:, subject:, body: nil, template: nil, layout: nil, html_body: nil, html_template: nil, html_layout: nil, message_id: nil, return_path: nil, list_unsubscribe: nil)
+ def send_email(from: @from_email, to:, subject:, body: nil, template: nil, layout: nil, html_body: nil, html_template: nil, html_layout: nil, message_id: nil, attachments: nil, return_path: nil, list_unsubscribe: nil)
raise "No recipient given for mail: #{subject}!" if to.blank?
message = {
to: to,
from: from,
@@ -118,10 +130,11 @@
if html_body or html_template
message[:html_body] = html_template ? render(html_template, html_layout) : html_body
end
+ message[:attachments] = attachments if attachments
message[:message_id] = message_id if message_id
message[:return_path] = return_path if return_path
message[:list_unsubscribe] = list_unsubscribe if list_unsubscribe
logger.info "[#{to}] Delivering: #{subject}"
@@ -138,14 +151,29 @@
def deliver_many(emails, options = {})
emails.map { |e| deliver(e, options) }
end
end
- class Tuktuk < Backend
+ class TestBackend < Backend
+ def initialize(opts = {})
+ end
+
+ def deliver(email, options = {})
+ puts "Deliverying single: #{email[:to]}"
+ end
+
+ def deliver_many(emails, options = {})
+ puts "Deliverying many: #{emails.count}"
+ end
+ end
+
+ class TuktukBackend < Backend
def initialize(config = {})
@debug = config[:debug]
+ puts "-- #{config.inspect}"
+
if key = config.dig(:dkim, :private_key) and File.exist?(key)
config[:dkim][:private_key] = IO.read(key)
elsif config[:dkim]
puts "Private key for DKIM not found! Disabling..."
config.delete(:dkim)
@@ -168,10 +196,10 @@
def deliver_many(emails, options = {})
Tuktuk.deliver_many(emails, options)
end
end
- class Mailgun < Backend
+ class MailgunBackend < Backend
def initialize(api_key:, domain_name:)
@key = api_key
@url = "https://api.mailgun.net/v3/#{domain_name}/messages"
end
\ No newline at end of file