mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.5 KiB
66 lines
1.5 KiB
# frozen_string_literal: true
|
|
|
|
module HtmlToPlainTextInterceptor
|
|
module_function
|
|
|
|
def delivering_email(message)
|
|
process(message)
|
|
end
|
|
|
|
def previewing_email(message)
|
|
process(message)
|
|
end
|
|
|
|
def process(message)
|
|
return message unless html_part(message)
|
|
return message if message.text_part
|
|
|
|
add_text_part(message)
|
|
|
|
message
|
|
end
|
|
|
|
def add_text_part(message)
|
|
html = html_part(message).decoded
|
|
text = HtmlToPlainText.call(html)
|
|
|
|
text_part = Mail::Part.new do
|
|
content_type 'text/plain; charset=UTF-8'
|
|
body text
|
|
end
|
|
|
|
if pure_html_message?(message)
|
|
message.body = nil
|
|
message.content_type = 'multipart/alternative'
|
|
message.add_part(text_part)
|
|
message.add_part(Mail::Part.new do
|
|
content_type 'text/html; charset=UTF-8'
|
|
body html
|
|
end)
|
|
else
|
|
alternative = Mail::Part.new(content_type: 'multipart/alternative')
|
|
alternative.add_part(text_part)
|
|
alternative.add_part(message.html_part)
|
|
replace_part(message.parts, message.html_part, alternative)
|
|
end
|
|
end
|
|
|
|
def pure_html_message?(message)
|
|
message.content_type.to_s.include?('text/html')
|
|
end
|
|
|
|
def html_part(message)
|
|
pure_html_message?(message) ? message : message.html_part
|
|
end
|
|
|
|
def replace_part(parts, old_part, new_part)
|
|
if (index = parts.index(old_part))
|
|
parts[index] = new_part
|
|
else
|
|
parts.each do |part|
|
|
replace_part(part.parts, old_part, new_part) if part.respond_to?(:parts)
|
|
end
|
|
end
|
|
end
|
|
end
|