Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 动态配置SMTP设置时ActionMailer不传递邮件_Ruby On Rails_Email_Actionmailer - Fatal编程技术网

Ruby on rails 动态配置SMTP设置时ActionMailer不传递邮件

Ruby on rails 动态配置SMTP设置时ActionMailer不传递邮件,ruby-on-rails,email,actionmailer,Ruby On Rails,Email,Actionmailer,我正在尝试设置ActionMailer的SMTP设置,以便能够在运行时进行配置,但当发生这种情况时,它似乎无法连接到第三方服务来传递邮件。下面是两种情况,第一种情况是邮件将发送和传递,第二种情况是什么也不发生。我正在使用开发环境进行测试 此配置在两种情况下都是通用的 # config/environments/development.rb config.action_mailer.perform_deliveries = true config.action_mailer.raise_deli

我正在尝试设置ActionMailer的SMTP设置,以便能够在运行时进行配置,但当发生这种情况时,它似乎无法连接到第三方服务来传递邮件。下面是两种情况,第一种情况是邮件将发送和传递,第二种情况是什么也不发生。我正在使用开发环境进行测试

此配置在两种情况下都是通用的

# config/environments/development.rb

config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = false
config.action_mailer.default :charset => "utf-8"
config.action_mailer.delivery_method = :smtp
这是有效的:

# config/environments/development.rb

config.action_mailer.default_url_options = { host: 'www.mysite.com' }
config.action_mailer.smtp_settings = {
  :address              => "smtp.thirdpartyservice.com",
  :port                 => 587,
  :domain               => 'mysite.com',
  :user_name            => "me@mysite.com",
  :password             => "my-password",
  :authentication       => "plain",
  :enable_starttls_auto => true
}
这会传递邮件,但在跟踪日志时,请求会稍微延迟,因此我知道请求是向第三方服务发出的

这不起作用:

# config/environments/development.rb

config.action_mailer.default_url_options = { host: 'www.mysite.com' }
config.action_mailer.smtp_settings = {
  :address              => "smtp.thirdpartyservice.com",
  :port                 => 587,
  :domain               => 'mysite.com',
  :user_name            => "me@mysite.com",
  :password             => "my-password",
  :authentication       => "plain",
  :enable_starttls_auto => true
}
这是我想要的设置,使用我正在使用的自定义邮件程序

class MyCustomMailer < Devise::Mailer
  before_filter :use_smtp_settings

  def example_mailer(record)
    Rails.logger.warn self.smtp_settings
    @resource = record
    mail(to: record.email,
     from: AppSettings.first.mailer_sender,
     subject: "Example")
  end

  private

  def use_smtp_settings
    self.default_url_options[:host] = AppSettings.first.domain_address
    self.smtp_settings = {
      :address              => AppSettings.first.smtp_address,
      :port                 => AppSettings.first.smtp_port,
      :domain               => AppSettings.first.smtp_domain,
      :user_name            => AppSettings.first.smtp_username,
      :password             => AppSettings.first.smtp_password,
      :authentication       => "plain",
      :enable_starttls_auto => true
    }
  end
end
类MyCustomMailerAppSettings.first.smtp\u地址,
:port=>AppSettings.first.smtp\u端口,
:domain=>AppSettings.first.smtp\u域,
:user\u name=>AppSettings.first.smtp\u用户名,
:password=>AppSettings.first.smtp\u密码,
:身份验证=>“普通”,
:enable_starttls_auto=>true
}
终止
终止

#example_mailer()
方法中的rails记录器显示了第一个示例中使用的相同属性,尽管是从
app_settings
表中加载的。但是,当这次跟踪日志时,没有延迟,因此ActionMailer甚至不会尝试向第三方服务发出请求。

这将不起作用,因为您正在修改mailer实例上的smtp设置,但底层邮件gem会从mailer类级别属性读取它。Rails 4.0及更高版本中支持的方法是将名为:delivery\u method\u options的自定义头传递给邮件调用,例如:

class MyCustomMailer < Devise::Mailer
  before_filter set_default_host

  def example_mailer(record)
    mail to: record.email,
         from: app_mailer_sender,
         subject: "Example",
         delivery_method_options: app_smtp_settings
  end

  private

  def app_settings
    @app_settings || AppSettings.first
  end

  def app_domain_address
    app_settings.domain_address
  end

  def app_mailer_sender
    app_settings.mailer_sender
  end

  def app_smtp_settings
    self.smtp_settings = {
      address:              app_settings.smtp_address,
      port:                 app_settings.smtp_port,
      domain:               app_settings.smtp_domain,
      user_name:            app_settings.smtp_username,
      password:             app_settings.smtp_password,
      authentication:       "plain",
      enable_starttls_auto: true
    }
  end

  def set_default_host
    default_url_options[:host] = app_settings.domain_address
  end
end
类MyCustomMailer
结束


一个小提示-不要反复调用AppSettings.first,因为这会重新查询数据库(实际上AR查询缓存会捕获它,但每次都会创建一个新实例)。但你知道的没错;-)

真的!请注意,
mail()
选项中有一个输入错误。它应该是
delivery\u method\u options
而不是
delivery\u method\u settings
,尽管事实上所有的delivery方法都有*\u settings methods,我认为它应该是delivery\u method\u settings:-)