From: Wakou Aoyama Date: 1999-05-05T03:08:37+09:00 Subject: [ruby-list:14132] Re: pop3 via firewall 青山です。 Tue, May 04, 1999 at 11:20:42PM +0900 において kikutani@sprintmail.com さん曰く: > この新telnet.rbを使って、以下のものを書き直したいんですが、 > どうもやりかたがわかりません。 あ、いえ、もっと単純、簡単なんですよ。こんな感じです。 # ファイアウォール対応部分 (原案:わたなべさん) def fw_pop3(host, port = 110) ENV['TELNET_GATEWAY'] or raise "please setenv TELNET_GATEWAY." fw = Telnet.new('Host'=>ENV['TELNET_GATEWAY']) fw.waitfor(/>\Z/){|c| print c } fw.print "telnet #{host} #{port}" fw end class Pop3 def initialize (host, port = 110, timeout = 20) if host.kind_of?(Hash) # Pop3.new のオプションを適当に処理し、そのまま Telnet.new に引き渡す host['Port'] ||= port host['Timeout'] ||= timeout @host = Telnet.new(host) else @host = Telet.new({'Host' => host, 'Port' => port, 'Timeout' => timeout}) end @mails = [] end end # 通常のアクセス host = Pop3.new('foo.bar.co.jp') # ファイアウォール経由の場合 host = Pop3.new({'Proxy' => fw_pop3('foo.bar.co.jp')}) telnet で外部にアクセスできるマシンを TELNET_GATEWAY にセットしておい て、こんな感じで fw_telnet, fw_pop3 等を用意しておけば、環境変数で一斉 にすべてを切替えられるわけです。 host = Pop3.new(fw_pop3('foo.bar.co.jp')) こんなインターフェイスもいいかもしれませんね。こんな感じになるでしょうか。 class Pop3 def initialize (host, port = 110, timeout = 20) case host when Hash # Pop3.new のオプションを適当に解釈後、そのまま Telnet.new に引き渡す host['Port'] ||= port host['Timeout'] ||= timeout @host = Telnet.new(host) when Telnet @host = Telnet.new({'Proxy' => host, 'Port' => port, 'Timeout' => timeout}) else @host = Telet.new({'Host' => host, 'Port' => port, 'Timeout' => timeout}) end @mails = [] end end fw_pop3 を Pop3 クラスに含め、Pop3.new({'Proxy' => 'foo.bar.co.jp'}) という手も無くは無いですが、ファイアウォールの種類に依存するコードを含 める事になるので、標準ライブラリにする場合は避けた方が良いとは思います。 > あと、コメントになってる STDOUT.reopen(open("/dev/null", "w")) は、 > telnet.rb でSTDOUTに書き出されるメッセージを抑制したいんですが > これやると何も返ってこなくなっちゃいます。 あ、STDOUT への出力は無くなりました。逆に、接続時のメッセージが必要な 場合は Telnet.new(){|c| print c } のようにして下さい。 -- 青山 和光 Wakou Aoyama