module CamaleonCms
class HtmlMailer < ActionMailer::Base
include CamaleonCms::SiteHelper
include CamaleonCms::HooksHelper
include CamaleonCms::PluginsHelper
# include ApplicationHelper
default from: 'Camaleon CMS '
after_action :set_delivery_options
# content='', from=nil, attachs=[], url_base='', current_site, template_name, layout_name, extra_data, format, cc_to
def sender(email, subject = 'Hello', data = {})
data = data.to_sym
if data[:current_site].present?
data[:current_site] = CamaleonCms::Site.find(data[:current_site]).decorate if data[:current_site].is_a?(Integer)
else
data[:current_site] = CamaleonCms::Site.main_site.decorate
end
@current_site = data[:current_site]
data = {
cc_to: @current_site.get_option('email_cc', '').split(','),
from: @current_site.get_option('email_from') || @current_site.get_option('email'),
template_name: 'mailer',
layout_name: 'camaleon_cms/mailer',
format: 'html'
}.merge(data)
data[:cc_to] = [data[:cc_to]] if data[:cc_to].is_a?(String) || !data[:cc_to].present?
mail_data = { to: email, subject: subject }
if @current_site.get_option('mailer_enabled') == 1
mail_data[:delivery_method] = :smtp
mail_data[:delivery_method_options] = {
user_name: @current_site.get_option('email_username'),
password: @current_site.get_option('email_pass'),
address: @current_site.get_option('email_server'),
port: @current_site.get_option('email_port'),
domain: begin
@current_site.the_url.to_s.parse_domain
rescue StandardError
'localhost'
end,
authentication: 'plain',
enable_starttls_auto: true
}
end
mail_data[:cc] = data[:cc_to].clean_empty.join(',') if data[:cc_to].present?
mail_data[:from] = data[:from] if data[:from].present?
data[:mail_data] = mail_data
hooks_run('email_late', data)
@subject = subject
@html = data[:content]
@url_base = data[:url_base]
@extra_data = data[:extra_data]
views_dir = 'app/apps/'
prepend_view_path(File.join($camaleon_engine_dir, views_dir).to_s)
prepend_view_path(Rails.root.join(views_dir).to_s)
theme = @current_site.get_theme
lookup_context.prefixes.prepend("themes/#{theme.slug}") if theme.settings['gem_mode']
lookup_context.prefixes.prepend("themes/#{theme.slug}/views") unless theme.settings['gem_mode']
lookup_context.use_camaleon_partial_prefixes = true
((data[:files] || []) + (data[:attachments] || [])).each do |attach|
if File.exist?(attach) && !File.directory?(attach)
attachments[File.basename(attach).to_s] = File.open(attach, 'rb', &:read)
else
Rails.logger.error "Camaleon CMS - File attached in the email doesn't exist: #{attach}".cama_log_style(:red)
end
end
layout = data[:layout_name].present? ? data[:layout_name] : false
if data[:template_name].present? # render email with template
if data[:format] == 'html'
mail(mail_data) do |format|
format.html do
render data[:template_name], layout: layout
end
end
end
if data[:format] == 'txt'
mail(mail_data) do |format|
format.text do
render data[:template_name], layout: layout
end
end
end
else # inline render content
mail(mail_data) { |format| format.html { render inline: @html, layout: layout } } if data[:format] == 'html'
mail(mail_data) { |format| format.text { render inline: @html, layout: layout } } if data[:format] == 'txt'
end
mail(mail_data) unless data[:format].present?
end
private
# set default settings configured on admin panel
def set_delivery_options
return unless @current_site.get_option('mailer_enabled') == 1
mail.perform_deliveries = true
end
end
end