Feature #30838 » 30838-preferred-part-multipart-email.patch
| app/models/mail_handler.rb | ||
|---|---|---|
| 447 | 447 |
end |
| 448 | 448 |
end |
| 449 | 449 | |
| 450 |
# Returns the text/plain part of the email |
|
| 451 |
# If not found (eg. HTML-only email), returns the body with tags removed |
|
| 450 |
# Returns the text/plain or text/html(the body with tags removed) part of the email |
|
| 451 |
# The preferred of parse depends on Setting.mail_handler_preferred_body_part |
|
| 452 |
# * 'html' - first text/html, then text/plain |
|
| 453 |
# * 'plain'(Default) - first text/plain, then text/html |
|
| 452 | 454 |
def plain_text_body |
| 453 | 455 |
return @plain_text_body unless @plain_text_body.nil? |
| 454 | 456 | |
| 455 |
# check if we have any plain-text parts with content |
|
| 456 |
@plain_text_body = email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/plain'}).presence
|
|
| 457 | ||
| 458 |
# if not, we try to parse the body from the HTML-parts |
|
| 459 |
@plain_text_body ||= email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/html'}).presence
|
|
| 457 |
multipart_parse_order = |
|
| 458 |
if Setting.mail_handler_preferred_body_part == 'html' |
|
| 459 |
# HTML parts, plain-text parts |
|
| 460 |
['text/html', 'text/plain'] |
|
| 461 |
else |
|
| 462 |
# (Default) plain-text parts, HTML parts |
|
| 463 |
['text/plain', 'text/html'] |
|
| 464 |
end |
|
| 465 |
multipart_parse_order.each do |mime_type| |
|
| 466 |
@plain_text_body ||= email_parts_to_text(email.all_parts.select {|p| p.mime_type == mime_type}).presence
|
|
| 467 |
return @plain_text_body unless @plain_text_body.nil? |
|
| 468 |
end |
|
| 460 | 469 | |
| 461 | 470 |
# If there is still no body found, and there are no mime-parts defined, |
| 462 | 471 |
# we use the whole raw mail body |
| app/views/settings/_mail_handler.html.erb | ||
|---|---|---|
| 18 | 18 |
<em class="info"><%= l(:text_comma_separated) %> |
| 19 | 19 |
<%= l(:label_example) %>: smime.p7s, *.vcf</em> |
| 20 | 20 |
</p> |
| 21 |
<p><%= setting_select :mail_handler_preferred_body_part, [['Text', 'plain'], ['HTML', 'html']] %></p> |
|
| 21 | 22 |
</div> |
| 22 | 23 | |
| 23 | 24 |
<div class="box tabular settings"> |
| config/locales/en.yml | ||
|---|---|---|
| 422 | 422 |
setting_mail_handler_enable_regex: "Enable regular expressions" |
| 423 | 423 |
setting_mail_handler_api_enabled: Enable WS for incoming emails |
| 424 | 424 |
setting_mail_handler_api_key: Incoming email WS API key |
| 425 |
setting_mail_handler_preferred_body_part: Preferred part of multipart (HTML) emails |
|
| 425 | 426 |
setting_sys_api_key: Repository management WS API key |
| 426 | 427 |
setting_sequential_project_identifiers: Generate sequential project identifiers |
| 427 | 428 |
setting_gravatar_enabled: Use Gravatar user icons |
| config/settings.yml | ||
|---|---|---|
| 195 | 195 |
mail_handler_api_key: |
| 196 | 196 |
default: |
| 197 | 197 |
security_notifications: 1 |
| 198 |
mail_handler_preferred_body_part: |
|
| 199 |
default: plain |
|
| 198 | 200 |
issue_list_default_columns: |
| 199 | 201 |
serialized: true |
| 200 | 202 |
default: |
| test/fixtures/mail_handler/text_and_html_part.eml | ||
|---|---|---|
| 1 |
From JSmith@somenet.foo Fri Mar 22 08:30:28 2013 |
|
| 2 |
From: John Smith <JSmith@somenet.foo> |
|
| 3 |
Content-Type: multipart/mixed; boundary="Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9" |
|
| 4 |
Message-Id: <BB533668-3CC8-41CA-A951-0A5D8EA37FB0@somenet.foo> |
|
| 5 |
Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\)) |
|
| 6 |
Subject: Test with an empty text part |
|
| 7 |
Date: Fri, 22 Mar 2013 17:30:20 +0200 |
|
| 8 |
To: redmine@somenet.foo |
|
| 9 |
X-Mailer: Apple Mail (2.1503) |
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 |
|
| 14 |
Content-Transfer-Encoding: quoted-printable |
|
| 15 |
Content-Type: text/plain; |
|
| 16 |
charset=us-ascii |
|
| 17 |
|
|
| 18 |
The text part. |
|
| 19 |
|
|
| 20 |
|
|
| 21 |
--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 |
|
| 22 |
Content-Transfer-Encoding: quoted-printable |
|
| 23 |
Content-Type: text/html; |
|
| 24 |
charset=us-ascii |
|
| 25 |
|
|
| 26 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww= |
|
| 27 |
w.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
| 28 |
<html xmlns=3D"http://www.w3.org/1999/xhtml"> |
|
| 29 |
<head> |
|
| 30 |
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8" /> |
|
| 31 |
</head> |
|
| 32 |
<body> |
|
| 33 |
<p>The html part.</p> |
|
| 34 |
</body> |
|
| 35 |
</html> |
|
| 36 |
|
|
| 37 |
|
|
| 38 |
--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9-- |
|
| test/unit/mail_handler_test.rb | ||
|---|---|---|
| 662 | 662 |
assert_equal '', issue.description |
| 663 | 663 |
end |
| 664 | 664 | |
| 665 |
def test_preferred_body_part_setting |
|
| 666 |
with_settings :mail_handler_preferred_body_part => 'plain' do |
|
| 667 |
issue = submit_email('text_and_html_part.eml', :issue => {:project => 'ecookbook'})
|
|
| 668 |
assert_equal 'The text part.', issue.description |
|
| 669 |
end |
|
| 670 |
with_settings :mail_handler_preferred_body_part => 'html' do |
|
| 671 |
issue = submit_email('text_and_html_part.eml', :issue => {:project => 'ecookbook'})
|
|
| 672 |
assert_equal 'The html part.', issue.description |
|
| 673 |
end |
|
| 674 |
end |
|
| 675 | ||
| 665 | 676 |
def test_attachment_text_part_should_be_added_as_issue_attachment |
| 666 | 677 |
issue = submit_email('multiple_text_parts.eml', :issue => {:project => 'ecookbook'})
|
| 667 | 678 |
assert_not_include 'Plain text attachment', issue.description |