Class: MandrillMailer::CoreMailer

Inherits:
Object
  • Object
show all
Defined in:
lib/mandrill_mailer/core_mailer.rb

Direct Known Subclasses

MessageMailer, TemplateMailer

Defined Under Namespace

Classes: InvalidEmail, InvalidInterceptorParams, InvalidMailerMethod, InvalidMergeLanguageError

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object (protected)

Proxy route helpers to rails if Rails exists. Doing routes this way makes it so this gem doesn’t need to be a rails engine



311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/mandrill_mailer/core_mailer.rb', line 311

def method_missing(method, *args)
  return super unless defined?(Rails) && Rails.application.routes.url_helpers.respond_to?(method)
  # Check to see if one of the args is an open struct. If it is, we'll assume it's the
  # test stub and try to call a path or url attribute.
  if args.any? {|arg| arg.kind_of?(MandrillMailer::Mock)}
    # take the first OpenStruct found in args and look for .url or.path
    args.each do |arg|
      if arg.kind_of?(MandrillMailer::Mock)
        break arg.url || arg.path
      end
    end
  else
    options = args.extract_options!.merge({host: MandrillMailer.config.default_url_options[:host], protocol: MandrillMailer.config.default_url_options[:protocol]})
    args << options
    Rails.application.routes.url_helpers.method(method).call(*args)
  end
end

Class Attribute Details

.defaultsObject

Public: Defaults for the mailer. Currently the only option is from:

options - The Hash options used to refine the selection (default: {}):

:from       - Default from email address
:from_name  - Default from name
:merge_vars - Default merge vars

Examples

default from: '[email protected]',
        from_name: 'Foo Bar',
        merge_vars: {'FOO' => 'Bar'}

Returns options



146
147
148
# File 'lib/mandrill_mailer/core_mailer.rb', line 146

def self.defaults
  @defaults || super_defaults || {}
end

Instance Attribute Details

#asyncObject

Public: Enable background sending mode



123
124
125
# File 'lib/mandrill_mailer/core_mailer.rb', line 123

def async
  @async
end

#ip_poolObject

Public: Name of the dedicated IP pool that should be used to send the message



126
127
128
# File 'lib/mandrill_mailer/core_mailer.rb', line 126

def ip_pool
  @ip_pool
end

#messageObject

Public: Other information on the message to send



120
121
122
# File 'lib/mandrill_mailer/core_mailer.rb', line 120

def message
  @message
end

#send_atObject

Public: When message should be sent



129
130
131
# File 'lib/mandrill_mailer/core_mailer.rb', line 129

def send_at
  @send_at
end

Class Method Details

.default(args) ⇒ Object



154
155
156
157
158
159
# File 'lib/mandrill_mailer/core_mailer.rb', line 154

def self.default(args)
  @defaults ||= {}
  @defaults[:from] ||= '[email protected]'
  @defaults[:merge_vars] ||= {}
  @defaults.merge!(args)
end

.method_missing(method, *args, &block) ⇒ Object



297
298
299
300
# File 'lib/mandrill_mailer/core_mailer.rb', line 297

def method_missing(method, *args, &block)
  return super unless respond_to?(method)
  new.method(method).call(*args, &block)
end

.super_defaultsObject



150
151
152
# File 'lib/mandrill_mailer/core_mailer.rb', line 150

def self.super_defaults
  superclass.defaults if superclass.respond_to?(:defaults)
end

.test(mailer_method, options = {}) ⇒ Object

Public: Executes a test email

mailer_method - Method to execute

options - The Hash options used to refine the selection (default: {}):

:email - The email to send the test to.

Examples

InvitationMailer.test(:invite, email: '[email protected]')

Returns the duplicated String.



202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/mandrill_mailer/core_mailer.rb', line 202

def self.test(mailer_method, options={})
  unless options[:email]
    raise InvalidEmail.new 'Please specify a :email option(email to send the test to)'
  end

  if @mailer_methods[mailer_method]
    @mailer_methods[mailer_method].call(self.new, options)
  else
    raise InvalidMailerMethod.new "The mailer method: #{mailer_method} does not have test setup"
  end

end

.test_setup_for(mailer_method, &block) ⇒ Object

Public: setup a way to test mailer methods

mailer_method - Name of the mailer method the test setup is for

block - Block of code to execute to perform the test. The mailer and options are passed to the block. The options have to contain at least the :email to send the test to.

Examples

test_setup_for :invite do |mailer, options|
  invitation = OpenStruct.new({
    email: options[:email],
    owner_name: 'foobar',
    secret: rand(9000000..1000000).to_s
  })
  mailer.invite(invitation).deliver
end

Returns the duplicated String.



185
186
187
188
# File 'lib/mandrill_mailer/core_mailer.rb', line 185

def self.test_setup_for(mailer_method, &block)
  @mailer_methods ||= {}
  @mailer_methods[mailer_method] = block
end

Instance Method Details

#bccObject



275
276
277
# File 'lib/mandrill_mailer/core_mailer.rb', line 275

def bcc
  self.message && self.message['bcc_address']
end

#deliverObject

Public: Triggers the stored Mandrill params to be sent to the Mandrill api

Raises:

  • (NotImplementedError)


216
217
218
# File 'lib/mandrill_mailer/core_mailer.rb', line 216

def deliver
  raise NotImplementedError.new("#{self.class.name}#deliver is not implemented.")
end

#deliver_laterObject

Raises:

  • (NotImplementedError)


224
225
226
# File 'lib/mandrill_mailer/core_mailer.rb', line 224

def deliver_later
  raise NotImplementedError.new("#{self.class.name}#deliver_later is not implemented.")
end

#deliver_nowObject

Raises:

  • (NotImplementedError)


220
221
222
# File 'lib/mandrill_mailer/core_mailer.rb', line 220

def deliver_now
  raise NotImplementedError.new("#{self.class.name}#deliver_now is not implemented.")
end

#fromObject



263
264
265
# File 'lib/mandrill_mailer/core_mailer.rb', line 263

def from
  self.message && self.message['from_email']
end

#mandrill_mail(args) ⇒ Object

Public: Build the hash needed to send to the mandrill api

args - The Hash options used to refine the selection:

Examples

mandrill_mail template: 'Group Invite',
            subject: I18n.t('invitation_mailer.invite.subject'),
            to: invitation.email,
            vars: {
              'OWNER_NAME' => invitation.owner_name,
              'INVITATION_URL' => new_invitation_url(email: invitation.email, secret: invitation.secret)
            }

Returns the the mandrill mailer class (this is so you can chain #deliver like a normal mailer)



247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'lib/mandrill_mailer/core_mailer.rb', line 247

def mandrill_mail(args)
  extract_api_options!(args)

  # Call the mandrill_mail_handler so mailers can handle the args in custom ways
  mandrill_mail_handler(args)

  # Construct message hash
  self.message = MandrillMailer::ArgFormatter.format_messages_api_message_data(args, self.class.defaults)

  # Apply any interceptors that may be present
  apply_interceptors!(self.message)

  # return self so we can chain deliver after the method call, like a normal mailer.
  self
end

#mandrill_mail_handler(args) ⇒ Object



228
229
230
# File 'lib/mandrill_mailer/core_mailer.rb', line 228

def mandrill_mail_handler(args)
  args
end

#toObject



267
268
269
# File 'lib/mandrill_mailer/core_mailer.rb', line 267

def to
  self.message && self.message['to']
end

#to=(values) ⇒ Object



271
272
273
# File 'lib/mandrill_mailer/core_mailer.rb', line 271

def to=(values)
  self.message && self.message['to'] = MandrillMailer::ArgFormatter.params(values)
end