fsaravia/monkey-mailer

View on GitHub
lib/monkey-mailer/adapters/mandrilapi.rb

Summary

Maintainability
A
1 hr
Test Coverage
require "net/http"
require "uri"
require "json"
require 'base64'

module MonkeyMailer
  module Adapters
    class MandrilAPI

      @key = ''

      def initialize(options)
        @key = options[:mandril_api_key]
      end

      def send_email(email)

        request_body = {
          :key => @key,
          :message => {
            :to => parse_recipients(email.to_email, email.to_name),
            :from_name => email.from_name,
            :from_email => email.from_email,
            :subject => email.subject,
            :html => email.body,
            :text => email.body.to_s.gsub(/<\/?[^>]*>/, ""),
            :headers => {},
            :track_opens => true,
            :track_clicks => true,
            :auto_text => true,
            :url_strip_qs => true,
            :preserve_recipients => false,
            :bcc_address => '',
            :attachments => []
          },
          :async => false
        }

        email.attachments.each do |attachment|
          request_body[:message][:attachments] << {
            :type => attachment.content_type,
            :name => File.basename(attachment.file_path),
            :content => Base64.encode64(File.read(attachment.file_path))
          }
        end

        uri = URI('https://mandrillapp.com')
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true

        request = Net::HTTP::Post.new('/api/1.0/messages/send.json', initheader = {'Content-Type' =>'application/json'})
        request.body = request_body.to_json

        response = http.start {|http| http.request(request)}

        raise MonkeyMailer::DeliverError.new("Mandril response.code not equal to 200") unless response.code.to_i == 200
        puts "Response #{response.code} #{response.message}: #{response.body}"
      end

      def parse_recipients(recipients_list, names_list = "")
        recipients = recipients_list.split(",")
        names      = names_list.to_s.split(",")
        to_list    = []

        raise RuntimeError.new("No recipients specified") if recipients.empty?

        if names.any? && (names.count != recipients.count)
          raise RuntimeError.new("Recipients and Names lists don't match")
        end

        recipients.each_with_index do |recipient, idx|
          to_list << { "email" => recipient.strip,
                       "name" => names[idx] ? names[idx].strip : "",
                       "type" => "to" }
        end

        to_list
      end

    end
  end
end