class Ryespy::Listener::IMAP

Constants

REDIS_KEY_PREFIX
SIDEKIQ_JOB_CLASS

Public Class Methods

new(opts = {}) click to toggle source
Calls superclass method Ryespy::Listener::Base::new
# File lib/ryespy/listener/imap.rb, line 13
def initialize(opts = {})
  @imap_config = {
    :host      => opts[:host],
    :port      => opts[:port],
    :ssl       => opts[:ssl],
    :username  => opts[:username],
    :password  => opts[:password],
  }
  
  super(opts)
end

Public Instance Methods

check(mailbox) click to toggle source
# File lib/ryespy/listener/imap.rb, line 29
def check(mailbox)
  @logger.debug { "mailbox: #{mailbox}" }
  
  @logger.debug { "redis_key: #{redis_key(mailbox)}" }
  
  last_seen_uid = @redis.get(redis_key(mailbox)).to_i
  
  unseen_uids = get_unseen_uids(mailbox, last_seen_uid)
  
  @logger.debug { "unseen_uids: #{unseen_uids}" }
  
  unseen_uids.each do |uid|
    @redis.set(redis_key(mailbox), uid)
    
    @notifiers.each { |n| n.notify(SIDEKIQ_JOB_CLASS, [mailbox, uid]) }
  end
  
  @logger.info { "#{mailbox} has #{unseen_uids.count} new emails" }
end
close() click to toggle source
# File lib/ryespy/listener/imap.rb, line 25
def close
  @imap.disconnect
end

Private Instance Methods

connect_service() click to toggle source
# File lib/ryespy/listener/imap.rb, line 51
def connect_service
  @imap = Net::IMAP.new(@imap_config[:host], {
    :port => @imap_config[:port],
    :ssl  => @imap_config[:ssl],
  })
  
  @imap.login(@imap_config[:username], @imap_config[:password])
end
get_unseen_uids(mailbox, last_seen_uid = nil) click to toggle source
# File lib/ryespy/listener/imap.rb, line 70
def get_unseen_uids(mailbox, last_seen_uid = nil)
  @imap.select(mailbox)
  
  uids = @imap.uid_search("#{last_seen_uid + 1}:*")
  
  # filter as IMAP search gets fun with edge cases
  uids.find_all { |uid| uid > last_seen_uid }
end
redis_key(mailbox) click to toggle source
# File lib/ryespy/listener/imap.rb, line 60
def redis_key(mailbox)
  [
    REDIS_KEY_PREFIX,
    @imap_config[:host],
    @imap_config[:port],
    @imap_config[:username],
    mailbox,
  ].join(':')
end