【问题标题】:Rails email preview for users in production生产中用户的 Rails 电子邮件预览
【发布时间】:2015-02-19 19:18:58
【问题描述】:

上下文

mail_view、mailcatcher、rails_email_preview 等 Gem 似乎更面向开发人员(一种调试模板的方法)。但我需要我的 Rails 应用程序的受信任用户在生产中使用的东西

我的应用程序是一个项目管理应用程序,项目经理可以在其中更新他们的项目状态、操作,在此期间必须向项目承包商、开发人员、客户等发送电子邮件。

项目经理必须能够判断他是否要发送电子邮件(这很容易),并且能够在一定程度上自定义消息内容(不是设计,只有特定的文本部分就足够了) .他们确实希望对即将发送的电子邮件进行一些控制,即他们需要预览他们自定义的电子邮件。为什么?

  1. 项目经理是受信任的用户/程序员,我让他们添加 HTML 作为电子邮件的自定义部分(我们谈论的是小型应用程序,项目经理都是受信任的员工)。但是结束标签很容易被遗忘,所以我想为他们提供一种方法来检查是否有任何问题。例如。文本不会全部显示为<h2>,只是因为他们忘记了结束</h2>
  2. 一些电子邮件模板已经包含一些关于 PM 所写内容的信息,而 PM 可能不知道(理解:可能喝得太醉而记不住)。电子邮件预览只是避免重复句子的一种方法(例如两次Hello M. President,
  3. CSS 样式应用于电子邮件。很难预料<h2> 等标签的效果。所以我需要使用 CSS 呈现电子邮件

备注

预览和发送按钮

项目经理可以访问将内容提供给我的 Rails 应用程序的表单。我正在考虑同时拥有一个普通的提交按钮和一个预可视化按钮。我可能会使用this SO question 给出的一些技巧来区分两个按钮的行为

Letter_opener : 一个不错的宝石,但独一无二?

我正在使用 letter_opener 进行调试(因此上下文不同),但 这通常是我想向项目经理展示的预览。但是为了使用,letter_opener 需要修改action_mailer 配置config.action_mailer.delivery_method = :sendmail # (or :letter_opener)。所以我只能预览电子邮件,或者真实发送它们,而不是两者?我会接受一个解决方案,让我选择是使用 letter_opener 还是真正发送电子邮件

小编辑器?

与其盲目相信我的项目经理编写基本 html 而不会忘记结束标记的能力,也许您可​​以推荐一个不错的 WYSIWYG 编辑器来显示我的 f.text_area() 的内容? 这将是一个奖励,而不是我的问题的实际答案

邮件渲染引擎?

我现在知道不同的电子邮件客户端可以以不同的方式呈现电子邮件客户端。我暂时忽略这个。所以预览的呈现方式并不重要。不过我喜欢letter_opener 的渲染

当前代码

视图 > 控制器 > 邮件程序

my_email_view.html.erb

<%= form_tag some_mailing_list_path %>
  <%= fields_for :email do |f| %>
  <!-- f.text_field(:subject, ....), etc -->
  <% end %>

  <%= submit_tag("Send email") %>
  <%= submit_tag("Preview") %>
<% end %>

my_controller.rb

before_action :prep_email # Strong parameters, define @mail with form contents

# Handles the POST 
def some_action
  check(:to, :from, :subject) # I check the parameters in private functions
  if email_alright? # Above checks will raise a flag if something went wrong
      if Rails.env.production?
        MailingListsMailer.my_action(@mail).deliver_later
      else
        MailingListsMailer.my_action(@mail).deliver_now
      end
      flash.notice = "Email sent"
      redirect_to :back
    else
      redirect_to :back
    end
end

mailing_list_mailer.rb

def my_action(message)
    format_mail_params(message) # Will set more variables
    @etude = etude
    @include_reference = message[:include_reference]
    @include_description = message[:include_description]
    dst = Proc.new { read_emails_file }
    mail(
      to: dst,
      from: message[:from],
      subject: @subject_full)
  end

【问题讨论】:

  • 您的目标是什么电子邮件客户端?在 Outlook 中查看的电子邮件可能与在 Gmail、Hotmail 或 Thunderbird 中呈现时的外观大不相同。
  • 电子邮件客户端之间真的有区别吗?好吧,当我说“它的真实样子”时,我的意思是在 rails 应用程序插入了与数据库相关的内容之后。我在一些电子邮件中确实有一些 HTML/CSS 样式,但我想如果它们在电子邮件客户端之间看起来不完全相同也没关系。
  • current state of html email的简要说明。
  • 感谢您的信息。这绝对是我会记住的。假设对于这个问题,我正在寻找一种方法来产生类似于letter_opener gem 的输出,或者甚至在通过 rails 处理后加载电子邮件 .erb 模板就足够了

标签: ruby ruby-on-rails-4 email


【解决方案1】:

问题更新:根据您的伪代码,这是一个创建状态更新模型并将更新通过电子邮件发送到邮件列表的简单案例。

有几种方法可以解决,但我建议你保持简单,避免使用 gem。

<%= link_to "New update", new_status_update_path, class: 'button' %>

型号

class StatusUpdate
  belongs_to :sender, class_name: 'User'
  belongs_to :mailing_list
end

控制器

class StatusUpdateController
   def new
      @status_update = StatusUpdate.new
   end

   def create
      @status_update = StatusUpdate.create(status_update_params)
      @status_update.mailing_list = MailingList.where(whichever_mailing_list)
      if @status_update.save
        redirect_to :action => "preview", :status_update => @status_update
      end
   end

   def preview
     @status_update = StatusUpdate.where(id: params[:id]).first
     @mailing_list = MailingList.where(id: @status_update.mailing_list_id)
   end

   def send
      @status_update = StatusUpdate.where(id:params[:status_update_id]).first
      Mailer.status_update_email(@status_update).deliver
   end
end

status_updates/new.html.erb

<%= simple_form_for(@status_update) do |f| %>    
    <%= f.input :title %> 
    <%= f.input :content, as: :text %>
    <%= f.button :submit, 'Post update' %>
<% end %>

status_updates/preview.html.erb

<h1>Preview</h1>
<%= simple_form_for(@status_update, :url => url_for(:controller => 'StatusUpdateController, :action => 'send') do |f| %>

    <%= f.input :subject %>

    <div class="email-render-container">
      <%= @status_update.content %>
    </div>

    <p>Make changes</p>
    <%= f.input :content, as: :text %>

    <%= f.button :submit, 'Approve and send emails' %>
<% end %>

如果我是你,我会取消预览功能。如果你是 从模板加载内容而您所担心的只是 潜在的重复内容,只需这样做:

控制器

class StatusUpdateController
  def new
      @status_update = StatusUpdate.new
      template = UpdateTemplate.where(however_you_assign_the_template)
      @status_update.content = template.content
  end

  def create
      @status_update = StatusUpdate.create(status_update_params)
      @status_update.mailing_list = MailingList.where(whichever_mailing_list)
      if @status_update.save
        Mailer.status_update_email(@status_update).deliver
      end
   end
end

并使用 css 为新的状态更新表单设置样式,以模拟在实际电子邮件模板上的书写。您将为您的用户和您自己节省大量时间。


所见即所得编辑器

永远不要相信最终用户有能力编写 html。根据您的需要,我发现https://www.froala.com/wysiwyg-editor 易于部署。

区分按钮

只需在按钮上使用带有标签的预览图标和/或在按钮下使用副标题来区分您的按钮。您的视图中不需要太多的命令逻辑。

或者,如果您认为预览对您的最终用户很重要,只需使用“预览”按钮作为下一个合乎逻辑的步骤,而不是为您的用户提供太多不必要的选择。

建议

采用像 Angularjs 这样的前端框架可以让这种用例变得非常简单,但如果你不熟悉它,它可能会有点矫枉过正,而且学习曲线陡峭。

【讨论】:

  • 嗯等等,你建议我使用email 模型?所以我应该为每种我发送的电子邮件类型提供一个电子邮件模型?到目前为止,我从未考虑过将电子邮件保存到数据库,但这实际上是个好主意...
  • @CyrilDD 它只是您跟踪的任何模型的占位符,因为您没有详细说明跟踪项目更新的方式。它可以是通知模型或 status_update 模型或您喜欢的任何模型。我将编辑答案以使其更清楚。
  • @CyrilDD 如果您需要更具体的内容,如果您发布一些详细说明您如何实现此功能的代码,将会有所帮助。
  • 是的,你是对的,我将添加我当前实现的细节。我实际上并没有真正跟踪模型。
  • 嗯,是的,我喜欢new &gt; save_preview &gt; validate_preview &gt; send 的这种流程。我将不得不做更多的工作,因为我的电子邮件模板是使用工具生成的,该工具产生了可怕的代码(我不确定我是否可以在&lt;div class="email-render-container"&gt; 中重现电子邮件的样式)
【解决方案2】:

看看letter_opener gem。它是由 Railscasts 人 Ryan Bates 创建的。

【讨论】:

  • 谢谢,这很有趣,但是预可视化只是一个可选步骤,之后项目经理应该仍然可以发送电子邮件!
猜你喜欢
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 2011-11-02
  • 1970-01-01
  • 2016-01-27
  • 2014-10-23
  • 2019-02-16
相关资源
最近更新 更多