Improved error handling of invalid emails.

This commit is contained in:
Martin Edenhofer 2018-01-02 14:28:34 +01:00
parent 56846b2fe9
commit e376a0f872
2 changed files with 37 additions and 3 deletions

View file

@ -381,7 +381,7 @@ class Channel::EmailParser
filename = if mail_local[:subject].present? filename = if mail_local[:subject].present?
"#{mail_local[:subject]}.eml" "#{mail_local[:subject]}.eml"
elsif headers_store['Content-Description'].present? elsif headers_store['Content-Description'].present?
"#{headers_store['Content-Description']}.eml" "#{headers_store['Content-Description']}.eml".to_s.force_encoding('utf-8')
else else
'Mail.eml' 'Mail.eml'
end end
@ -415,7 +415,7 @@ class Channel::EmailParser
map.each do |type, ext| map.each do |type, ext|
next if headers_store['Content-Type'] !~ /^#{Regexp.quote(type)}/i next if headers_store['Content-Type'] !~ /^#{Regexp.quote(type)}/i
filename = if headers_store['Content-Description'].present? filename = if headers_store['Content-Description'].present?
"#{headers_store['Content-Description']}.#{ext[0]}" "#{headers_store['Content-Description']}.#{ext[0]}".to_s.force_encoding('utf-8')
else else
"#{ext[1]}.#{ext[0]}" "#{ext[1]}.#{ext[0]}"
end end
@ -661,11 +661,15 @@ returns
# store attachments # store attachments
mail[:attachments]&.each do |attachment| mail[:attachments]&.each do |attachment|
filename = attachment[:filename].force_encoding('utf-8')
if !filename.force_encoding('UTF-8').valid_encoding?
filename = filename.encode('utf-8', 'binary', invalid: :replace, undef: :replace, replace: '?')
end
Store.add( Store.add(
object: 'Ticket::Article', object: 'Ticket::Article',
o_id: article.id, o_id: article.id,
data: attachment[:data], data: attachment[:data],
filename: attachment[:filename], filename: filename,
preferences: attachment[:preferences] preferences: attachment[:preferences]
) )
end end

View file

@ -2669,6 +2669,36 @@ Some Text',
], ],
}, },
}, },
{
data: IO.binread('test/fixtures/mail64.box'),
success: true,
result: {
0 => {
priority: '2 normal',
title: 'AW: OTRS / Anfrage OTRS Einführung/Präsentation [Ticket#11545]',
},
1 => {
from: 'Martin Edenhofer <martin@example.de>',
sender: 'Customer',
type: 'email',
body: 'Enjoy!<div>
<br><div>-Martin<br><span class="js-signatureMarker"></span><br>--<br>Old programmers never die. They just branch to a new address.<br>
</div>
<br><div><img src="cid:485376C9-2486-4351-B932-E2010998F579@home" style="width:640px;height:425px;"></div>
</div>',
},
},
verify: {
users: [
{
firstname: 'Martin',
lastname: 'Edenhofer',
fullname: 'Martin Edenhofer',
email: 'martin@example.de',
},
],
},
},
] ]
assert_process(files) assert_process(files)
end end