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

Ruby on rails 如何在YML文件中设置ActionMailer SMTP设置?,ruby-on-rails,configuration,actionmailer,Ruby On Rails,Configuration,Actionmailer,对于我的部署,我更喜欢在YML文件中的config/下设置所有Rails配置选项。我在操作\u mailer.smtp\u设置方面有特殊问题 我有一个文件,config/smtp.yml: development: address: localhost port: 1025 test: production: address: smtp.xs4all.nl port: 465 authentication: plain user_name: xxxxx passw

对于我的部署,我更喜欢在YML文件中的
config/
下设置所有Rails配置选项。我在
操作\u mailer.smtp\u设置方面有特殊问题

我有一个文件,
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?
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
这将加载
smtp.yml
文件,解析该文件并返回当前环境的哈希值,例如

 {"address"=>"smtp.xs4all.nl", "port"=>465, "authentication"=>"plain", "user_name"=>"xxxxx", "password"=>"xxxxx", "tls"=>true}
将密钥转换为符号并将其添加到smtp设置,例如:

  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}
但在部署到生产环境时,这会导致一些冲突,可能是因为某些部分尚未启动。Capistrano出现以下故障:

   * 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\u mailer.smtp\u设置在这里为零?如何确保actionMailers配置选项已加载?

深入挖掘,我发现问题在于
bundle exec rake RAILS\u ENV=production RAILS\u GROUPS=assets assets:precompile“
只加载一小部分,而不是
ActionMailer

在我的加载器中添加提前退出可以在
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?
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_设置还不必定义和填充默认值。因此,使用空散列作为前缀解决了整个问题:

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

尽管有点难看,但它确实起到了作用。

深入挖掘,我发现问题在于
bundle exec rake RAILS\u ENV=production RAILS\u GROUPS=assets assets:precompile“
只加载一小部分,而不加载例如
ActionMailer

在我的加载器中添加提前退出可以在
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?
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_设置还不必定义并填充默认值。因此,用一个空散列预先填充它可以解决整个问题:

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
尽管有点难看,但它确实起到了作用。

您可以使用:

Portfolio::Application.config.action_mailer.smtp_settings = config_for(:smtp)
您可以为此使用:

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

我认为“tls”不是smtp\u设置的有效字段,这可能是
Portfolio::Application.config.action\u mailer.smtp\u设置[:tls]
返回零的原因。看一看是的,我在文档中没有看到它,但对我来说,它解决了我得到证书错误的问题。设置此选项,修复了我的错误。我认为“tls”不是smtp\u设置的有效字段,这可能是
Portfolio::Application.config.action\u mailer.smtp\u settings[:tls]
返回零的原因。看一看是的,我在文档中没有看到它,但对我来说,它解决了我得到证书错误的问题。设置此设置,修复了我的错误。我几乎不建议添加。symbol\u keys方法公文包::Application.config.action\u mailer.smtp\u settings=config\u for(:smtp)。symbol\u keys我几乎不建议添加。symbol\u keys方法公文包::Application.config.action\u mailer.smtp\u settings=config\u for(:smtp)。symbol\u keys