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 27
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 33
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 43
def client
  @client ||= begin
    sentinels = options.sentinels
    redis_options = { url: options.redis_url }
    redis_options[:sentinels] = sentinels if sentinels

    redis = ::Redis.new(redis_options)

    namespace = options.namespace
    if namespace
      require 'redis/namespace'
      Redis::Namespace.new(namespace, redis: redis)
    else
      redis
    end
  end
end
item_for(message) click to toggle source
# File lib/mail_room/delivery/sidekiq.rb, line 61
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 73
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