module Railgun

Public Instance Methods

build_message_object(mail) click to toggle source

Acts on a Rails/ActionMailer message object and uses Mailgun::MessageBuilder to construct a new message.

@param [Mail::Message] mail message to transform

@returns [Hash] Message hash from Mailgun::MessageBuilder

# File lib/railgun/mailer.rb, line 99
def build_message_object(mail)
  mb = Mailgun::MessageBuilder.new

  mb.from mail[:from]
  mb.reply_to(mail[:reply_to].to_s) if mail[:reply_to].present?
  mb.subject mail.subject
  mb.body_html extract_body_html(mail)
  mb.body_text extract_body_text(mail)

  [:to, :cc, :bcc].each do |rcpt_type|
    addrs = mail[rcpt_type] || nil
    case addrs
    when String
      # Likely a single recipient
      mb.add_recipient rcpt_type.to_s, addrs
    when Array
      addrs.each do |addr|
        mb.add_recipient rcpt_type.to_s, addr
      end
    when Mail::Field
      mb.add_recipient rcpt_type.to_s, addrs.to_s
    end
  end

  return mb.message if mail.attachments.empty?

  mail.attachments.each do |attach|
    attach = Attachment.new(attach, encoding: 'ascii-8bit', inline: attach.inline?)
    attach.attach_to_message! mb
  end

  return mb.message
end
extract_body_html(mail) click to toggle source

Returns the decoded HTML body from the Mail::Message object if available, otherwise nil.

@param [Mail::Message] mail message to transform

@return [String]

# File lib/railgun/mailer.rb, line 139
def extract_body_html(mail)
  begin
    (mail.html_part || mail).body.decoded || nil
  rescue
    nil
  end
end
extract_body_text(mail) click to toggle source

Returns the decoded text body from the Mail::Message object if it is available, otherwise nil.

@param [Mail::Message] mail message to transform

@return [String]

# File lib/railgun/mailer.rb, line 153
def extract_body_text(mail)
  begin
    (mail.text_part || mail).body.decoded || nil
  rescue
    nil
  end
end
transform_for_mailgun(mail) click to toggle source

Performs a series of transformations on the `mailgun*` attributes. After prefixing them with the proper option type, they are added to the message hash where they will then be sent to the API as JSON.

@param [Mail::Message] mail message to transform

@return [Hash] transformed message hash

# File lib/railgun/mailer.rb, line 64
def transform_for_mailgun(mail)
  message = build_message_object(mail)

  # v:* attributes (variables)
  mail.mailgun_variables.try(:each) do |k, v|
    message["v:#{k}"] = v
  end

  # o:* attributes (options)
  mail.mailgun_options.try(:each) do |k, v|
    message["o:#{k}"] = v
  end

  # h:* attributes (headers)
  mail.mailgun_headers.try(:each) do |k, v|
    message["h:#{k}"] = v
  end

  # recipient variables
  message['recipient-variables'] = mail.mailgun_recipient_variables.to_json if mail.mailgun_recipient_variables

  # reject blank values
  message.delete_if do |k, v|
    v.nil? or (v.respond_to?(:empty) and v.empty?)
  end

  return message
end