require 'net/imap' require "getoptlong" $stdout.sync = true $port = nil $user = ENV["USER"] || ENV["LOGNAME"] $auth = "login" $ssl = false $starttls = false def usage < --help print this message --port=PORT specifies port --user=USER specifies user --auth=AUTH specifies auth type --starttls use starttls --ssl use ssl EOF end begin require 'io/console' rescue LoadError def _noecho(&block) system("stty", "-echo") begin yield STDIN ensure system("stty", "echo") end end else def _noecho(&block) STDIN.noecho(&block) end end def get_password print "password: " begin return _noecho(&:gets).chomp ensure puts end end def get_command printf("%s@%s> ", $user, $host) if line = gets return line.strip.split(/\s+/) else return nil end end parser = GetoptLong.new parser.set_options(['--debug', GetoptLong::NO_ARGUMENT], ['--help', GetoptLong::NO_ARGUMENT], ['--port', GetoptLong::REQUIRED_ARGUMENT], ['--user', GetoptLong::REQUIRED_ARGUMENT], ['--auth', GetoptLong::REQUIRED_ARGUMENT], ['--starttls', GetoptLong::NO_ARGUMENT], ['--ssl', GetoptLong::NO_ARGUMENT]) begin parser.each_option do |name, arg| case name when "--port" $port = arg when "--user" $user = arg when "--auth" $auth = arg when "--ssl" $ssl = true when "--starttls" $starttls = true when "--debug" Net::IMAP.debug = true when "--help" usage exit end end rescue abort usage end $host = ARGV.shift unless $host abort usage end imap = Net::IMAP.new($host, :port => $port, :ssl => $ssl) begin imap.starttls if $starttls class << password = method(:get_password) alias to_str call end imap.authenticate($auth, $user, password) while true cmd, *args = get_command break unless cmd begin case cmd when "list" for mbox in imap.list("", args[0] || "*") if mbox.attr.include?(Net::IMAP::NOSELECT) prefix = "!" elsif mbox.attr.include?(Net::IMAP::MARKED) prefix = "*" else prefix = " " end print prefix, mbox.name, "\n" end when "select" imap.select(args[0] || "inbox") print "ok\n" when "close" imap.close print "ok\n" when "summary" unless messages = imap.responses["EXISTS"][-1] puts "not selected" next end if messages > 0 for data in imap.fetch(1..-1, ["ENVELOPE"]) print data.seqno, ": ", data.attr["ENVELOPE"].subject, "\n" end else puts "no message" end when "fetch" if args[0] data = imap.fetch(args[0].to_i, ["RFC822.HEADER", "RFC822.TEXT"])[0] puts data.attr["RFC822.HEADER"] puts data.attr["RFC822.TEXT"] else puts "missing argument" end when "logout", "exit", "quit" break when "help", "?" print <