【问题标题】:How do I preview emails in Rails?如何在 Rails 中预览电子邮件?
【发布时间】:2011-11-02 03:57:14
【问题描述】:

这可能是一个愚蠢的问题,但是当我在 Rails 中整理 HTML 电子邮件时,是否有一种特别简单的内置方法可以在浏览器中预览模板,或者我是否需要编写某种自定义控制器把它作为它的视图?

【问题讨论】:

  • 显然没有愚蠢的问题:D

标签: ruby-on-rails email


【解决方案1】:

Action Mailer 现在有一个内置的previewing emails in Rails 4.1 方式。例如,检查一下:

# located in test/mailers/previews/notifier_mailer_preview.rb

class NotifierPreview < ActionMailer::Preview
  # Accessible from http://localhost:3000/rails/mailers/notifier/welcome
  def welcome
    Notifier.welcome(User.first)
  end
end

【讨论】:

  • @andres 很确定这是设计使然——您不希望用户在生产服务器上预览您的邮件,它仅用于本地开发。
  • @mpowered 如果我确实希望用户能够预览/修改他们将要发送的邮件怎么办? (例如:经理拒绝用户申请,并发送电子邮件警告申请人)
  • @CyrilDD 你必须自己构建类似的东西,我认为这不是完成这项工作的工具。
  • 如果您使用的是 Rspec,您的预览会进入 spec/mailers/previews
【解决方案2】:

Daniel 的answer 是一个好的开始,但如果您的电子邮件模板包含任何动态数据,它将无法正常工作。例如。假设您的电子邮件是订单收据,并在其中打印出@order.total_price - 使用前面的方法,@order 变量将为 nil。

这是我使用的一个小食谱:

首先,由于此电子邮件预览功能绝对仅供内部使用,因此我在 admin 命名空间中设置了一些通用路由:

#routes.rb

MySite::Application.routes.draw do
  namespace :admin do
    match 'mailer(/:action(/:id(.:format)))' => 'mailer#:action'
  end
end

接下来,我创建控制器。在这个控制器中,我为每个电子邮件模板创建一个方法。由于大多数电子邮件包含动态数据,我们需要填充模板期望的任何成员变量。

这可以通过固定装置来完成,但我通常更喜欢只抓取一些伪随机真实数据。请记住——这不是一个单元测试——这纯粹是一个开发辅助。它不需要每次都产生相同的结果 - 事实上 - 如果不这样做可能会更好!

#app/controllers/admin/mailer_controller.rb
class Admin::MailerController < Admin::ApplicationController

  def preview_welcome()
    @user = User.last
    render :file => 'mailer/welcome.html.erb', :layout => 'mailer'
  end

end

请注意,当我们渲染模板时,我们使用layout=&gt;:mailer。这会将您的电子邮件正文嵌入到您创建的 HTML 电子邮件布局中,而不是典型的 Web 应用程序布局中(例如 application.html.erb)。

差不多就是这样。现在我可以访问http://example.com/admin/mailer/preview_welcome 预览对我的欢迎电子邮件模板的更改。

【讨论】:

  • 这实际上正是我所采用的方法,并且在我开始阅读您的答案时进行了编码 - 谢谢 :)
  • 很好的答案!正是我需要的!
  • 现在这是一个美味的食谱!感谢您的精彩回答!
  • 这是一个很棒的答案!谢谢!
  • 路由现在应该是get 'mailer...,而不是match
【解决方案3】:

37Signals 也有自己的邮件测试 gem,名为 mail_view。真是太棒了。

【讨论】:

  • 没问题。你最终使用了什么方式?
  • Bac 发布此内容时,我使用自己编写的自定义控制器解决了问题,但很快就会再次使用它,因此将对此进行试验
【解决方案4】:

我见过的最简单的设置是MailCatcher。设置需要 2 分钟,它适用于开箱即用的新邮件。

【讨论】:

  • 这确实很棒。安装速度非常快,适用于所有邮寄者!很棒的提示!
【解决方案5】:

我使用email_preview。试试看吧。

