Skip to content

Instantly share code, notes, and snippets.

@ovcharik
Last active August 29, 2015 14:07
Show Gist options
  • Save ovcharik/55fb2e81fabfbdb6725b to your computer and use it in GitHub Desktop.
Save ovcharik/55fb2e81fabfbdb6725b to your computer and use it in GitHub Desktop.
Multiple delivery options for Rails 4

В smtp_settings.yml забиваем адреса с настройками.

В маилере пишем

class MyMailer < ActionMailer::Base
  use 'email@example.com'[, <name>]
end

В случае если указан параметр <name> то отправитель сформируется следующим образом: name <email@example.com>.

Сама функция use подставляет по умолчанию параметры from и delivery_method_options.

delivery_method_options берутся из файла конфигурации, в случае если не будут найдены настройки, то подставятся стандартные из smtp_settings и также в консоль вывалится предупреждение.

# config/initializers/action_mailer.rb
smtp_settings = YAML.load_file(Rails.root.join("config", "smtp_settings.yml"))[Rails.env]
smtp_settings.map { |key, value| value.symbolize_keys! }
default = smtp_settings["default"] || smtp_settings.values.first
ActionMailer::Base.smtp_multiple_settings = smtp_settings
ActionMailer::Base.smtp_settings = default
# lib/extensions/action_mailer.rb
class ActionMailer::Base
class_attribute :smtp_multiple_settings
class << self
def use(email, name = nil)
self.default from: (name ? "#{name} <#{email}>" : email), delivery_method_options: self.find_smtp_settings(email)
end
def find_smtp_settings(email)
if email
options = self.smtp_multiple_settings.is_a?(Hash) && self.smtp_multiple_settings[email]
unless options
Rails.logger.warn "Not found smtp settings for #{email}, will use default."
end
end
options || self.smtp_settings
end
end
def smtp_settings(email = nil)
smtp_settings = self.class.find_smtp_settings(email)
end
end
# config/smtp_settings.yml
ya_defaults: &ya_defaults
address: 'smtp.yandex.ru'
port: 587
authentication: 'login'
enable_starttls_auto: true
default: &default
'email@example.com':
<<: *ya_defaults
user_name: 'email@example.com'
password: '123'
development:
<<: *default
test:
<<: *default
production:
<<: *default
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment