6

我正在使用 rails 3.2.5ActionMailer发送纯文本邮件。鉴于我有这样的邮件视图:

message_from_user.text.erb

Hi <%= @recipient.name %>,

You got the following message from <%= @sender.name %>:

<%= @message %>

什么时候@message"quotes & ampersands",那么纯文本邮件包含&quot;quotes &amp; ampersands&quot;. 所以看起来 Rails 只是将其视为 HTML 视图并转义任何 html 以防止跨站点脚本。然而,这是一封纯文本邮件。扩展是.text.erbActionMailer检测到这一点并将 MIME 设置为text/plain. 所以我永远不想逃避其中的任何html。

我的应用程序中有很多邮件模板,它们都是纯文本。我会考虑修补所有这些以包含<%=raw @message%><%= @message.html_safe %>不好的样式 -不是很干燥

我尝试了各种变通方法,包括修补 Erubis 的钱。它们似乎都不起作用。我正在寻找一些补丁或配置选项或任何禁用所有.text.erb文件转义 html 的东西。

任何帮助是极大的赞赏!

4

2 回答 2

8

通过 Erubis 代码调试几个小时后,我找到了以下修复。您可以将其放入config/initializers/fix_my_mails.rb. 我已经用 rails 3.2.7 对此进行了测试。它可能适用于其他版本。

module ActionView
  class Template
    module Handlers
      class ERB
        def call(template)
          if template.source.encoding_aware?
            # First, convert to BINARY, so in case the encoding is
            # wrong, we can still find an encoding tag
            # (<%# encoding %>) inside the String using a regular
            # expression
            template_source = template.source.dup.force_encoding("BINARY")

            erb = template_source.gsub(ENCODING_TAG, '')
            encoding = $2

            erb.force_encoding valid_encoding(template.source.dup, encoding)

            # Always make sure we return a String in the default_internal
            erb.encode!
          else
            erb = template.source.dup
          end

          self.class.erb_implementation.new(
            erb,
            :trim => (self.class.erb_trim_mode == "-"),
            :escape => template.identifier =~ /\.text/ # only escape HTML templates
          ).src
        end
      end
    end
  end
end

它只是禁用.text文件名中包含的每个 erb 文件中的 HTML 实体。

于 2012-08-01T16:04:32.887 回答
7

尝试

<%= @message.html_safe %>

如果您使用了搜索功能,您就会找到这个答案。如果这不符合您的需求,也许检查

https://rails.lighthouseapp.com/projects/8994/tickets/4858-actionmailer-is-html-escaping-ampersand-in-urls-in-plain-text-messages

如果您还没有看到,那里会讨论一些选项

于 2012-08-01T09:32:54.400 回答