2019-05-02 17:17:27 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-01-18 17:57:55 -06:00
|
|
|
class IncomingEmail < ActiveRecord::Base
|
|
|
|
belongs_to :user
|
|
|
|
belongs_to :topic
|
|
|
|
belongs_to :post
|
2020-08-02 22:10:17 -05:00
|
|
|
belongs_to :group, foreign_key: :imap_group_id, class_name: 'Group'
|
2016-01-18 17:57:55 -06:00
|
|
|
|
2021-01-20 20:59:50 -06:00
|
|
|
validates :created_via, presence: true
|
|
|
|
|
2017-08-04 09:20:44 -05:00
|
|
|
scope :errored, -> { where("NOT is_bounce AND error IS NOT NULL") }
|
2017-11-13 08:20:36 -06:00
|
|
|
|
2018-03-30 07:37:19 -05:00
|
|
|
scope :addressed_to, -> (email) do
|
|
|
|
where(<<~SQL, email: "%#{email}%")
|
2020-07-10 04:05:55 -05:00
|
|
|
incoming_emails.from_address = :email OR
|
2018-03-30 07:37:19 -05:00
|
|
|
incoming_emails.to_addresses ILIKE :email OR
|
|
|
|
incoming_emails.cc_addresses ILIKE :email
|
|
|
|
SQL
|
|
|
|
end
|
|
|
|
|
|
|
|
scope :addressed_to_user, ->(user) do
|
|
|
|
where(<<~SQL, user_id: user.id)
|
|
|
|
EXISTS(
|
|
|
|
SELECT 1
|
|
|
|
FROM user_emails
|
|
|
|
WHERE user_emails.user_id = :user_id AND
|
2020-07-10 04:05:55 -05:00
|
|
|
(incoming_emails.from_address = user_emails.email OR
|
|
|
|
incoming_emails.to_addresses ILIKE '%' || user_emails.email || '%' OR
|
2018-03-30 07:37:19 -05:00
|
|
|
incoming_emails.cc_addresses ILIKE '%' || user_emails.email || '%')
|
|
|
|
)
|
|
|
|
SQL
|
|
|
|
end
|
2021-01-04 23:32:04 -06:00
|
|
|
|
2021-01-20 19:37:47 -06:00
|
|
|
scope :without_raw, -> { select(self.column_names - ["raw"]) }
|
|
|
|
|
2021-01-19 21:22:41 -06:00
|
|
|
def self.created_via_types
|
|
|
|
@types ||= Enum.new(
|
2021-01-20 20:59:50 -06:00
|
|
|
unknown: 0,
|
2021-01-19 21:22:41 -06:00
|
|
|
handle_mail: 1,
|
|
|
|
pop3_poll: 2,
|
|
|
|
imap: 3,
|
|
|
|
group_smtp: 4
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2021-01-20 19:37:47 -06:00
|
|
|
def as_mail_message
|
|
|
|
@mail_message ||= Mail.new(self.raw)
|
|
|
|
end
|
|
|
|
|
|
|
|
def raw_headers
|
|
|
|
as_mail_message.header.raw_source
|
|
|
|
end
|
|
|
|
|
|
|
|
def raw_body
|
|
|
|
as_mail_message.body
|
|
|
|
end
|
|
|
|
|
2021-01-14 18:54:46 -06:00
|
|
|
def to_addresses_split
|
|
|
|
self.to_addresses&.split(";") || []
|
|
|
|
end
|
|
|
|
|
|
|
|
def cc_addresses_split
|
|
|
|
self.cc_addresses&.split(";") || []
|
|
|
|
end
|
|
|
|
|
2021-01-04 23:32:04 -06:00
|
|
|
def to_addresses=(to)
|
|
|
|
if to&.is_a?(Array)
|
|
|
|
to = to.map(&:downcase).join(";")
|
|
|
|
end
|
|
|
|
super(to)
|
|
|
|
end
|
|
|
|
|
|
|
|
def cc_addresses=(cc)
|
|
|
|
if cc&.is_a?(Array)
|
|
|
|
cc = cc.map(&:downcase).join(";")
|
|
|
|
end
|
|
|
|
super(cc)
|
|
|
|
end
|
|
|
|
|
|
|
|
def from_address=(from)
|
|
|
|
if from&.is_a?(Array)
|
|
|
|
from = from.first
|
|
|
|
end
|
|
|
|
super(from)
|
|
|
|
end
|
2016-01-18 17:57:55 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: incoming_emails
|
|
|
|
#
|
2016-03-27 23:21:45 -05:00
|
|
|
# id :integer not null, primary key
|
|
|
|
# user_id :integer
|
|
|
|
# topic_id :integer
|
|
|
|
# post_id :integer
|
|
|
|
# raw :text
|
|
|
|
# error :text
|
|
|
|
# message_id :text
|
|
|
|
# from_address :text
|
|
|
|
# to_addresses :text
|
|
|
|
# cc_addresses :text
|
|
|
|
# subject :text
|
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
|
|
|
# rejection_message :text
|
2016-05-29 19:45:32 -05:00
|
|
|
# is_auto_generated :boolean default(FALSE)
|
|
|
|
# is_bounce :boolean default(FALSE), not null
|
2020-07-10 04:05:55 -05:00
|
|
|
# imap_uid_validity :integer
|
|
|
|
# imap_uid :integer
|
|
|
|
# imap_sync :boolean
|
2020-08-02 22:10:17 -05:00
|
|
|
# imap_group_id :bigint
|
2021-07-05 17:14:15 -05:00
|
|
|
# imap_missing :boolean default(FALSE), not null
|
2021-01-20 20:59:50 -06:00
|
|
|
# created_via :integer default(0), not null
|
2016-01-18 17:57:55 -06:00
|
|
|
#
|
|
|
|
# Indexes
|
|
|
|
#
|
2020-08-02 22:10:17 -05:00
|
|
|
# index_incoming_emails_on_created_at (created_at)
|
|
|
|
# index_incoming_emails_on_error (error)
|
|
|
|
# index_incoming_emails_on_imap_group_id (imap_group_id)
|
|
|
|
# index_incoming_emails_on_imap_sync (imap_sync)
|
|
|
|
# index_incoming_emails_on_message_id (message_id)
|
|
|
|
# index_incoming_emails_on_post_id (post_id)
|
|
|
|
# index_incoming_emails_on_user_id (user_id) WHERE (user_id IS NOT NULL)
|
2016-01-18 17:57:55 -06:00
|
|
|
#
|