Module: ActionMailer::Mandrill

Extended by:
ActiveSupport::Concern
Defined in:
lib/action_mailer/mandrill.rb,
lib/action_mailer/mandrill/version.rb

Overview

Adds a new way to send mails via Mandrill (actually uses normal SMTP just sets specific SMTP headers)

Examples:

Sending a mail via Mandrill with specific template


def notification(user)
  @user = user

  mandrill_mail('user_invite', 
    to: '[email protected]', 
    subject: 'test', 
    merge_objects: [user]
  )
end

Constant Summary collapse

VERSION =
"0.0.1"

Instance Method Summary collapse

Instance Method Details

#mandrill_mail(template_slug, options = {}) ⇒ Object

Sends a mail with a specific mandrill template See help.mandrill.com/entries/21688056-Using-SMTP-Headers-to-customize-your-messages to learn more about each option.

Parameters:

  • template_slug (String)

    The slug that identifies the template to use

  • options (Hash) (defaults to: {})

    The options for the mail, such as sender, receiver, etc.

Options Hash (options):

  • :to (String|Array)

    Recipient email

  • :from (String)

    Sender email (respects AM defaults)

  • :subject (String)

    The subject

  • :link_tracking (String)

    See X-MC-Track

  • :merge_objects (Array)

    Used to generate X-MC-MergeVars, need to be Mandrill Serializable (!)

  • :merge_tags (Hash)

    Used to generate X-MC-MergeVars, need to be Mandrill Serializable (!)

  • :tags (Array)

    Tag the email

Raises:

  • (RuntimeError)

    if receivers are blank



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/action_mailer/mandrill.rb', line 41

def mandrill_mail(template_slug, options = {})
  merge_tags = {}

  headers['X-MC-Template']      = template_slug
  headers['X-MC-Track']         = options.delete(:link_tracking) if options.has_key?(:link_tracking)
  headers['X-MC-Tags']          = options.delete(:tags).join(',') if options.has_key?(:tags)

  receiver_name                 = options.delete(:receiver_name)

  receivers = options.delete(:to)
  receivers = [receivers] unless receivers.is_a?(Array)
  raise RuntimeError.new("Please specify at least one receiver") if receivers.blank?

  if options.has_key?(:merge_objects)
    options.delete(:merge_objects).each do |o| 
      merge_tags = merge_tags.merge!(o.to_mandrill_merge_tags) 
    end
  end

  if options.has_key?(:merge_tags) 
    merge_tags = merge_tags.merge! options.delete(:merge_tags)
  end

  receivers.each do |receiver|
    headers['X-MC-MergeVars'] = JSON.generate(
      merge_tags.merge!('_rcpt' => receiver), 
      ascii_only: true
    )
  end

  options[:to] = receivers
  options[:to] = "#{receiver_name} <#{receivers.first}>" if receivers.length == 1 && receiver_name.present?

  mail(options) do |format|
    format.text { render text: '' }
  end
end