【问题标题】:How to set Action Mailer defaults after config/initializers run?config/initializers 运行后如何设置 Action Mailer 默认值?
【发布时间】:2012-02-23 05:24:34
【问题描述】:

我想将电子邮件帐户信息存储在 config.yml 文件中。我正在按照我在网上看到并概述at this RailsCast 的常见模式将该信息加载到Rails config/initializers 文件中的常量中。我正在尝试使用 config/application.rb 文件中的 config.action_mailer.smtp_settings 为 Action Mailer 设置默认值,遵循Mat Harvard's Blog 上的示例。启动我的 Rails 服务器时,我不断收到未初始化的常量错误。我假设 application.rb 在配置/初始化程序之前被调用。是否有其他位置可以在启动期间设置 config.action_mailer.smtp_settings,但在 config/initializers 运行之后?

更新: 我在最初的帖子/问题中可能不清楚。我正在读取初始化程序中的 config.yml 文件。此配置文件存储电子邮件帐户信息,例如用户名和密码。我不想将此信息(用户名和密码)放在 application.rb 或 environment.rb 文件中。我确实尝试将我的代码移动到 environment.rb 文件,但在启动 rails 时遇到了相同的未初始化常量错误。

我设置动作邮件设置的代码如下所示:

  config.action_mailer.smtp_settings = {
    :address              => APP_CONFIG[:email_config][:address],
    :port                 => APP_CONFIG[:email_config][:port],
    :domain               => APP_CONFIG[:email_config][:email_domain],
    :user_name            => APP_CONFIG[:email_config][:user_name],
    :password             => APP_CONFIG[:email_config][:password],
    :authentication       => :plain,
    :enable_starttls_auto => true
  }

  config.action_mailer.default_url_options = {
    :host => APP_CONFIG[:email_config][:host]
  }

我正在读取 config.yml 文件以在 load_config.rb 初始化程序中设置 APP_CONFIG 常量。该文件包含以下两行:

raw_config = File.read(RAILS_ROOT + "/config/config.yml")
APP_CONFIG = YAML.load(raw_config)[RAILS_ENV]

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    你可以把这样的东西放在初始化器中:

    ActionMailer::Base.default_url_options = { :host => 'mysite.com' }
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用 Figaro 作为环境变量:

      # config/initializers/smtp_config.rb
      
      Rails.application.configure do
        ActionMailer::Base.smtp_settings = { address: Figaro.env.smtp_address,
                                               port: (Figaro.env.smtp_port || 587),
                                               domain: Figaro.env.smtp_domain,
                                               user_name: Figaro.env.smtp_user_name,
                                               password: Figaro.env.smtp_password,
                                               authentication: Figaro.env.smtp_authentication,
                                               enable_starttls_auto: Figaro.env.smtp_enable_starttls_auto,
                                               openssl_verify_mode: Figaro.env.smtp_openssl_verify_mode,
                                               ssl: Figaro.env.smtp_ssl,
                                               tls: Figaro.env.smtp_tls }
      end
      

      【讨论】:

        【解决方案3】:

        初始化器可能不适合存放这些信息,至少在 Rails 3 中是这样。按照official ActionMailer guide 中的指导方针,我会将信息放在环境文件中——我假设常量的定义会根据您所处的环境而改变,这将产生相同的效果。所以在 config/environments/production.rb 中:

        config.action_mailer.delivery_method = :smtp
        config.action_mailer.smtp_settings = {
          :address              => "smtp.gmail.com",
          :port                 => 587,
          :domain               => 'baci.lindsaar.net',
          :user_name            => '<username>',
          :password             => '<password>',
          :authentication       => 'plain',
          :enable_starttls_auto => true  }
        

        无耻地从我刚刚引用的指南中窃取。

        【讨论】:

        • 我试图避免将用户名和密码放在 application.rb 或 environment.rb 文件中。我已经更新了我的原始问题/帖子以包含代码示例。您在上面提供的配置代码不在初始化程序中 - 它在 application.rb 中。只是在我的 config.yml 文件中读取的代码在初始化程序中。
        • 那么在环境文件之前你有没有加载初始化程序?
        猜你喜欢
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 2017-07-06
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        相关资源
        最近更新 更多