class Glima::ImapWatch

Public Class Methods

new(imap_server, authorization, logger) click to toggle source
# File lib/glima/imap.rb, line 130
def initialize(imap_server, authorization, logger)
  @imap_server, @authorization, @logger = imap_server, authorization, logger
  @current_folder = nil
  connect(imap_server, authorization)
end

Public Instance Methods

wait(folder = nil, timeout_sec = 60) click to toggle source
# File lib/glima/imap.rb, line 136
def wait(folder = nil, timeout_sec = 60)
  select(folder || :all) unless @current_folder

  logger.info "[#{self.class}#wait] Enter"
  begin
    logger.info "[#{self.class}#wait] IMAP IDLE start (timeout: #{timeout_sec})"
    @imap.idle(timeout_sec) do |resp|
      logger.info "[#{self.class}#wait] got event #{resp.name} in IMAP IDLE"
      @imap.idle_done
    end
    logger.info "[#{self.class}#wait] IMAP IDLE done"

  # rescue Net::IMAP::Error => e
  #   if e.inspect.include? "connection closed"
  #     reconnect
  #   else
  #     raise
  #   end
  end
  logger.info "[#{self.class}#wait] Exit"
end

Private Instance Methods

connect(imap_server, authorization) click to toggle source
# File lib/glima/imap.rb, line 175
def connect(imap_server, authorization)
  logger.info "[#{self.class}#connect] Enter"
  retry_count = 0

  begin
    Timeout.timeout(10) do
      # @imap = Glima::IMAP.new(imap_server, 993, true)
      @imap = Glima::IMAP.new(imap_server, :port => 993, :ssl => {:timeout => 10})

      @imap.authenticate('XOAUTH2',
                         authorization.username,
                         authorization.access_token)
      logger.info "[#{self.class}#connect] connected"
    end
  rescue Timeout::Error, Net::IMAP::NoResponseError => e
    logger.info "[#{self.class}#connect] rescue #{e}"

    if e.inspect.include? "Invalid credentials" && retry_count < 2
      logger.info "[#{self.class}#connect] Refreshing access token for #{imap_server}."
      authorization.refresh!
      retry_count += 1
      retry
    else
      raise
    end
  end
  logger.info "[#{self.class}#connect] Exit"
end
logger() click to toggle source

def reconnect

logger.info "[#{self.class}#reconnect] Enter"
connect(@imap_server, @authorization)
logger.info "[#{self.class}#reconnect] Exit"

end

# File lib/glima/imap.rb, line 210
def logger
  @logger
end
select(folder) click to toggle source
# File lib/glima/imap.rb, line 160
def select(folder)
  @current_folder = folder

  if folder == :all
    # select "[Gmail]/All Mail" or localized one like "[Gmail]/すべてのメール"
    folder = @imap.list("", "[Gmail]/*").find {|f| f.attr.include?(:All)}.name
  else
    folder = Net::IMAP.encode_utf7(folder)
  end

  logger.info "[#{self.class}#wait] IMAP Selecting #{Net::IMAP.decode_utf7(folder)}..."
  @imap.select(folder)
  logger.info "[#{self.class}#wait] IMAP Selected #{Net::IMAP.decode_utf7(folder)}"
end