#!/usr/bin/ruby # # watchmail.imap -- status info on IMAP mailboxes require "net/imap" SERVERS = [ { 'label' => 'notes', 'host' => 'localhost', 'port' => '25143', 'user' => 'richl', 'password' => "password", 'namespace' => '', 'folders' => ['postponed-msgs', 'INBOX', nil, 'IN.*', nil, '@*'] }, { 'label' => 'personal', 'host' => 'mail.lafferty.ca', 'port' => '143', 'user' => 'lafferty', 'password' => "password", 'namespace' => 'INBOX.', 'folders' => ['INBOX', nil, 'IN.*'] }, ] $bold = `tput bold` $sgr0 = `tput sgr0` def mailstats(server, mbox) count = server['imap'].status(mbox, ['MESSAGES', 'UNSEEN']) mbox.sub!(server['namespace'],'') if (count['MESSAGES'] > 0) sprintf("%s%15s %4d%s %4d\n", count['UNSEEN'] > 0 ? $bold : "", mbox, count['UNSEEN'], count['UNSEEN'] > 0 ? $sgr0 : "", count['MESSAGES']) else "" end end while true do out = Time.now.to_s + "\n\n"; SERVERS.each do |server| out += $bold + server['label'] + $sgr0 + "\n\n" if (! server.key?("imap") or server['imap'].disconnected?) server['imap'] = Net::IMAP.new(server['host'], port = server['port']) server['imap'].authenticate('LOGIN', server['user'], server['password']) end server['folders'].each do |folder| if (folder == nil) out += "\n" elsif (folder =~ /\*/) server['imap'].list(server['namespace'], folder).sort {|a,b| a.name <=> b.name}.each do |imapf| out += mailstats(server, imapf.name) end else out += mailstats(server, folder) end end # folders out += "\n" end # servers system("clear") print out + $sgr0 sleep 30 end