如何在 Rails 中预览电子邮件?

Posted

技术标签:

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

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

【问题讨论】:

显然没有愚蠢的问题:D 【参考方案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 你必须自己构建类似的东西,我认为这不是完成这项工作的工具。 预览版在localhost:3000/rails/mailers/notifier/welcome,它们的列表在localhost:3000/rails/mailers。 如果您使用的是 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 文件夹中。

【讨论】:

以上是关于如何在 Rails 中预览电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

邮件预览中的灯具

如何使用 Sidekiq 在 Rails 中 3 分钟后发送电子邮件?

Rails:如何在多部分/替代电子邮件中使用部分(HTML 和纯文本)

Rails - 你如何测试 ActionMailer 在测试中发送了特定的电子邮件

如何从Rails的日志中删除邮件html内容?

如何在 Rails 6.1 中使用邮件程序?