class MultiMail::Sender::Mailgun

Mailgun's outgoing mail sender.

Attributes

api_key[R]
domain[R]

Public Class Methods

new(options = {}) click to toggle source

Initializes a Mailgun outgoing email sender.

@param [Hash] options required and optional arguments @option options [String] :api_key a Mailgun API key @option options [String] :domain the Mailgun email domain @see documentation.mailgun.com/api-intro.html#base-url

Calls superclass method MultiMail::Sender::Base::new
# File lib/multi_mail/mailgun/sender.rb, line 17
def initialize(options = {})
  super
  @api_key = settings.delete(:api_key)
  @domain = settings.delete(:domain)
end

Public Instance Methods

deliver!(mail) click to toggle source

Delivers a message via the Mailgun API.

@param [Mail::Message] mail a message

# File lib/multi_mail/mailgun/sender.rb, line 50
def deliver!(mail)
  message = MultiMail::Message::Mailgun.new(mail).to_mailgun_hash.merge(parameters)

  connection = Faraday.new do |conn|
    conn.basic_auth 'api', api_key
    conn.request :multipart
    conn.request :url_encoded
    conn.adapter Faraday.default_adapter
  end

  response = connection.post("https://api.mailgun.net/v2/#{domain}/messages", message)

  case response.status
  when 401
    raise InvalidAPIKey, response.body
  when 400, 404
    body = JSON.load(response.body)
    case body['message']
    when "'from' parameter is missing"
      raise MissingSender, body['message']
    when "'to' parameter is missing"
      raise MissingRecipients, body['message']
    when "Need at least one of 'text' or 'html' parameters specified"
      raise MissingBody, body['message']
    else
      raise InvalidRequest, body['message']
    end
  when 200
    body = JSON.load(response.body)
  else
    raise response.body
  end

  if settings[:return_response]
    body
  else
    self
  end
end
parameters() click to toggle source

Returns the additional parameters for the API call.

@return [Hash] the additional parameters for the API call

# File lib/multi_mail/mailgun/sender.rb, line 26
def parameters
  parameters = settings.dup
  parameters.delete(:return_response)

  [:opens, :clicks].each do |sym|
    if tracking.key?(sym)
      parameter = :"o:tracking-#{sym}"
      case tracking[sym]
      when 'yes', 'no', 'htmlonly'
        parameters[parameter] = tracking[sym]
      when true
        parameters[parameter] = 'yes'
      when false
        parameters[parameter] = 'no'
      end # ignore nil
    end
  end

  parameters
end