【问题标题】:rails 4 email preview in production生产中的 rails 4 电子邮件预览
【发布时间】:2015-02-11 18:00:56
【问题描述】:

我正在使用 rails 4.1.1 和 ActionMailer::Preview 来预览电子邮件。在开发环境中,一切都运行良好。

但在生产环境中无法访问预览路线。我将预览存储在 test/mailers/previews/

是否可以将它们用于生产?

【问题讨论】:

    标签: email ruby-on-rails-4 actionmailer


    【解决方案1】:

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

    config.action_mailer.show_previews = true
    

    我在 Rails 4.1 中没有找到类似的东西。

    更新
    如果使用Rspec,例如,将需要添加路径:

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

    默认路径是“#{Rails.root}/test/mailers/previews”。

    而且无需接触 config.consider_all_requests_local

    【讨论】:

    • 应用程序响应“出于安全目的,此信息仅对本地请求可用。”如果我们尝试在服务器中执行它
    • 你也应该添加config.consider_all_requests_local = true
    • 我在 Rails 5 上,这个设置对我有用。但是,邮件预览可供全世界使用。我们必须想出办法来阻止非管理员用户。请注意,在生产环境中设置 config.consider_all_requests_local = true 是一个非常糟糕的主意——用户将看到内部堆栈跟踪和错误消息,而不是您的 404 或 500 页面。
    【解决方案2】:

    除此之外:

    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 可用。要在 Rails 4.1.1 的非开发环境中使用 ActionMailer 预览,您需要先向 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 一样,您仍然需要根据您的自定义环境是在本地使用还是在服务器上使用来调整上述本地请求配置。

    【讨论】:

    • 我必须切换 config.cache_classes = false 才能让它在 4.2.2 中工作,在任何其他版本中未经测试。
    • 一句警告,绝对不要设置config.consider_all_requests_local,因为这会将错误消息转储到浏览器,就像您在开发模式下看到的一样。您绝对不想在世界上有普通用户的生产环境中执行此操作。请参阅此线程中的“在不打开大安全漏洞的情况下执行此操作”答案!
    【解决方案3】:

    在不打开大的安全漏洞的情况下做到这一点:

    生产.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
    

    【讨论】:

    • 我添加了before_filter 并覆盖了::Rails::MailersController 类的local_request? 方法。但是MyApp::Application.configure 部分的更改似乎没有必要。似乎安全的方法是设置config.action_mailer.show_previews = true,然后使用您建议的底部。你能帮我了解一下路径和路线吗?
    【解决方案4】:

    正如最佳答案所说,config.action_mailer.show_previews = true 可以在生产中启用预览。

    我只想添加如何在您自己的管理区域内的 iframe 中呈现预览,例如。在active admin (Rails 5.1)

    而且我还发现write your own email previews administration 并不难,而且根本不使用rails 标准预览。然后,您可以添加自己的功能,例如更改预览参数或发送按钮以在手机中查看此电子邮件。

    【讨论】:

      【解决方案5】:

      这是我为 Rails 5.2 所做的:

      production.rb

        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 命名空间内查找。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 2014-10-23
        • 2016-01-27
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        相关资源
        最近更新 更多