class MailRoom::Delivery::Sidekiq

Sidekiq Delivery method @author Douwe Maan

Constants

Options

Attributes

options[RW]

Public Class Methods

new(options) click to toggle source

Build a new delivery, hold the mailbox configuration @param [MailRoom::Delivery::Sidekiq::Options]

# File lib/mail_room/delivery/sidekiq.rb, line 26
def initialize(options)
  @options = options
end

Public Instance Methods

deliver(message) click to toggle source

deliver the message by pushing it onto the configured Sidekiq queue @param message [String] the email message as a string, RFC822 format

# File lib/mail_room/delivery/sidekiq.rb, line 32
def deliver(message)
  item = item_for(message)

  client.lpush("queue:#{options.queue}", JSON.generate(item))

  true
end

Private Instance Methods

client() click to toggle source
# File lib/mail_room/delivery/sidekiq.rb, line 42
def client
  client = Redis.new(url: options.redis_url)

  namespace = options.namespace
  if namespace
    require 'redis/namespace'
    Redis::Namespace.new(namespace, redis: client)
  else
    client
  end
end
item_for(message) click to toggle source
# File lib/mail_room/delivery/sidekiq.rb, line 54
def item_for(message)
  {
    'class'       => options.worker,
    'args'        => [utf8_encode_message(message)],

    'queue'       => options.queue,
    'jid'         => SecureRandom.hex(12),
    'retry'       => false,
    'enqueued_at' => Time.now.to_f
  }
end
utf8_encode_message(message) click to toggle source
# File lib/mail_room/delivery/sidekiq.rb, line 66
def utf8_encode_message(message)
  message = message.dup

  message.force_encoding("UTF-8")
  return message if message.valid_encoding?

  detection = CharlockHolmes::EncodingDetector.detect(message)
  return message unless detection && detection[:encoding]

  # Convert non-UTF-8 body UTF-8 so it can be dumped as JSON.
  CharlockHolmes::Converter.convert(message, detection[:encoding], 'UTF-8')
end