Sha256: 8cfdec60b521e651fc65d1a5933c6b889a3da45d1090ab8b41a4e440417d2911

Contents?: true

Size: 1.78 KB

Versions: 24

Compression:

Stored size: 1.78 KB

Contents

require "mail"

class Dorsale::Email
  include ActiveModel::Model
  include Agilibox::ModelToS
  include Agilibox::ModelI18n

  validates :to,      presence: true
  validates :subject, presence: true
  validates :body,    presence: true

  validate :validate_to_and_cc_format

  attr_accessor(
    :current_user,
    :from,
    :to,
    :cc,
    :subject,
    :body,
    :attachments,
  )

  def initialize(*)
    super
    assign_default_values
  end

  def attachment_names
    attachments.keys.join(", ")
  end

  def save
    valid? && deliver_now
  end

  private

  def data
    # Real email :from is mailer default
    # The :from of this class is used as reply_to
    {
      :reply_to    => from,
      :to          => to,
      :cc          => cc,
      :subject     => subject,
      :body        => body,
      :attachments => attachments,
    }
  end

  def deliver_now
    Dorsale::GenericMailer.generic_email(data).deliver_now
  end

  def default_from
    "#{current_user} <#{current_user.email}>" if current_user
  end

  def assign_default_values
    self.from        ||= default_from
    self.to          ||= default_to
    self.cc          ||= default_cc
    self.subject     ||= default_subject
    self.body        ||= default_body
    self.attachments ||= default_attachments
  end

  def default_to
  end

  def default_cc
  end

  def default_subject
  end

  def default_body
  end

  def default_attachments
    {}
  end

  def validate_to_and_cc_format
    validate_addrs_format(:to)
    validate_addrs_format(:cc)
  end

  def validate_addrs_format(attr)
    string = public_send(attr).to_s
    return if string.blank?
    addrs  = Mail.new(to: string).to_addrs
    return true if addrs.any? && addrs.all? { |addr| URI::MailTo::EMAIL_REGEXP.match?(addr) }
    errors.add(attr, :invalid)
  end
end

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
dorsale-3.19.1 app/models/dorsale/email.rb
dorsale-3.19.0 app/models/dorsale/email.rb
dorsale-3.18.0 app/models/dorsale/email.rb
dorsale-3.17.0 app/models/dorsale/email.rb
dorsale-3.16.0 app/models/dorsale/email.rb
dorsale-3.15.0 app/models/dorsale/email.rb
dorsale-3.14.11 app/models/dorsale/email.rb
dorsale-3.14.10 app/models/dorsale/email.rb
dorsale-3.14.9 app/models/dorsale/email.rb
dorsale-3.14.8 app/models/dorsale/email.rb
dorsale-3.14.7 app/models/dorsale/email.rb
dorsale-3.14.6 app/models/dorsale/email.rb
dorsale-3.14.5 app/models/dorsale/email.rb
dorsale-3.14.4 app/models/dorsale/email.rb
dorsale-3.14.3 app/models/dorsale/email.rb
dorsale-3.14.2 app/models/dorsale/email.rb
dorsale-3.14.1 app/models/dorsale/email.rb
dorsale-3.14.0 app/models/dorsale/email.rb
dorsale-3.13.0 app/models/dorsale/email.rb
dorsale-3.12.0 app/models/dorsale/email.rb