Class: ChainMail::Providers::Mailgun

Inherits:
Base
  • Object
show all
Defined in:
lib/chain_mail/providers/mailgun.rb

Class Method Summary collapse

Methods inherited from Base

post_json

Class Method Details

.build_mailgun_request(mail, domain, api_key) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/chain_mail/providers/mailgun.rb', line 24

def self.build_mailgun_request(mail, domain, api_key)
  uri = URI("https://api.mailgun.net/v3/#{domain}/messages")
  req = Net::HTTP::Post.new(uri)
  req.basic_auth("api", api_key)
  req.set_form_data(
    from: mail.from.first,
    to: mail.to.join(","),
    subject: mail.subject,
    html: mail.body.decoded
  )
  req
end

.deliver(mail, creds) ⇒ Object



10
11
12
13
14
15
16
17
# File 'lib/chain_mail/providers/mailgun.rb', line 10

def self.deliver(mail, creds)
  domain = creds[:domain]
  api_key = creds[:api_key]

  return error_result("MAILGUN_DOMAIN or MAILGUN_API_KEY not set") unless domain && api_key

  send_mailgun_request(mail, domain, api_key)
end

.error_result(error, response = nil) ⇒ Object



50
51
52
# File 'lib/chain_mail/providers/mailgun.rb', line 50

def self.error_result(error, response = nil)
  { success: false, response: response, error: error }
end

.perform_mailgun_request(req) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/chain_mail/providers/mailgun.rb', line 37

def self.perform_mailgun_request(req)
  res = Net::HTTP.start(req.uri.hostname, req.uri.port, use_ssl: true) { |http| http.request(req) }
  return success_result(res) if res.is_a?(Net::HTTPSuccess)

  error_result("Mailgun API error: #{res.code} #{res.body}", res)
rescue StandardError => e
  error_result(e.message)
end

.send_mailgun_request(mail, domain, api_key) ⇒ Object



19
20
21
22
# File 'lib/chain_mail/providers/mailgun.rb', line 19

def self.send_mailgun_request(mail, domain, api_key)
  req = build_mailgun_request(mail, domain, api_key)
  perform_mailgun_request(req)
end

.success_result(response) ⇒ Object



46
47
48
# File 'lib/chain_mail/providers/mailgun.rb', line 46

def self.success_result(response)
  { success: true, response: response, error: nil }
end