You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sinatra应用中启用ActionMailer邮件预览功能?

解决Sinatra中ActionMailer预览功能的配置问题

1. 配置预览路径并加载预览文件

首先在Sinatra主应用文件(如app.rb)的开发环境配置块中,指定ActionMailer预览文件的存放路径,并确保文件能被正确加载:

configure :development do
  # 设置邮件预览文件目录
  ActionMailer::Base.preview_path = File.expand_path('../../spec/companyname/mailers/previews', __FILE__)
  
  # 自动加载所有预览文件
  Dir.glob("#{ActionMailer::Base.preview_path}/**/*.rb").each { |file| require file }
end

2. 添加Sinatra路由处理预览请求

Sinatra没有内置/rails/mailers路由,需要手动添加路由来支持预览页面的访问,这里提供两种方案:

方案一:借助Rails路由集合(推荐)

引入Rails相关模块,挂载ActionMailer预览的原生路由:

require 'action_mailer/preview'
require 'rails/controller'
require 'action_dispatch/routing/route_set'

# 初始化Rails路由集合
routes = ActionDispatch::Routing::RouteSet.new
routes.draw do
  get '/rails/mailers' => 'rails/mailers#index'
  get '/rails/mailers/*path' => 'rails/mailers#preview'
end

# 在Sinatra应用中使用该路由集合
use routes

方案二:手动实现轻量路由

如果不想引入过多Rails依赖,可自行编写简单路由和视图:

# 预览列表页路由
get '/rails/mailers' do
  previews = ActionMailer::Preview.all_previews
  erb :mailer_previews_index, locals: { previews: previews }
end

# 单个邮件预览路由
get '/rails/mailers/:preview_class/:preview_method' do
  preview_class = params[:preview_class].camelize.constantize
  email = preview_class.new.send(params[:preview_method])
  
  content_type email.mime_type
  email.body.encoded
end

然后创建views/mailer_previews_index.erb视图文件,展示所有预览选项:

<h1>邮件预览列表</h1>
<ul>
  <% previews.each do |preview_class, methods| %>
    <li><%= preview_class %>
      <ul>
        <% methods.each do |method| %>
          <li><a href="/rails/mailers/<%= preview_class.underscore %>/<%= method %>"><%= method %></a></li>
        <% end %>
      </ul>
    </li>
  <% end %>
</ul>

3. 修改Mailer避免预览时发送邮件

当前test_email方法会直接调用deliver_now,预览时也会实际发送邮件,需要添加判断逻辑:

module CompanyName
  class Mailer < ActionMailer::Base
    def test_email(recipient_email_address)
      email = mail(to: recipient_email_address, from: "no-reply@companyname.com", subject: "Testing ActionMailer") do |format|
        format.html { "<h1>Testing</h1>" }
      end
      # 仅非预览环境下发送邮件
      email.deliver_now unless ActionMailer::Preview.previewing?
      email
    end
  end
end

4. 确保Mailer文件加载路径正确

在Sinatra主文件中添加加载路径,保证lib目录下的Mailer能被识别:

$LOAD_PATH.unshift(File.expand_path('../lib', __FILE__))
require 'companyname/mailers/mailer'

完成以上配置后,重启Sinatra应用,访问http://localhost:26250/rails/mailers即可查看邮件预览列表,点击对应链接就能查看邮件内容。

内容的提问来源于stack exchange,提问作者NJRBailey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:15:45