From 456d79b853aaec14f14c4c4deaa04cfb66c5b357 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 28 Sep 2018 11:01:49 -0700 Subject: Extract MessageId concern --- .../action_mailroom/inbound_emails_controller.rb | 2 +- app/models/action_mailroom/inbound_email.rb | 26 +++------------------- .../action_mailroom/inbound_email/message_id.rb | 25 +++++++++++++++++++++ lib/action_mailroom/test_helper.rb | 2 +- 4 files changed, 30 insertions(+), 25 deletions(-) create mode 100644 app/models/action_mailroom/inbound_email/message_id.rb diff --git a/app/controllers/action_mailroom/inbound_emails_controller.rb b/app/controllers/action_mailroom/inbound_emails_controller.rb index 0723bd39c3..57e0530ac6 100644 --- a/app/controllers/action_mailroom/inbound_emails_controller.rb +++ b/app/controllers/action_mailroom/inbound_emails_controller.rb @@ -6,7 +6,7 @@ class ActionMailroom::InboundEmailsController < ActionController::Base before_action :require_rfc822_message, only: :create def create - ActionMailroom::InboundEmail.create_from_raw_email!(params[:message]) + ActionMailroom::InboundEmail.create_and_extract_message_id!(params[:message]) head :created end diff --git a/app/models/action_mailroom/inbound_email.rb b/app/models/action_mailroom/inbound_email.rb index 1f086b24bf..cf7370d543 100644 --- a/app/models/action_mailroom/inbound_email.rb +++ b/app/models/action_mailroom/inbound_email.rb @@ -3,28 +3,13 @@ require "mail" class ActionMailroom::InboundEmail < ActiveRecord::Base self.table_name = "action_mailroom_inbound_emails" - include Incineratable, Routable + include Incineratable, MessageId, Routable has_one_attached :raw_email enum status: %i[ pending processing delivered failed bounced ] - before_save :generate_missing_message_id - - class << self - def create_from_raw_email!(raw_email, **options) - create! raw_email: raw_email, message_id: extract_message_id(raw_email), **options - end - - def mail_from_source(source) - Mail.new(Mail::Utilities.binary_unsafe_to_crlf(source.to_s)) - end - - private - def extract_message_id(raw_email) - mail_from_source(raw_email.read).message_id - rescue => e - # FIXME: Add logging with "Couldn't extract Message ID, so will generating a new random ID instead" - end + def self.mail_from_source(source) + Mail.new Mail::Utilities.binary_unsafe_to_crlf(source.to_s) end def mail @@ -34,9 +19,4 @@ class ActionMailroom::InboundEmail < ActiveRecord::Base def source @source ||= raw_email.download end - - private - def generate_missing_message_id - self.message_id ||= Mail::MessageIdField.new.message_id - end end diff --git a/app/models/action_mailroom/inbound_email/message_id.rb b/app/models/action_mailroom/inbound_email/message_id.rb new file mode 100644 index 0000000000..6bdda8c1c7 --- /dev/null +++ b/app/models/action_mailroom/inbound_email/message_id.rb @@ -0,0 +1,25 @@ +module ActionMailroom::InboundEmail::MessageId + extend ActiveSupport::Concern + + included do + before_save :generate_missing_message_id + end + + module ClassMethods + def create_and_extract_message_id!(raw_email, **options) + create! raw_email: raw_email, message_id: extract_message_id(raw_email), **options + end + + private + def extract_message_id(raw_email) + mail_from_source(raw_email.read).message_id + rescue => e + # FIXME: Add logging with "Couldn't extract Message ID, so will generating a new random ID instead" + end + end + + private + def generate_missing_message_id + self.message_id ||= Mail::MessageIdField.new.message_id + end +end diff --git a/lib/action_mailroom/test_helper.rb b/lib/action_mailroom/test_helper.rb index 8ffbe94e6c..3e1ff87839 100644 --- a/lib/action_mailroom/test_helper.rb +++ b/lib/action_mailroom/test_helper.rb @@ -14,7 +14,7 @@ module ActionMailroom end def create_inbound_email(io, filename: 'mail.eml', status: :processing) - ActionMailroom::InboundEmail.create_from_raw_email! \ + ActionMailroom::InboundEmail.create_and_extract_message_id! \ ActionDispatch::Http::UploadedFile.new(tempfile: io, filename: filename, type: 'message/rfc822'), status: status end -- cgit v1.2.3