handle multipart emails better in message_gateway

This commit is contained in:
Reinier Balt 2012-08-24 23:47:27 +02:00
parent cbf7a6fd43
commit 29c5103a98
4 changed files with 1534 additions and 2 deletions

View file

@ -65,8 +65,25 @@ class MessageGateway < ActionMailer::Base
end
def get_first_text_plain_part(email)
parts = email.parts.reject{|part| !part.content_type.start_with?("text/plain") }
return parts ? sanitize(parts[0].decoded.strip) : ""
# get all parts from multipart/alternative attachments
parts = get_all_parts(email.parts)
# remove all parts that are not text/plain
parts.reject{|part| !part.content_type.start_with?("text/plain") }
return parts.count > 0 ? sanitize(parts[0].decoded.strip) : ""
end
def get_all_parts(parts)
# return a flattened array of parts. If a multipart attachment is found, recurse over its parts
all_parts = parts.inject([]) do |set, elem|
if elem.content_type.start_with?("multipart/alternative")
# recurse to handle multiparts in this multipart
set += get_all_parts(elem.parts)
else
set << elem
end
end
end
end

1405
test/fixtures/email_with_multipart.txt vendored Normal file

File diff suppressed because it is too large Load diff

92
test/fixtures/email_with_winmail.txt vendored Normal file
View file

@ -0,0 +1,92 @@
From lrbalt@gmail.com Fri Aug 24 07:31:58 2012
Return-Path: <lrbalt@gmail.com>
From: 5555555555@tmomail.net
To: 5555555555@tmomail.net
Subject: RE: email with winmail.dat
Date: Fri, 24 Aug 2012 16:31:56 +0200
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_NextPart_000_031D_01CD8215.FB27DC30"
X-Mailer: Microsoft Outlook 14.0
This is a multipart message in MIME format.
------=_NextPart_000_031D_01CD8215.FB27DC30
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 8bit
Now we replied to self
Van: Reinier Balt [mailto:lrbalt@gmail.com]
Verzonden: vrijdag 24 augustus 2012 16:32
Aan: 'Reinier Balt'
Onderwerp: email with winmail.dat
Winmail.dat causes me to email myself
------=_NextPart_000_031D_01CD8215.FB27DC30
Content-Type: application/ms-tnef; name="winmail.dat"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="winmail.dat"
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
PB+B8j4KozxvJeARgFUgAQG7jYIEIHaPYTKRNJF0IeA3XGAPQADAeCWQkXAyNrUh4C+gtS+ggjfA
Wwnw+Q9QZl2cX58PoB+hJQtgvnkIYAVAoiqgt6MScKIc+mQx4GGjYaPJqHunsKRvWy5cNgIvL38e
0DUR4DwZBuBkeUeQdeE9Tkz7R5FUQD0KMqIQsmNhFC5A3x5zACEDMHXSkXA0PsCz5usR4B4rOUOg
PEiBMiALYH0EED2ZSrPJAAC1Lx6jNj8vQargtwRG97gvuT9nOE8vQVxiXFCd0j0ni5sn37uvvLNH
IAfgXcAgh8IIkO8zkDHwXFCo0GaljS9BoSD+cKVuDkCsw8O+lRCdkj1B/7PJs9cdcbP1CqLHeAqB
s/f/CrHJiLWdAcCdkcO+ul+7b0fKr72HMSUiX02E4UX7WrAIUG2PkBGwLjHOyB5COGJrbX/xCsAF
QEJN/l/Rncd50A++H78vzy/Cr+PDvtbRJm5iXGACgLPo/CdhAUDZj8RvxX/Gj8eff9lR03SuYdQv
1THVX+BKYf+zyMivyb/lb8vfth3XZQbg+wsgBJA6PWBbEe1EdcABcfcl4AbwD0AgsrNxQJhSCrCu
ZA9QdfBtoiDwVjRxUv/Yr+nftmfxf/KP7E/tX4bQA3tg7rUjQjVDNET+Ru9hcWLv1i0AlMLwWfFv
3/UfzT/OT/w/1mli/ws7If//39aP15KQ34jLQbSKDXUfr3YisjD7fwK0Vg2wOuXf/+D/An8LqQF6
DU8DfwSPBZ8PBq8HvwjPCd8gIFJl2zkBezFCSTD6oFuE0jHwyVQQcmIZAUBnhNIqMu5dHh0woLFx
crPLWwHpf/8AvwHPCrN4EHrzCx8O7xfY6nZ9sGqr0Gc+MNxgjYC/dgB6wCSwPjBvoD3RNvpQfjIa
7xv/HQ8eHx8vKFRB1wsPIh8XyScYeiclvybP7yffKO8p/zHET1qywVBhMHcrnyyvF+dlhNLBQKuQ
aP04YW4aQ6vR2h/bL98fC3//DI/Hz+ff6O8x7+sPL7O00P/mwfPsD99D70T/Rg/9v/7P/0h/Of/b
r9y/S+87Xz8vQD9/QU9CX8xvSftkh0svVRNX/zjYYKAkgNJgogB6UMHyOBT8bXnCP01fUU9SX1Nv
VH//VY9Db0c/SE9kX2VvZn+xQO44NmKxoaVuN6/yT4Gu4AJ9bJAAAAADAA00/T+lDgMADzT9P6UO
AgEUNAEAAAAQAAAATklUQfm/uAEAqgA32W4AAAIBfwABAAAAMQAAADAwMDAwMDAwQjlFMDg1MTRD
QTczREY0OEI0RTI3Mjg5ODUwQTI3RENDNDc5NDYwMAAAAAADAAYQ5DcXKwMABxCmAAAAAwAQEAAA
AAADABEQAAAAAB4ACBABAAAAZQAAAE5PV1dFUkVQTElFRFRPU0VMRlZBTjpSRUlOSUVSQkFMVE1B
SUxUTzpMUkJBTFRAR01BSUxDT01WRVJaT05ERU46VlJJSkRBRzI0QVVHVVNUVVMyMDEyMTY6MzJB
QU46UkVJTkkAAAAARaY=
------=_NextPart_000_031D_01CD8215.FB27DC30--

View file

@ -40,7 +40,25 @@ class MessageGatewayTest < ActiveSupport::TestCase
assert_equal(@user, message_todo.user)
assert_equal("This is the message body", message_todo.notes)
end
def test_email_with_winmail_dat
todo_count = Todo.count
load_message('email_with_winmail.txt')
# assert some stuff about it being created
assert_equal(todo_count+1, Todo.count)
end
def test_email_with_multipart_attachments
todo_count = Todo.count
load_message('email_with_multipart.txt')
# assert some stuff about it being created
assert_equal(todo_count+1, Todo.count)
end
def test_no_user
todo_count = Todo.count
badmessage = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_sms.txt'))