diff options
author | Andrew White <andyw@pixeltrix.co.uk> | 2015-05-04 19:46:51 +0100 |
---|---|---|
committer | Andrew White <andyw@pixeltrix.co.uk> | 2015-05-04 19:46:51 +0100 |
commit | faaed863dd374b6c3c3ee0e317ed213edce1dd4d (patch) | |
tree | adf226d62861d1a546895843c867939cfc9c854c /actionmailer/lib/action_mailer | |
parent | fcc46833a88cb287e92dbfec76091a0fa29d3948 (diff) | |
download | rails-faaed863dd374b6c3c3ee0e317ed213edce1dd4d.tar.gz rails-faaed863dd374b6c3c3ee0e317ed213edce1dd4d.tar.bz2 rails-faaed863dd374b6c3c3ee0e317ed213edce1dd4d.zip |
Document inline image mailer preview interceptor
Explain what the interceptor is used for and how to remove it.
Diffstat (limited to 'actionmailer/lib/action_mailer')
-rw-r--r-- | actionmailer/lib/action_mailer/inline_preview_interceptor.rb | 61 | ||||
-rw-r--r-- | actionmailer/lib/action_mailer/preview.rb | 50 |
2 files changed, 62 insertions, 49 deletions
diff --git a/actionmailer/lib/action_mailer/inline_preview_interceptor.rb b/actionmailer/lib/action_mailer/inline_preview_interceptor.rb new file mode 100644 index 0000000000..dea5e52f0c --- /dev/null +++ b/actionmailer/lib/action_mailer/inline_preview_interceptor.rb @@ -0,0 +1,61 @@ +require 'base64' + +module ActionMailer + # Implements a mailer preview interceptor that converts image tag src attributes + # that use inline cid: style urls to data: style urls so that they are visible + # when previewing a HTML email in a web browser. + # + # This interceptor is enabled by default, to remove it delete it from the + # <tt>ActionMailer::Base.preview_interceptors</tt> array: + # + # ActionMailer::Base.preview_interceptors.delete(ActionMailer::InlinePreviewInterceptor) + # + class InlinePreviewInterceptor + PATTERN = /src=(?:"cid:[^"]+"|'cid:[^']+')/i + + include Base64 + + def self.previewing_email(message) #:nodoc: + new(message).transform! + end + + def initialize(message) #:nodoc: + @message = message + end + + def transform! #:nodoc: + return message if html_part.blank? + + html_source.gsub!(PATTERN) do |match| + if part = find_part(match[9..-2]) + %[src="#{data_url(part)}"] + else + match + end + end + + message + end + + private + def message + @message + end + + def html_part + @html_part ||= message.html_part + end + + def html_source + html_part.body.raw_source + end + + def data_url(part) + "data:#{part.mime_type};base64,#{strict_encode64(part.body.raw_source)}" + end + + def find_part(cid) + message.all_parts.find{ |p| p.attachment? && p.cid == cid } + end + end +end diff --git a/actionmailer/lib/action_mailer/preview.rb b/actionmailer/lib/action_mailer/preview.rb index 4888eac345..25ad7ee721 100644 --- a/actionmailer/lib/action_mailer/preview.rb +++ b/actionmailer/lib/action_mailer/preview.rb @@ -1,57 +1,9 @@ require 'active_support/descendants_tracker' -require 'base64' module ActionMailer module Previews #:nodoc: extend ActiveSupport::Concern - class InlineAttachments #:nodoc: - PATTERN = /src=(?:"cid:[^"]+"|'cid:[^']+')/i - - include Base64 - - attr_reader :message - - def self.previewing_email(message) - new(message).transform! - end - - def initialize(message) - @message = message - end - - def transform! - return message if html_part.blank? - - html_source.gsub!(PATTERN) do |match| - if part = find_part(match[9..-2]) - %[src="#{data_url(part)}"] - else - match - end - end - - message - end - - private - def html_part - @html_part ||= message.html_part - end - - def html_source - html_part.body.raw_source - end - - def data_url(part) - "data:#{part.mime_type};base64,#{urlsafe_encode64(part.body.raw_source)}" - end - - def find_part(cid) - message.all_parts.find{ |p| p.attachment? && p.cid == cid } - end - end - included do # Set the location of mailer previews through app configuration: # @@ -69,7 +21,7 @@ module ActionMailer # :nodoc: mattr_accessor :preview_interceptors, instance_writer: false - self.preview_interceptors = [ActionMailer::Previews::InlineAttachments] + self.preview_interceptors = [ActionMailer::InlinePreviewInterceptor] end module ClassMethods |