lib/backup/notifier/ses.rb
require "aws-sdk"
require "mail"
module Backup
module Notifier
class Ses < Base
##
# Amazon Simple Email Service (SES) Credentials
attr_accessor :access_key_id, :secret_access_key, :use_iam_profile
##
# SES Region
attr_accessor :region
##
# Sender Email Address
attr_accessor :from
##
# Receiver Email Address
attr_accessor :to
##
# CC receiver Email Address
attr_accessor :cc
##
# BCC receiver Email Address
attr_accessor :bcc
##
# Set reply to email address
attr_accessor :reply_to
def initialize(model, &block)
super
instance_eval(&block) if block_given?
@region ||= "eu-west-1"
@send_log_on ||= [:warning, :failure]
end
##
# Array of statuses for which the log file should be attached.
#
# Available statuses are: `:success`, `:warning` and `:failure`.
# Default: [:warning, :failure]
attr_accessor :send_log_on
private
def client
credentials = if use_iam_profile
Aws::InstanceProfileCredentials.new
else
Aws::Credentials.new(access_key_id, secret_access_key)
end
Aws::SES::Client.new(
region: region,
credentials: credentials
)
end
##
# Notify the user of the backup operation results.
#
# `status` indicates one of the following:
#
# `:success`
# : The backup completed successfully.
# : Notification will be sent if `on_success` is `true`.
#
# `:warning`
# : The backup completed successfully, but warnings were logged.
# : Notification will be sent, including a copy of the current
# : backup log, if `on_warning` or `on_success` is `true`.
#
# `:failure`
# : The backup operation failed.
# : Notification will be sent, including a copy of the current
# : backup log, if `on_failure` is `true`.
#
def notify!(status)
email = ::Mail.new
email.to = to
email.from = from
email.cc = cc
email.bcc = bcc
email.reply_to = reply_to
email.subject = message.call(model, status: status_data_for(status))
# By default, the `mail` gem doesn't include BCC in raw output, which is
# needed for SES to send to those addresses.
email[:bcc].include_in_headers = true
send_log = send_log_on.include?(status)
template = Backup::Template.new(model: model, send_log: send_log)
email.body = template.result(sprintf("notifier/mail/%s.erb", status.to_s))
if send_log
email.convert_to_multipart
email.attachments["#{model.time}.#{model.trigger}.log"] = {
mime_type: "text/plain;",
content: Logger.messages.map(&:formatted_lines).flatten.join("\n")
}
end
send_opts = {
raw_message: {
data: email.to_s
}
}
if email.respond_to?(:destinations)
send_opts[:destinations] = email.destinations
end
client.send_raw_email(send_opts)
end
end
end
end