允许用户在 Rails 中为 ActionMailer 创建自定义电子邮件模板

Allow user to create custom email template for ActionMailer in Rails

我想让 rails 应用程序的用户通过表单创建自己的电子邮件模板,并将其用作将发送邮件的网站标准电子邮件模板表单,但我找不到任何教程,它还需要包含几个动态变量。

有明确的方法吗?

( 因此用户将在引用变量的表单中输入电子邮件文本 将在发送前进行评估)

最简单的方法是将它存储到您的 rails 数据库中。所以你应该创建一个名为 EmailTemplate 的 rails 模型,它有一个字段 body 类型 text.

接下来创建表单以更新或创建新模板。

使用此特定模板并将其作为电子邮件发送。创建一个 Rails 邮件程序,并在视图中加载相应的 EmailTemplate。所以在视图中它将如下所示。

<%= EmailTemplate.find(id).body.html_safe %>

以上方法是最简单的方法。如果您还想让用户访问您系统中的各种变量,那么我建议您查看流动标记语言 (https://github.com/Shopify/liquid/)。

您可以通过多种方式实现它。这是一种方法。

首先,您需要将用户生成的电子邮件模板存储在数据库中。

CustomEmailTemplate.create(user_id: params[:user_id], template_body: params[:template_body])

当需要为模板发送电子邮件时,您可以执行如下操作:

custom_values = { name: "Whatever", value: "nice" }
template = CustomEmailTemplate.find(template_id)
CustomerEmailer.send_email(template, custom_values).deliver

要使其真正起作用,您需要在邮件程序中执行如下操作:

def send_email(template, custom_values)
    @template = template
    @custom_values = custom_values
    mail subject: "Your subject goes here.."
end

在 send_email.html.erb 中,执​​行如下操作:

<%= @template.template_text.gsub(/@@name@@/, @custom_values[:name]).gsub(/@@value@@/, @custom_values[:value]) %>

您看到模板包含“@@name@@”和“@@value@@”。这些是您可以用自定义值替换的标记。

当然,你可以重构这段代码,将替换逻辑放入模型等中,使其成为"clean code"。

希望对您有所帮助。

我会修改 Yosep 的想法以避免使用实际的 erb 模板。使用 body arg 直接发送邮件,因为它的性能开销较小。

例如

def send_email(template, custom_values)
    body = template.template_text\
     .gsub(/@@name@@/, custom_values[:name])
     .gsub(/@@value@@/, custom_values[:value]
    mail subject: "Your subject goes here..", body: body
end

您可以使用 panaromic gem 将视图存储在数据库中。这将允许 Rails 根据 path 列和 handler 自动搜索数据库中的关联视图。

要通过 UI 访问变量,可以使用液体模板。 liquid-rails 提供了一种将液体模板用作 Rails 视图的方法。现在,如果您将 handler 列更新为 .liquid,您可以将视图作为液体模板存储在数据库中。

  1. 添加模型
class NotificationTemplate < ApplicationRecord
  store_templates
end
  1. 创建模板
NotificationTemplate.create(
  id: 1,
  body: "<p>Hi {{user_name}}, Thanks for your feedback</p>",
  path: "feedback_response_mailer/send_response_mail",
  locale: nil,
  handler: "liquid",
  partial: false,
  format: "html"
}
  1. 添加使用 liquid
  2. 的邮件程序
class FeedbackResponseMailer < ApplicationMailer
  prepend_view_path NotificationTemplate.resolver
  def send_response_mail
    @user = User.find(params[:user_id])
    mail(to: @user.email, subject: 'Thank you')
  end
  def liquid_assigns
    { 'user_name' => @user.name }
  end
end