mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* lib/net/imap.rb: split executable code into sample directory.
* sample/net-imap.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47232 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									2fbca47789
								
							
						
					
					
						commit
						ef4c25720a
					
				
					 3 changed files with 172 additions and 170 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,8 @@
 | 
			
		|||
Thu Aug 21 12:40:22 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>
 | 
			
		||||
 | 
			
		||||
	* lib/net/imap.rb: split executable code into sample directory.
 | 
			
		||||
	* sample/net-imap.rb: ditto.
 | 
			
		||||
 | 
			
		||||
Thu Aug 21 12:23:56 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>
 | 
			
		||||
 | 
			
		||||
	* lib/net/imap.rb: removed commented-out code.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										170
									
								
								lib/net/imap.rb
									
										
									
									
									
								
							
							
						
						
									
										170
									
								
								lib/net/imap.rb
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -3576,173 +3576,3 @@ module Net
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if __FILE__ == $0
 | 
			
		||||
  # :enddoc:
 | 
			
		||||
  require "getoptlong"
 | 
			
		||||
 | 
			
		||||
  $stdout.sync = true
 | 
			
		||||
  $port = nil
 | 
			
		||||
  $user = ENV["USER"] || ENV["LOGNAME"]
 | 
			
		||||
  $auth = "login"
 | 
			
		||||
  $ssl = false
 | 
			
		||||
  $starttls = false
 | 
			
		||||
 | 
			
		||||
  def usage
 | 
			
		||||
    <<EOF
 | 
			
		||||
usage: #{$0} [options] <host>
 | 
			
		||||
 | 
			
		||||
  --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 <<EOF
 | 
			
		||||
list [pattern]                  list mailboxes
 | 
			
		||||
select [mailbox]                select mailbox
 | 
			
		||||
close                           close mailbox
 | 
			
		||||
summary                         display summary
 | 
			
		||||
fetch [msgno]                   display message
 | 
			
		||||
logout                          logout
 | 
			
		||||
help, ?                         display help message
 | 
			
		||||
EOF
 | 
			
		||||
        else
 | 
			
		||||
          print "unknown command: ", cmd, "\n"
 | 
			
		||||
        end
 | 
			
		||||
      rescue Net::IMAP::Error
 | 
			
		||||
        puts $!
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  ensure
 | 
			
		||||
    imap.logout
 | 
			
		||||
    imap.disconnect
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										167
									
								
								sample/net-imap.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								sample/net-imap.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,167 @@
 | 
			
		|||
require 'net/imap'
 | 
			
		||||
require "getoptlong"
 | 
			
		||||
 | 
			
		||||
$stdout.sync = true
 | 
			
		||||
$port = nil
 | 
			
		||||
$user = ENV["USER"] || ENV["LOGNAME"]
 | 
			
		||||
$auth = "login"
 | 
			
		||||
$ssl = false
 | 
			
		||||
$starttls = false
 | 
			
		||||
 | 
			
		||||
def usage
 | 
			
		||||
  <<EOF
 | 
			
		||||
usage: #{$0} [options] <host>
 | 
			
		||||
 | 
			
		||||
  --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 <<EOF
 | 
			
		||||
list [pattern]                  list mailboxes
 | 
			
		||||
select [mailbox]                select mailbox
 | 
			
		||||
close                           close mailbox
 | 
			
		||||
summary                         display summary
 | 
			
		||||
fetch [msgno]                   display message
 | 
			
		||||
logout                          logout
 | 
			
		||||
help, ?                         display help message
 | 
			
		||||
EOF
 | 
			
		||||
      else
 | 
			
		||||
        print "unknown command: ", cmd, "\n"
 | 
			
		||||
      end
 | 
			
		||||
    rescue Net::IMAP::Error
 | 
			
		||||
      puts $!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
ensure
 | 
			
		||||
  imap.logout
 | 
			
		||||
  imap.disconnect
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue