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