enhance MessageGateway to save email as attachment

This commit is contained in:
Reinier Balt 2015-08-05 13:03:33 +02:00
parent f2c6c2d3af
commit 5cabeca155
2 changed files with 57 additions and 13 deletions

View file

@ -10,13 +10,41 @@ class MessageGateway < ActionMailer::Base
todo_builder = TodoFromRichMessage.new(user, context.id, todo_params[:description], todo_params[:notes]) todo_builder = TodoFromRichMessage.new(user, context.id, todo_params[:description], todo_params[:notes])
todo = todo_builder.construct todo = todo_builder.construct
todo.save!
Rails.logger.info "Saved email as todo for user #{user.login} in context #{context.name}" if todo.save!
Rails.logger.info "Saved email as todo for user #{user.login} in context #{context.name}"
if attach_email_to_todo(todo, email)
Rails.logger.info "Saved email as attachment to todo for user #{user.login} in context #{context.name}"
end
end
todo todo
end end
private private
def attach_email_to_todo(todo, email)
attachment = todo.attachments.build
# create temp file
tmp = Tempfile.new(['attachment', '.eml'], {universal_newline: true})
tmp.write email.raw_source.gsub(/\r/, "")
# add temp file to attachment. paperclip will copy the file to the right location
Rails.logger.info "Saved received email to #{tmp.path}"
attachment.file = tmp
tmp.close
saved = attachment.save!
# enable write permissions on group, since MessageGateway could be run under different
# user than Tracks (i.e. apache versus mail)
dir = File.open(File.dirname(attachment.file.path))
dir.chmod(0770)
# delete temp file
tmp.unlink
end
def get_todo_params(email) def get_todo_params(email)
params = {} params = {}
@ -111,5 +139,4 @@ class MessageGateway < ActionMailer::Base
end end
end end
end end
end end

View file

@ -83,4 +83,21 @@ class MessageGatewayTest < ActiveSupport::TestCase
assert_not_nil(invalid_context_todo) assert_not_nil(invalid_context_todo)
assert_equal(@inbox, invalid_context_todo.context) assert_equal(@inbox, invalid_context_todo.context)
end end
def test_receiving_email_adds_attachment
attachment_count = Attachment.count
load_message('sample_mms.txt')
message_todo = Todo.where(:description => "This is the subject").first
assert_not_nil(message_todo)
assert_equal attachment_count+1, Attachment.count
assert_equal 1,message_todo.attachments.count
orig = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_mms.txt'))
attachment = File.read(message_todo.attachments.first.file.path)
assert_equal orig, attachment
end
end end