Rails HTML转义明文电子邮件

时间:2011-11-01 18:59:33

标签: html ruby-on-rails erubis

因此,Rails具有发送纯文本电子邮件和HTML电子邮件的绝佳功能。

你只需在你的.html.erb旁边放一个.text.erb。我在这里提出了一个应用程序:https://github.com/cairo140/rails-email-test。只需下载并运行。访问主页并查看日志。

这是输出:

Sent mail to test@test.com (19ms)
Date: Tue, 01 Nov 2011 14:48:59 -0400
From: test@test.com
To: test@test.com
Message-ID: <4eb03f1b7403b_178858111fcc060bd@Steven-Xus-Macbook-Pro.local.mail>
Subject: test
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_4eb03f1b708ce_178858111fcc057a4";
 charset=UTF-8
Content-Transfer-Encoding: 7bit



----==_mimepart_4eb03f1b708ce_178858111fcc057a4
Date: Tue, 01 Nov 2011 14:48:59 -0400
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-ID: <4eb03f1b72b72_178858111fcc058ce@Steven-Xus-Macbook-Pro.local.mail>

Unescaped: &

Escaped: &amp;

ERB: &amp;


----==_mimepart_4eb03f1b708ce_178858111fcc057a4
Date: Tue, 01 Nov 2011 14:48:59 -0400
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-ID: <4eb03f1b73784_178858111fcc05933@Steven-Xus-Macbook-Pro.local.mail>

<!doctype html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <ul>
      <li>Unescaped: &</li>
      <li>Escaped: &amp;</li>
      <li>ERB: &amp;</li>
    </ul>
  </body>
</html>


----==_mimepart_4eb03f1b708ce_178858111fcc057a4--

现在,这是文本视图(app/views/application_mailer/index.text.erb):

$ cat app/views/application_mailer/index.text.erb 
Unescaped: &

Escaped: &amp;

ERB: <%= "&" %>

正如您所看到的,生成的文本电子邮件已经过时了。

有没有办法阻止这种情况?


进一步澄清:

如果您压制HTML电子邮件并只发送文本,则可以在电子邮件客户端(我正在使用Gmail)中获取此信息:

email body

正如你所看到的,第三条线是过度的。

显然,你可以在每个字符串上调用html_safe,或者在每个ERB标记上调用raw,但是当然,必须有一种方法可以让Rails / Erubis识别它在文本中的事实电子邮件并相应地逃脱。

1 个答案:

答案 0 :(得分:5)

有一个thread在rails'灯塔里讨论这个问题,而monkey patch试图修复它。尝试将其放入初始化器并试一试。

# fix_erubis_non_escape_sequence.rb
module ActiveSupport
  class SafeBuffer < String
    alias safe_append= safe_concat
  end
end

module ActionView
  class Template
    module Handlers
      class Erubis < ::Erubis::Eruby
        def add_expr_escaped(src, code)
          if code =~ BLOCK_EXPR
            src << "@output_buffer.safe_append= " << code
          else
            src << "@output_buffer.safe_concat((" << code << ").to_s);"
          end
        end
      end
    end
  end
end