module ExceptionNotifier::EmailNotifier::Mailer

Public Class Methods

extended(base) click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 18
def self.extended(base)
  base.class_eval do
    self.send(:include, ExceptionNotifier::BacktraceCleaner)

    # Append application view path to the ExceptionNotifier lookup context.
    self.append_view_path "#{File.dirname(__FILE__)}/views"

    def exception_notification(env, exception, options={}, default_options={})
      load_custom_views

      @env        = env
      @exception  = exception
      @options    = options.reverse_merge(env['exception_notifier.options'] || {}).reverse_merge(default_options)
      @kontroller = env['action_controller.instance'] || MissingController.new
      @request    = ActionDispatch::Request.new(env)
      @backtrace  = exception.backtrace ? clean_backtrace(exception) : []
      @sections   = @options[:sections]
      @data       = (env['exception_notifier.exception_data'] || {}).merge(options[:data] || {})
      @sections   = @sections + %w(data) unless @data.empty?

      compose_email
    end

    def background_exception_notification(exception, options={}, default_options={})
      load_custom_views

      @exception = exception
      @options   = options.reverse_merge(default_options)
      @backtrace = exception.backtrace || []
      @sections  = @options[:background_sections]
      @data      = options[:data] || {}

      compose_email
    end

    private

    def compose_subject
      subject = "#{@options[:email_prefix]}"
      subject << "#{@kontroller.controller_name}##{@kontroller.action_name}" if @kontroller
      subject << " (#{@exception.class})"
      subject << " #{@exception.message.inspect}" if @options[:verbose_subject]
      subject = EmailNotifier.normalize_digits(subject) if @options[:normalize_subject]
      subject.length > 120 ? subject[0...120] + "..." : subject
    end

    def set_data_variables
      @data.each do |name, value|
        instance_variable_set("@#{name}", value)
      end
    end

    helper_method :inspect_object

    def inspect_object(object)
      case object
        when Hash, Array
          object.inspect
        else
          object.to_s
      end
    end

    def html_mail?
      @options[:email_format] == :html
    end

    def compose_email
      set_data_variables
      subject = compose_subject
      name = @env.nil? ? 'background_exception_notification' : 'exception_notification'

      headers = {
          :delivery_method => @options[:delivery_method],
          :to => @options[:exception_recipients],
          :from => @options[:sender_address],
          :subject => subject,
          :template_name => name
      }.merge(@options[:email_headers])

      mail = mail(headers) do |format|
        format.text
        format.html if html_mail?
      end

      mail.delivery_method.settings.merge!(@options[:mailer_settings]) if @options[:mailer_settings]

      mail
    end

    def load_custom_views
      if defined?(Rails) && Rails.respond_to?(:root)
        self.prepend_view_path Rails.root.nil? ? "app/views" : "#{Rails.root}/app/views"
      end
    end
  end
end

Public Instance Methods

background_exception_notification(exception, options={}, default_options={}) click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 41
def background_exception_notification(exception, options={}, default_options={})
  load_custom_views

  @exception = exception
  @options   = options.reverse_merge(default_options)
  @backtrace = exception.backtrace || []
  @sections  = @options[:background_sections]
  @data      = options[:data] || {}

  compose_email
end
compose_email() click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 85
def compose_email
  set_data_variables
  subject = compose_subject
  name = @env.nil? ? 'background_exception_notification' : 'exception_notification'

  headers = {
      :delivery_method => @options[:delivery_method],
      :to => @options[:exception_recipients],
      :from => @options[:sender_address],
      :subject => subject,
      :template_name => name
  }.merge(@options[:email_headers])

  mail = mail(headers) do |format|
    format.text
    format.html if html_mail?
  end

  mail.delivery_method.settings.merge!(@options[:mailer_settings]) if @options[:mailer_settings]

  mail
end
compose_subject() click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 55
def compose_subject
  subject = "#{@options[:email_prefix]}"
  subject << "#{@kontroller.controller_name}##{@kontroller.action_name}" if @kontroller
  subject << " (#{@exception.class})"
  subject << " #{@exception.message.inspect}" if @options[:verbose_subject]
  subject = EmailNotifier.normalize_digits(subject) if @options[:normalize_subject]
  subject.length > 120 ? subject[0...120] + "..." : subject
end
exception_notification(env, exception, options={}, default_options={}) click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 25
def exception_notification(env, exception, options={}, default_options={})
  load_custom_views

  @env        = env
  @exception  = exception
  @options    = options.reverse_merge(env['exception_notifier.options'] || {}).reverse_merge(default_options)
  @kontroller = env['action_controller.instance'] || MissingController.new
  @request    = ActionDispatch::Request.new(env)
  @backtrace  = exception.backtrace ? clean_backtrace(exception) : []
  @sections   = @options[:sections]
  @data       = (env['exception_notifier.exception_data'] || {}).merge(options[:data] || {})
  @sections   = @sections + %w(data) unless @data.empty?

  compose_email
end
html_mail?() click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 81
def html_mail?
  @options[:email_format] == :html
end
inspect_object(object) click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 72
def inspect_object(object)
  case object
    when Hash, Array
      object.inspect
    else
      object.to_s
  end
end
load_custom_views() click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 108
def load_custom_views
  if defined?(Rails) && Rails.respond_to?(:root)
    self.prepend_view_path Rails.root.nil? ? "app/views" : "#{Rails.root}/app/views"
  end
end
set_data_variables() click to toggle source
# File lib/exception_notifier/email_notifier.rb, line 64
def set_data_variables
  @data.each do |name, value|
    instance_variable_set("@#{name}", value)
  end
end