Rails HTML избегает сообщений электронной почты с открытым текстом

#html #ruby-on-rails #erubis

#HTML #ruby-on-rails #erubis

Вопрос:

Итак, Rails обладает замечательной возможностью отправки электронных писем с открытым текстом вместе с электронными письмами в формате HTML.

Вы просто добавляете .text.erb рядом с вашим .html.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: amp;

Escaped: amp;amp;

ERB: amp;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: amp;</li>
      <li>Escaped: amp;amp;</li>
      <li>ERB: amp;amp;</li>
    </ul>
  </body>
</html>


----==_mimepart_4eb03f1b708ce_178858111fcc057a4--
 

Теперь это текстовое представление ( app/views/application_mailer/index.text.erb ):

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

Escaped: amp;amp;

ERB: <%= "amp;" %>
 

Как вы можете видеть, результирующее текстовое электронное письмо переполнено.

Есть ли какой-нибудь способ предотвратить это?


Дальнейшее разъяснение:

Если вы нажмете HTML-сообщение электронной почты и просто отправите текст, вы получите это в почтовом клиенте (я использую Gmail):

тело письма

Как вы можете видеть, третья строка скрыта.

Очевидно, что вы можете вызывать html_safe каждую строку или raw каждый тег ERB, но, безусловно, должен быть способ заставить Rails / Erubis распознать тот факт, что он находится в текстовом электронном письме, и соответствующим образом экранировать.

Комментарии:

1. чтобы избежать слишком большого количества raw , я бы создал какой-нибудь вспомогательный метод предварительной обработки всего письма. Действительно, было бы интересно узнать, обрабатывает ли Rails текстовую электронную почту по-разному

Ответ №1:

В rails ‘lighthouse есть тема, в которой обсуждается проблема, и патч monkey пытается ее исправить. Попробуйте поместить это в инициализаторы и попробовать.

 # 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