class MailgunClient

Client for sending email via Mailgun v3 API

Public Class Methods

bad_req_code() click to toggle source

Accessor for the Bad Request Code

# File lib/email_api/email/client/mailgun_client.rb, line 24
def self.bad_req_code
  @bad_req_code
end
exp_msg() click to toggle source

Accessor for the expected success message

# File lib/email_api/email/client/mailgun_client.rb, line 14
def self.exp_msg
  @exp_msg
end
internal_err_code() click to toggle source

Accessor for the Internal Server Error Code

# File lib/email_api/email/client/mailgun_client.rb, line 29
def self.internal_err_code
  @internal_err_code
end
ok_code() click to toggle source

Accessor for the OK Code

# File lib/email_api/email/client/mailgun_client.rb, line 19
def self.ok_code
  @ok_code
end
send_email(email_object) click to toggle source

Sends an email over HTTPS

@param [EmailObject] email_object @return [Response] rest_client_response

# File lib/email_api/email/client/mailgun_client.rb, line 37
def self.send_email(email_object)

  # Build Mailgun-specific URL and POST data
  api_key = ENV['MAILGUN_PRIVATE_KEY']
  domain  = ENV['MAILGUN_DOMAIN']
  return internal_err_code if api_key.nil? || domain.nil?

  post_data = parse_post_data(email_object, domain)
  return bad_req_code if post_data.nil?

  url = "https://api:#{api_key}@api.mailgun.net/v3/#{domain}/messages"

  # Send Email, return response
  begin
    response = RestClient.post url, post_data
  rescue StandardError => e
    # Log error and fail send -> occurs when Code 400 due to implementation
    puts "Error: #{e.message}"
    return bad_req_code
  end

  puts "Secondary Client Response: #{response}"

  # Handle expected output. Note that it is API specific.
  return ok_code if JSON.parse(response)['message'] == exp_msg

  bad_req_code
end

Private Class Methods

parse_addr_arr(email_address_arr) click to toggle source

Parses array of email addresses into proper, supported text format

@param [EmailAddress email_address_arr @return [String] email_field

# File lib/email_api/email/client/mailgun_client.rb, line 79
def self.parse_addr_arr(email_address_arr)
  return '' if email_address_arr.nil? || !email_address_arr.is_a?(Array)

  # Convert array of multiple email addresses to proper text format
  email_field = ''
  email_address_arr.each do |email_address|
    addr_text = parse_addr_text(email_address)
    unless addr_text.nil?
      email_field += ', ' unless email_field.empty?
      email_field += addr_text
    end
  end

  email_field
end
parse_addr_text(email_address) click to toggle source

Parses email address into proper, supported text format

@param [EmailAddress] email_address @return [String] email_address_text

# File lib/email_api/email/client/mailgun_client.rb, line 70
def self.parse_addr_text(email_address)
  return nil if email_address.nil? || !email_address.is_a?(EmailAddress)
  "#{email_address.name} <#{email_address.email}>"
end
parse_post_data(email_object, domain) click to toggle source

Parses an EmailObject into POST data for use in an API call

@param [EmailObject] email_object @return [String] post_data

# File lib/email_api/email/client/mailgun_client.rb, line 99
def self.parse_post_data(email_object, domain)
  # Handle missing or unsupported input parameter
  return nil if email_object.nil? || domain.nil? || !email_object.is_a?(EmailObject)

  # Handle missing mandatory Email Attributes
  return nil if email_object.from.nil? || email_object.to.nil? ||
                email_object.subject.nil? || email_object.content.nil?

  # Parse environment value and build Mailgun-specific FROM email
  from_email = EmailAddress.new(email_object.from.name, "mailgun@#{domain}")

  # Build Message Attributes
  post_data           = {}
  post_data[:from]    = parse_addr_text(from_email)
  post_data[:to]      = parse_addr_arr(email_object.to)
  post_data[:cc]      = parse_addr_arr(email_object.cc) unless email_object.cc.nil?
  post_data[:bcc]     = parse_addr_arr(email_object.bcc) unless email_object.bcc.nil?
  post_data[:subject] = email_object.subject.to_s
  post_data[:text]    = email_object.content.to_s

  post_data
end