Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

241 lines (209 sloc) 7.3 kb
# encoding: utf-8
##
# Only load the Mail gem when using Mail notifications
Backup::Dependency.load('mail')
module Backup
module Notifier
class Mail < Base
##
# Mail delivery method to be used by the Mail gem.
#
# Supported methods:
#
# [:smtp - ::Mail::SMTP (default)]
# Settings used by this method:
# {#address}, {#port}, {#domain}, {#user_name}, {#password},
# {#authentication}, {#encryption}, {#openssl_verify_mode}
#
# [:sendmail - ::Mail::Sendmail]
# Settings used by this method:
# {#sendmail}, {#sendmail_args}
#
# [:exim - ::Mail::Exim]
# Settings used by this method:
# {#exim}, {#exim_args}
#
# [:file - ::Mail::FileDelivery]
# Settings used by this method:
# {#mail_folder}
#
attr_accessor :delivery_method
##
# Sender Email Address
attr_accessor :from
##
# Receiver Email Address
attr_accessor :to
##
# SMTP Server Address
attr_accessor :address
##
# SMTP Server Port
attr_accessor :port
##
# Your domain (if applicable)
attr_accessor :domain
##
# SMTP Server Username (sender email's credentials)
attr_accessor :user_name
##
# SMTP Server Password (sender email's credentials)
attr_accessor :password
##
# Authentication type
#
# Acceptable values: +:plain+, +:login+, +:cram_md5+
attr_accessor :authentication
##
# Set the method of encryption to be used for the +SMTP+ connection.
#
# [:none (default)]
# No encryption will be used.
#
# [:starttls]
# Use +STARTTLS+ to upgrade the connection to a +SSL/TLS+ connection.
#
# [:tls or :ssl]
# Use a +SSL/TLS+ connection.
attr_accessor :encryption
attr_deprecate :enable_starttls_auto, :version => '3.2.0',
:message => "Use #encryption instead.\n" +
'e.g. mail.encryption = :starttls',
:action => lambda {|klass, val|
klass.encryption = val ? :starttls : :none
}
##
# OpenSSL Verify Mode
#
# Valid modes: +:none+, +:peer+, +:client_once+, +:fail_if_no_peer_cert+
# See +OpenSSL::SSL+ for details.
#
# Use +:none+ for a self-signed and/or wildcard certificate
attr_accessor :openssl_verify_mode
##
# Path to `sendmail` (if needed)
#
# When using the `:sendmail` `delivery_method` option,
# this may be used to specify the absolute path to `sendmail`
#
# Example: '/usr/sbin/sendmail'
attr_accessor :sendmail
##
# Optional arguments to pass to `sendmail`
#
# Note that this will override the defaults set by the Mail gem (currently: '-i -t')
# So, if set here, be sure to set all the arguments you require.
#
# Example: '-i -t -X/tmp/traffic.log'
attr_accessor :sendmail_args
##
# Path to `exim` (if needed)
#
# When using the `:exim` `delivery_method` option,
# this may be used to specify the absolute path to `exim`
#
# Example: '/usr/sbin/exim'
attr_accessor :exim
##
# Optional arguments to pass to `exim`
#
# Note that this will override the defaults set by the Mail gem (currently: '-i -t')
# So, if set here, be sure to set all the arguments you require.
#
# Example: '-i -t -X/tmp/traffic.log'
attr_accessor :exim_args
##
# Folder where mail will be kept when using the `:file` `delivery_method` option.
#
# Default location is '$HOME/Backup/emails'
attr_accessor :mail_folder
def initialize(model, &block)
super(model)
instance_eval(&block) if block_given?
end
private
##
# 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` was set to `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` was set to `true`
#
# [:failure]
# The backup operation failed.
# Notification will be sent, including the Exception which caused
# the failure, the Exception's backtrace, a copy of the current
# backup log and other information if `on_failure` was set to `true`
#
def notify!(status)
name, send_log =
case status
when :success then [ 'Success', false ]
when :warning then [ 'Warning', true ]
when :failure then [ 'Failure', true ]
end
email = new_email
email.subject = "[Backup::%s] #{@model.label} (#{@model.trigger})" % name
email.body = @template.result('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
email.deliver!
end
##
# Configures the Mail gem by setting the defaults.
# Creates and returns a new email, based on the @delivery_method used.
def new_email
method = %w{ smtp sendmail exim file test }.
index(@delivery_method.to_s) ? @delivery_method.to_s : 'smtp'
options =
case method
when 'smtp'
{ :address => @address,
:port => @port,
:domain => @domain,
:user_name => @user_name,
:password => @password,
:authentication => @authentication,
:enable_starttls_auto => @encryption == :starttls,
:openssl_verify_mode => @openssl_verify_mode,
:ssl => @encryption == :ssl,
:tls => @encryption == :tls
}
when 'sendmail'
opts = {}
opts.merge!(:location => File.expand_path(@sendmail)) if @sendmail
opts.merge!(:arguments => @sendmail_args) if @sendmail_args
opts
when 'exim'
opts = {}
opts.merge!(:location => File.expand_path(@exim)) if @exim
opts.merge!(:arguments => @exim_args) if @exim_args
opts
when 'file'
@mail_folder ||= File.join(Config.root_path, 'emails')
{ :location => File.expand_path(@mail_folder) }
when 'test' then {}
end
::Mail.defaults do
delivery_method method.to_sym, options
end
email = ::Mail.new
email.to = @to
email.from = @from
email
end
end
end
end
Jump to Line
Something went wrong with that request. Please try again.