mirror of
https://github.com/redmine/redmine.git
synced 2025-12-16 05:20:28 +01:00
Option to parse HTML part of multipart (HTML) emails first (#30838).
Patch by Yuichi HARADA. git-svn-id: http://svn.redmine.org/redmine/trunk@17913 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -447,16 +447,23 @@ class MailHandler < ActionMailer::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the text/plain part of the email
|
# Returns the text content of the email.
|
||||||
# If not found (eg. HTML-only email), returns the body with tags removed
|
# If the value of Setting.mail_handler_preferred_body_part is 'html',
|
||||||
|
# it returns text converted from the text/html part of the email.
|
||||||
|
# Otherwise, it returns text/plain part.
|
||||||
def plain_text_body
|
def plain_text_body
|
||||||
return @plain_text_body unless @plain_text_body.nil?
|
return @plain_text_body unless @plain_text_body.nil?
|
||||||
|
|
||||||
# check if we have any plain-text parts with content
|
parse_order =
|
||||||
@plain_text_body = email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/plain'}).presence
|
if Setting.mail_handler_preferred_body_part == 'html'
|
||||||
|
['text/html', 'text/plain']
|
||||||
# if not, we try to parse the body from the HTML-parts
|
else
|
||||||
@plain_text_body ||= email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/html'}).presence
|
['text/plain', 'text/html']
|
||||||
|
end
|
||||||
|
parse_order.each do |mime_type|
|
||||||
|
@plain_text_body ||= email_parts_to_text(email.all_parts.select {|p| p.mime_type == mime_type}).presence
|
||||||
|
return @plain_text_body unless @plain_text_body.nil?
|
||||||
|
end
|
||||||
|
|
||||||
# If there is still no body found, and there are no mime-parts defined,
|
# If there is still no body found, and there are no mime-parts defined,
|
||||||
# we use the whole raw mail body
|
# we use the whole raw mail body
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
<em class="info"><%= l(:text_comma_separated) %>
|
<em class="info"><%= l(:text_comma_separated) %>
|
||||||
<%= l(:label_example) %>: smime.p7s, *.vcf</em>
|
<%= l(:label_example) %>: smime.p7s, *.vcf</em>
|
||||||
</p>
|
</p>
|
||||||
|
<p><%= setting_select :mail_handler_preferred_body_part, [['Text', 'plain'], ['HTML', 'html']] %></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="box tabular settings">
|
<div class="box tabular settings">
|
||||||
|
|||||||
@@ -422,6 +422,7 @@ en:
|
|||||||
setting_mail_handler_enable_regex: "Enable regular expressions"
|
setting_mail_handler_enable_regex: "Enable regular expressions"
|
||||||
setting_mail_handler_api_enabled: Enable WS for incoming emails
|
setting_mail_handler_api_enabled: Enable WS for incoming emails
|
||||||
setting_mail_handler_api_key: Incoming email WS API key
|
setting_mail_handler_api_key: Incoming email WS API key
|
||||||
|
setting_mail_handler_preferred_body_part: Preferred part of multipart (HTML) emails
|
||||||
setting_sys_api_key: Repository management WS API key
|
setting_sys_api_key: Repository management WS API key
|
||||||
setting_sequential_project_identifiers: Generate sequential project identifiers
|
setting_sequential_project_identifiers: Generate sequential project identifiers
|
||||||
setting_gravatar_enabled: Use Gravatar user icons
|
setting_gravatar_enabled: Use Gravatar user icons
|
||||||
|
|||||||
@@ -195,6 +195,8 @@ mail_handler_api_enabled:
|
|||||||
mail_handler_api_key:
|
mail_handler_api_key:
|
||||||
default:
|
default:
|
||||||
security_notifications: 1
|
security_notifications: 1
|
||||||
|
mail_handler_preferred_body_part:
|
||||||
|
default: plain
|
||||||
issue_list_default_columns:
|
issue_list_default_columns:
|
||||||
serialized: true
|
serialized: true
|
||||||
default:
|
default:
|
||||||
|
|||||||
38
test/fixtures/mail_handler/different_contents_in_text_and_html.eml
vendored
Normal file
38
test/fixtures/mail_handler/different_contents_in_text_and_html.eml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
From JSmith@somenet.foo Sun Mar 02 23:30:00 2019
|
||||||
|
From: John Smith <JSmith@somenet.foo>
|
||||||
|
Content-Type: multipart/mixed; boundary="Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9"
|
||||||
|
Message-Id: <BB533668-3CC8-41CA-A951-0A5D8EA37FB0@somenet.foo>
|
||||||
|
Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\))
|
||||||
|
Subject: Different contents in text part and HTML part
|
||||||
|
Date: Sun, 03 Mar 2019 08:30:00 +0900
|
||||||
|
To: redmine@somenet.foo
|
||||||
|
X-Mailer: Apple Mail (2.1503)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=us-ascii
|
||||||
|
|
||||||
|
The text part.
|
||||||
|
|
||||||
|
|
||||||
|
--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/html;
|
||||||
|
charset=us-ascii
|
||||||
|
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww=
|
||||||
|
w.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns=3D"http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>The html part.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
|
||||||
|
--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9--
|
||||||
@@ -662,6 +662,17 @@ class MailHandlerTest < ActiveSupport::TestCase
|
|||||||
assert_equal '', issue.description
|
assert_equal '', issue.description
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_preferred_body_part_setting
|
||||||
|
with_settings :mail_handler_preferred_body_part => 'plain' do
|
||||||
|
issue = submit_email('different_contents_in_text_and_html.eml', :issue => {:project => 'ecookbook'})
|
||||||
|
assert_equal 'The text part.', issue.description
|
||||||
|
end
|
||||||
|
with_settings :mail_handler_preferred_body_part => 'html' do
|
||||||
|
issue = submit_email('different_contents_in_text_and_html.eml', :issue => {:project => 'ecookbook'})
|
||||||
|
assert_equal 'The html part.', issue.description
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_attachment_text_part_should_be_added_as_issue_attachment
|
def test_attachment_text_part_should_be_added_as_issue_attachment
|
||||||
issue = submit_email('multiple_text_parts.eml', :issue => {:project => 'ecookbook'})
|
issue = submit_email('multiple_text_parts.eml', :issue => {:project => 'ecookbook'})
|
||||||
assert_not_include 'Plain text attachment', issue.description
|
assert_not_include 'Plain text attachment', issue.description
|
||||||
|
|||||||
Reference in New Issue
Block a user