class Howitzer::MailAdapters::Mailgun

This class represents Mailgun mail adapter

Public Class Methods

find(recipient, subject, wait:) click to toggle source

Finds an email in storage @note emails are stored for 3 days only! @param recipient [String] an email @param subject [String] @param wait [Integer] how much time is required to wait an email @raise [EmailNotFoundError] if blank message

# File lib/howitzer/mail_adapters/mailgun.rb, line 16
def self.find(recipient, subject, wait:)
  message = {}
  retryable(find_retry_params(wait)) { message = retrieve_message(recipient, subject) }
  return new(message) if message.present?

  raise Howitzer::EmailNotFoundError,
        "Message with subject '#{subject}' for recipient '#{recipient}' was not found."
end

Private Class Methods

event_by(recipient, subject) click to toggle source
# File lib/howitzer/mail_adapters/mailgun.rb, line 90
def self.event_by(recipient, subject)
  events.to_h['items'].find do |hash|
    hash['message']['recipients'].first == recipient && subject === hash['message']['headers']['subject']
  end
end
events() click to toggle source
# File lib/howitzer/mail_adapters/mailgun.rb, line 83
def self.events
  MailgunApi::Connector.instance.client.get(
    "#{MailgunApi::Connector.instance.domain}/events", params: { event: 'stored' }
  )
end
find_retry_params(wait) click to toggle source
# File lib/howitzer/mail_adapters/mailgun.rb, line 97
def self.find_retry_params(wait)
  {
    timeout: wait || Howitzer.try(:mailgun_idle_timeout),
    sleep: Howitzer.mail_sleep_time || Howitzer.mailgun_sleep_time,
    silent: true,
    logger: Howitzer::Log,
    on: Howitzer::EmailNotFoundError
  }
end
retrieve_message(recipient, subject) click to toggle source
# File lib/howitzer/mail_adapters/mailgun.rb, line 108
def self.retrieve_message(recipient, subject)
  event = event_by(recipient, subject)
  raise Howitzer::EmailNotFoundError, 'Message not received yet, retry...' unless event

  message_url = event['storage']['url']
  MailgunApi::Connector.instance.client.get_url(message_url).to_h
end

Public Instance Methods

html_body() click to toggle source

@return [String] html body of the email message

# File lib/howitzer/mail_adapters/mailgun.rb, line 33
def html_body
  message['stripped-html']
end
mail_from() click to toggle source

@return [String] an email address specified in ‘From` field

# File lib/howitzer/mail_adapters/mailgun.rb, line 45
def mail_from
  message['From']
end
mime_part() click to toggle source

@return [Array] attachments

# File lib/howitzer/mail_adapters/mailgun.rb, line 69
def mime_part
  message['attachments']
end
mime_part!() click to toggle source

@raise [NoAttachmentsError] if no attachments present @return [Array] attachments

# File lib/howitzer/mail_adapters/mailgun.rb, line 76
def mime_part!
  files = mime_part
  return files if files.present?

  raise Howitzer::NoAttachmentsError, 'No attachments were found.'
end
plain_text_body() click to toggle source

@return [String] plain text body of the email message

# File lib/howitzer/mail_adapters/mailgun.rb, line 27
def plain_text_body
  message['body-plain']
end
received_time() click to toggle source

@return [String] when email was received

# File lib/howitzer/mail_adapters/mailgun.rb, line 57
def received_time
  message['Received'][/\w+, \d+ \w+ \d+ \d+:\d+:\d+ -\d+ \(\w+\)$/]
end
recipients() click to toggle source

@return [String] recipient emails separated with ‘, `

# File lib/howitzer/mail_adapters/mailgun.rb, line 51
def recipients
  message['To'].split ', '
end
sender_email() click to toggle source

@return [String] a real sender email address

# File lib/howitzer/mail_adapters/mailgun.rb, line 63
def sender_email
  message['sender']
end
text() click to toggle source

@return [String] stripped text

# File lib/howitzer/mail_adapters/mailgun.rb, line 39
def text
  message['stripped-text']
end