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


116

这可能是一个愚蠢的问题,但是当我在Rails中整理HTML电子邮件时,是否有一种特别简单的内置方法来在浏览器中预览模板,还是我需要编写某种自定义控制器来将其拉出在其看来?


2
显然没有任何愚蠢的问题:D
knagode

Answers:


133

Action Mailer现在具有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

5
@andres可以肯定的是,这是设计使然–您不希望用户在生产服务器上预览您的邮件,这仅用于本地开发。
强力驱动

1
@mpowered如果我希望用户能够预览/修改他们将要发送的邮件该怎么办?(例如:经理拒绝用户申请,并发送电子邮件警告申请人)
Cyril Duchon-Doris

2
@CyrilDD您必须自己构建类似的东西,我认为这不是完成该工作的工具。
benjaminjosephw 2015年


8
如果您使用的是Rspec,则可以进行预览spec/mailers/previews
Drew Stephens

73

Daniel的答案是一个好的开始,但是,如果您的电子邮件模板包含任何动态数据,它将无法正常工作。例如,假设您的电子邮件是订单收据,并且在其中打印出来@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=>:mailer。这会将您的电子邮件正文嵌入到您创建的HTML电子邮件布局中,而不是将其嵌入到典型的Web应用程序布局中(例如application.html.erb)。

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


实际上,这正是我开始阅读您的答案时所采用并刚刚编码的方法-谢谢:)
Peter Nixey

好答案!正是我需要的!
卡尔加尔2012年

现在,这是一个美味的食谱!感谢您的出色回答!
罗伯·库珀

这是一个了不起的答案!谢谢!
OzBandit

5
该路线get 'mailer...现在应改为match
Patrick Berkeley

18

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


没问题。您最终使用什么方式?
马克2012年

Bac当我发布此内容时,我用自己编写的自定义控制器解决了该问题,但很快就会再次遇到该问题,因此将对此进行试验
Peter Nixey 2012年

16

我见过的最简单的设置是MailCatcher。安装过程耗时2分钟,它对新邮件开箱即用。


这确实很棒。设置非常快,适用于所有邮件!大提示!
rept


5

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

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

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

希望对您有所帮助。



4

rails如果使用,将生成邮件预览rails g mailer CustomMailer。你会得到一个文件CustomMailerPreview里面spec/mailers/previews的文件夹。

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

对于前-

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"
Mauro

3

Rails电子邮件预览可帮助我们在开发模式下通过Web浏览器快速查看电子邮件。

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

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

3)“rails g rails_email_preview:update_previews”在应用目录中运行此板条箱mailer_previews文件夹。

Generator会在您的每封电子邮件中添加一个存根,然后您用模拟数据填充存根。

例如:

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在welcome方法中定义的,UserMailerPreview它可以帮助我们向特定用户发送邮件。

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

5)像这样访问REP URL

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博客:使用Mail_View Gem在Rails应用程序中预览电子邮件


3

我很惊讶没有人提到letter_opener。这是一颗宝石,每当在dev中发送电子邮件时,它将作为浏览器页面呈现和打开电子邮件。


1
letter_opener是一个很棒的宝石,它是必须具备的。但是有时邮件从特殊事件开始,您希望避免播放这些事件来纯粹检查邮件的html / css。
Mauro

2

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

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

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


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'会将电子邮件正文嵌入您为应用创建的HTML电子邮件布局中。
dexter

谢谢-我不想重复检查浏览器的兼容性,我会分开对待,我只是想快速地吐出东西,看看它的外观-我认为您的方法很适合
Peter Nixey

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.