ruby-on-rails rails 4生产中的电子邮件预览

khbbv19g  于 2023-01-06  发布在  Ruby
关注(0)|答案(5)|浏览(226)

我正在使用rails 4.1.1和ActionMailer::Preview来预览电子邮件。在开发环境中,一切都运行得很好。
但是在生产环境中预览路径是不可访问的。我将预览存储在test/mailers/previews/
是否有可能使它们投入生产?

camsedfj

camsedfj1#

除此之外:

config.action_mailer.show_previews = true

您还需要设置

config.consider_all_requests_local = true

在您的环境中,预览路由是可访问的。这也有其他含义(请参阅https://stackoverflow.com/a/373135/1599045),所以您可能不希望在生产中启用此功能。但是,如果您有一个非development的自定义环境,这两者的组合应该可以使事情正常工作。

    • 编辑后添加:**

最初的问题是针对rails 4.1.1的,它没有config.action_mailer.show_previews可用。要让ActionMailer预览在rails 4.1.1的非开发环境中工作,首先需要向config/routes.rb添加一些路由(在本例中,我的环境名为custom):

if Rails.env.custom?
  get '/rails/mailers'         => "rails/mailers#index"
  get '/rails/mailers/*path'   => "rails/mailers#preview"
end

然后,您需要在您的环境的配置文件(在我的例子中,config/environments/custom.rb)中自动加载所需的库:

config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
config.autoload_paths += [config.action_mailer.preview_path]

这似乎执行与config.action_mailer.show_previews相同的任务。
与4.2一样,您仍然需要如上所述调整本地请求配置,这取决于您的自定义环境是在本地使用还是在服务器上使用。

rqdpfwrv

rqdpfwrv2#

要做到这一点而不打开一个大的安全漏洞:

生产.rb

MyApp::Application.configure do
  config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/spec/mailer_previews" : nil
  config.autoload_paths += [config.action_mailer.preview_path]

  routes.append do
    get '/rails/mailers'         => "rails/mailers#index"
    get '/rails/mailers/*path'   => "rails/mailers#preview"
  end
end

class ::Rails::MailersController
  before_filter :authenticate_admin!
  def local_request?
    true
  end
  private
  def authenticate_admin!
    ...
  end
end
mwyxok5s

mwyxok5s3#

正如最佳答案所说的那样,可以通过config.action_mailer.show_previews = true在生产中启用预览。
我只是想补充一下如何在自己的管理区域内渲染iframe预览,例如在active admin(Rails 5.1)中。
我还发现write your own email previews administration并不难,而且根本不用rails标准预览,你可以添加自己的功能,比如修改预览参数或者点击发送按钮在手机上查看这封邮件。

h7appiyu

h7appiyu4#

从Rails 4.2开始,您可以在生产. rb(或其他自定义环境)中使用该标志:

config.action_mailer.show_previews = true

我还没有在Rails4.1中找到任何类似的东西。

    • 更新**:

例如,如果使用Rspec,则需要添加路径:

config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"

默认路径为"#{Rails. root}/test/mailers/previews"。
而且无需触摸配置。考虑所有请求本地

rwqw0loc

rwqw0loc5#

下面是我为Rails 5.2所做的工作:
第一个月

config.action_mailer.show_previews = true
  config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/spec/mailers/previews" : nil

  class ::Rails::MailersController
    include ::ApplicationController::Authorization
    before_action :require_admin
  end

假设您的ApplicationController::Authorization模块包含require_admin的代码,我宁愿使用这种方法,也不愿重写我的授权代码,记住在前面包含::是很棘手的,因为说include ApplicationController::...将在Rails::MailersController名称空间中查找。

相关问题