如何在 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=>: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 CustomMailer
,rails
会生成邮件预览。
您将在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 => 'mailer'
会将电子邮件正文嵌入到您为应用创建的 HTML 电子邮件布局中。
谢谢您-我不想仔细检查浏览器的兼容性,我会单独处理,我只是想快速吐出它并看看它的外观-我认为您的方法效果很好【参考方案11】:
Rails Email Preview 帮助我们在开发模式下在 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”
这个 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 和纯文本)