class Popper::MailAccount

Attributes

complete_list[RW]
config[RW]
current_list[RW]

Public Class Methods

new(config) click to toggle source
# File lib/popper/mail_account.rb, line 9
def initialize(config)
  self.config = config
end

Public Instance Methods

check_and_action(m) click to toggle source
# File lib/popper/mail_account.rb, line 47
def check_and_action(m)
  mail = EncodeMail.new(m.mail)
  Popper.log.info "check mail:#{mail.date.to_s} #{mail.subject}"
  match_rules?(mail).each do |rule|
    Popper.log.info "do action:#{mail.subject}"
    Popper::Action::ExecCmd.run(config.action_by_rule(rule), mail) if config.action_by_rule(rule)
  end

  m.uidl
end
match_rules?(mail) click to toggle source
# File lib/popper/mail_account.rb, line 88
def match_rules?(mail)
  config.rule_with_conditions_select do |rule,mail_header,conditions|
    conditions.all? do |condition|
      mail.respond_to?(mail_header) && mail.send(mail_header).to_s.match(/#{condition}/)
    end
  end
end
pop(conn) click to toggle source
# File lib/popper/mail_account.rb, line 23
def pop(conn)
  done_uidls = []
  error_uidls = []

  Popper.log.info "start popper #{config.name}"

  process_uidl_list(conn).each do |m|
    begin
      done_uidls << check_and_action(m)
      m.delete if config.login.respond_to?(:delete_after) && config.login.delete_after
    rescue Net::POPError => e
      self.complete_list += done_uidls
      Popper.log.warn "pop err write uidl"
      return
    rescue => e
      error_uidls << m.uidl
      Popper.log.warn e
    end
  end

  self.complete_list = current_list - error_uidls
  Popper.log.info "success popper #{config.name}"
end
process_uidl_list(conn) click to toggle source
# File lib/popper/mail_account.rb, line 83
def process_uidl_list(conn)
  uidl_list = current_list - complete_list
  conn.mails.select {|_m|uidl_list.include?(_m.uidl)}
end
run() click to toggle source
# File lib/popper/mail_account.rb, line 13
def run
  session_start do |conn|
    self.current_list = conn.mails.map(&:uidl)
    self.complete_list = current_list unless complete_list
    pop(conn)
  end
  rescue => e
    Popper.log.warn e
end
session_start(&block) click to toggle source
# File lib/popper/mail_account.rb, line 58
def session_start(&block)
  pop = Net::POP3.new(config.login.server, config.login.port || 110)
  pop = set_pop_option(pop)

  pop.start(
    config.login.user,
    config.login.password
  ) do |conn|
    Popper.log.info "connect server #{config.name}"
    block.call(conn)
    Popper.log.info "disconnect server #{config.name}"
  end
end
set_pop_option(pop) click to toggle source
# File lib/popper/mail_account.rb, line 72
def set_pop_option(pop)
  pop.enable_ssl if config.login.respond_to?(:ssl) && config.login.ssl
  %w(
    open_timeout
    read_timeout
  ).each do |m|
    pop.instance_variable_set("@#{m}", ENV['POP_TIMEOUT'] || 120)
  end
  pop
end