如何在YML文件中设置ActionMailer SMTP设置?

时间:2013-12-18 17:11:04

标签: ruby-on-rails configuration actionmailer

对于我的部署,我更喜欢在config/下的YML文件中包含所有Rails配置选项。我对action_mailer.smtp_settings有特殊问题。

我有一个文件config/smtp.yml

development:
  address: localhost
  port: 1025

test:

production:
  address: smtp.xs4all.nl
  port: 465
  authentication: plain
  user_name: xxxxx
  password: xxxxx
  tls: true

然后我尝试通过初始化程序包含这些值。 config/initializers/smtp.rb

options = YAML.load_file(Rails.root.join('config', 'smtp.yml'))[Rails.env]

options.each do |name, value|
  Portfolio::Application.config.action_mailer.smtp_settings[name.to_sym] = value
end unless options.nil?

这将加载smtp.yml文件,解析该文件并返回当前环境的哈希值,例如

 {"address"=>"smtp.xs4all.nl", "port"=>465, "authentication"=>"plain", "user_name"=>"xxxxx", "password"=>"xxxxx", "tls"=>true}

将键转换为符号并将其添加到smtp-settings中,结果如下:

  irb(main):002:0> Portfolio::Application.config.action_mailer.smtp_settings
  => {:port=>465, :address=>"smtp.xs4all.nl", :authentication=>"plain", :user_name=>"xxxxx", :password=>"xxxx", :tls=>true}

但是在部署到生产时,这会导致一些冲突,可能是因为某些部分尚未启动。卡皮斯特拉诺失败了:

   * executing "cd -- /var/www/ANT_cms/releases/20131218170336 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"
servers: ["li153-5.members.linode.com"]
[li153-5.members.linode.com] executing command
 ** [out :: li153-5.members.linode.com] rake aborted!
 ** [out :: li153-5.members.linode.com] undefined method `[]=' for nil:NilClass

为什么我的Portfolio::Application.config.action_mailer.smtp_settings为零?如何确保已加载actionMailers配置选项?

3 个答案:

答案 0 :(得分:4)

深入挖掘,我发现问题是bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"只加载了一小部分,而不是ActionMailer

在我的加载程序中添加早期退出修复了config/initializers/smtp.rb

unless Portfolio::Application.config.action_mailer.nil?

  options = YAML.load_file(Rails.root.join('config', 'smtp.yml'))[Rails.env]

  options.each do |name, value|
    Portfolio::Application.config.action_mailer.smtp_settings[name.to_sym] = value
  end unless options.nil?

end

然后,下一个问题是生产中的action_mailer已设置,但是不必定义smtp_settings并使用默认值填充。因此,使用空哈希预先填充这个问题可以解决整个问题:

unless Portfolio::Application.config.action_mailer.nil?

  Portfolio::Application.config.action_mailer.smtp_settings = {}

  options = YAML.load_file(Rails.root.join('config', 'smtp.yml'))[Rails.env]

  options.each do |name, value|
    Portfolio::Application.config.action_mailer.smtp_settings[name.to_sym] = value
  end unless options.nil?
end

仍然有些丑陋,但它确实起作用。

答案 1 :(得分:2)

您可以使用config_for

Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp)

答案 2 :(得分:0)

Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp).symbolize_keys