Sha256: 5959319a34ef286acc2b0992a57f35c0c0bde4f57853fd7efbcb10b643f78f0e
Contents?: true
Size: 1.94 KB
Versions: 1
Compression:
Stored size: 1.94 KB
Contents
require 'net/imap' module Ryespy module Listener class IMAP < Base REDIS_KEY_PREFIX = 'imap'.freeze SIDEKIQ_JOB_CLASS = 'RyespyIMAPJob'.freeze def initialize(opts = {}) @imap_config = { :host => opts[:host], :port => opts[:port], :ssl => opts[:ssl], :username => opts[:username], :password => opts[:password], } super(opts) end def close @imap.disconnect end 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 private 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 def redis_key(mailbox) [ REDIS_KEY_PREFIX, @imap_config[:host], @imap_config[:port], @imap_config[:username], mailbox, ].join(':') end 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 end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
ryespy-1.0.0 | lib/ryespy/listener/imap.rb |