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