【讨论】:

    【解决方案6】:

    我很惊讶没有人提到letter_opener。每当在 dev 中发送电子邮件时,它都会以浏览器页面的形式呈现和打开电子邮件。

    【讨论】:

    • letter_opener 是一个很酷的宝石,它是必须拥有的。但有时邮件会从您希望避免播放的特殊事件开始,以纯粹检查邮件的 html/css。
    【解决方案7】:

    我最近编写了一个名为 Maily 的 gem,用于通过浏览器预览、编辑(模板文件)和发送应用程序电子邮件。它还提供了一种友好的数据挂钩方式、灵活的授权系统和极简的 UI。

    我计划在不久的将来添加新功能,例如:

    • 每封电子邮件有多个挂钩
    • 通过 UI 参数化电子邮件(邮件方法的参数)
    • 使用翻译键(列表、突出显示、...)

    希望对你有帮助。

    【讨论】:

      【解决方案8】:

      如果您使用rails g mailer CustomMailerrails 会生成邮件预览。 您将在spec/mailers/previews 文件夹中获得一个文件CustomMailerPreview

      您可以在这里编写调用邮件程序并生成预览的方法。

      前-

      class CustomMailerPreview < ActionMailer::Preview
        def contact_us_mail_preview
          CustomMailer.my_mail(user: User.first)
        end
      end
      

      http://localhost:3000/rails/mailers/custom_mailer预览所有电子邮件

      【讨论】:

      • 对于我的带有 rspec 的应用,我添加了 config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
      【解决方案9】:

      您可以使用Rails Email Preview

      REP 是一个用于预览和测试发送电子邮件的 Rails 引擎,具有 I18n 支持、简单的 premailer 集成以及可选的 CMS 编辑与comfortable_mexican_sofa

      【讨论】:

      • 是否有关于如何在 REP 和 CMS 之间实际进行集成的示例?
      • 我不知道有什么demo应用,但是有一个全面的article in the wiki
      【解决方案10】:

      无法直接从 Mailer 中预览它。 但正如您所写,您可以编写一个控制器,看起来像这样。

      class EmailPreviewsControllers < ActionController::Base
        def show
          render "#{params[:mailer]}_mailer/#{params[:method]}"
        end
      end
      

      但我认为,如果电子邮件看起来正确,那并不是测试电子邮件的最佳方法。

      【讨论】:

      • render "#{params[:mailer]}_mailer/#{params[:method]}", :layout =&gt; 'mailer' 会将电子邮件正文嵌入到您为应用创建的 HTML 电子邮件布局中。
      • 谢谢您-我不想仔细检查浏览器的兼容性,我会单独处理,我只是想快速吐出它并看看它的外观-我认为您的方法效果很好
      【解决方案11】:

      Rails Email Preview 帮助我们在开发模式下在 Web 浏览器中快速查看电子邮件。

      1) 将“gem ‘rails_email_preview’, ‘~&gt; 0.2.29’ “ 添加到 gem 文件并捆绑安装。

      2) 运行 “rails g rails_email_preview:install” 这会在 config 文件夹中创建初始化程序并添加路由。

      3) 运行 “rails g rails_email_preview:update_previews” 这个 crates mailer_previews 文件夹在 app 目录中。

      生成器将为您的每封电子邮件添加一个存根,然后您使用模拟数据填充存根。

      例如:

      class UserMailerPreview
      def invitation
      UserMailer.invitation mock_user(‘Alice’), mock_user(‘Bob’)
      end
      def welcome
      UserMailer.welcome mock_user
      end
      private
      def mock_user(name = ‘Bill Gates’)
      fake_id User.new(name: name, email: “user#{rand 100}@test.com”)
      end
      def fake_id(obj)
      obj.define_singleton_method(:id) { 123 + rand(100) }
      obj
      end
      end
      

      4) 搜索查询中的参数将作为实例变量用于预览类。例如:如果我们有一个类似的 URL “/emails/user_mailer_preview-welcome?user_id=1” @user_id 定义在 UserMailerPreview 的欢迎方法中,它可以帮助我们向特定用户发送邮件。

      class UserMailerPreview
      def welcome
      user = @user_id ? User.find(@user_id) : mock_user
      UserMailer.welcome(user)
      end
      end
      

      5) 像这样访问 REP 网址

      rails_email_preview.rep_root_url
      rails_email_preview.rep_emails_url
      rails_email_preview.rep_email_url(‘user_mailer-welcome’)
      

      6) 我们可以通过 REP 发送电子邮件,这将使用环境邮件设置。在初始化程序中取消注释此行以禁用在测试环境中发送邮件。

      config.enable_send_email = false
      

      来源:RailsCarma Blog : Previewing Emails in Rails Applications With the Mail_View Gem

      【讨论】:

        【解决方案12】:

        rails 6 中最简单的解决方案:只需记住一个 url:

        http://localhost:3000/rails/mailers

        【讨论】:

          【解决方案13】:

          我更喜欢mails_viewer gem。这个 gem 非常有用,因为它将 HTML 模板保存到 tmp 文件夹中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-11
            • 1970-01-01
            • 2016-01-27
            • 1970-01-01
            • 2014-10-23
            • 2013-02-07
            • 2019-09-20
            • 1970-01-01
            相关资源
            最近更新 更多