Javaメールクライアントでメールの閲覧ができないエラー

このQ&Aのポイント
  • Javaメールクライアントでメールの閲覧ができないエラーが発生しています。正しいソースコードを教えてください。
  • Javaメールクライアントのプログラムでメールの閲覧ができずエラーが発生しています。ソースコードの修正方法を教えてください。
  • Javaメールクライアントを使用してメールを閲覧するプログラムを作成していますが、エラーが発生してメールの閲覧ができません。解決策を教えてください。
回答を見る
  • ベストアンサー

javaのメールクライアント

メールの閲覧ができるプログラムを作成していますが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("RETR " +num+"\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

  • Java
  • 回答数6
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

たぶん in を close してないのが問題だと思うので、 while のところを下のようにしたらと思います。 while (in.hasNext()) { String command = in.next(); if (command.equals("q")) { in.close(); break; } else if (command.equals("l")) { to_server.write("LIST\r\n"); to_server.flush(); } else { int number = -1; try { number = new Integer(command); } catch (Exception e) { continue; } to_server.write("RETR " + number + "\r\n"); to_server.flush(); } while (accept.hasNext()) { System.out.println(accept.nextLine()); } }

その他の回答 (5)

回答No.5

もうひとつありました。 入力を確定させるために q を押したあと、 Unix 系では CTRL-D、Windows では CTRL-Z で入力終了を 確定させてみたらと思います。

回答No.4

あともうひとつ、 while (true) { を while (in.hasNext()) { に変えてみてください。

回答No.3

SSL なしに接続できるところがないので、実行はしてませんでした。 冒頭を public class QA8297233No1 { private static Scanner in; public static void main(String[] args) { in = new Scanner(System.in); というように in を static にするとどうですか。

回答No.2

Jave 勉強中です。 朝起きたら、前回の回答が間違っていることに気づいたので。 全角の空白でインデントしてます。削除してから試してみると良いと思います。 import java.io.*; import java.net.*; import java.util.*; public class QA8297233No1 {  public static void main(String[] args) {   Scanner in = new Scanner(System.in);   int port = 110;   System.out.print("server: "); String server = in.next();   System.out.print("user: "); String user = in.next();   Console console;   if ((console = System.console()) == null) { System.exit(1); }   Object password_array = console.readPassword("password: ");   if (password_array == null) { System.exit(1); }   String password = new String((char[] )password_array);   try {    Socket socket = new Socket(server, port);    OutputStreamWriter to_server = new OutputStreamWriter(socket.getOutputStream());    Scanner accept = new Scanner(new InputStreamReader(socket.getInputStream()));    to_server.write("USER " + user + "\r\n"); to_server.flush();    to_server.write("PASS " + password + "\r\n"); to_server.flush();    while (true) {     String command = in.next();     if (command.equals("q")) { break; }     else if (command.equals("l")) {      to_server.write("LIST\r\n"); to_server.flush();     }     else {      int number = -1;      try { number = new Integer(command); }      catch (Exception e) { continue; }      to_server.write("RETR " + number + "\r\n"); to_server.flush();     }     while (accept.hasNext()) { System.out.println(accept.nextLine()); }    }    to_server.write("QUIT\r\n"); to_server.flush();    socket.close();   }   catch (Exception e) { System.err.println(e); System.exit(1); }   System.exit(0);  } }

johosiritai
質問者

補足

無事に起動できたのですがメールを閲覧後、終了かリストのコマンドを打つと反応しなくてしばらくたつとdisconnected for inactivityというエラーが出てしまうのですがこれはプログラムの仕様ですか?

回答No.1

Java 勉強中です。 http://ja.wikipedia.org/wiki/Post_Office_Protocol を見ると POP3 では SSL が必須のように見えます。 SSL ソケットを使ったメールクライアントは、私に作れないので、 質問にあるものを、少し書きなおしてみました。 q で終了、l でリスト、数字でその番号のメールを読むように。 import java.io.*; import java.net.*; import java.util.*; public class QA8297233No1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int port = 110; System.out.print("server: "); String server = in.next(); System.out.print("user: "); String user = in.next(); Console console; if ((console = System.console()) == null) { System.exit(1); } Object password_array = console.readPassword("password: "); if (password_array == null) { System.exit(1); } String password = new String((char[] )password_array); try { Socket socket = new Socket(server, port); OutputStreamWriter to_server = new OutputStreamWriter(socket.getOutputStream()); Scanner accept = new Scanner(new InputStreamReader(socket.getInputStream())); to_server.write("USER " + user + "\r\n"); to_server.flush(); to_server.write("PASS " + password + "\r\n"); to_server.flush(); while (true) { String command = in.next(); if (command.equals("q")) { break; } else if (command.equals("l")) { to_server.write("LIST\r\n"); to_server.flush(); } else { int number = new Integer(command); to_server.write("RETR " + number + "\r\n"); to_server.flush(); while (accept.hasNext()) { System.out.println(accept.next()); } } } to_server.write("QUIT\r\n"); to_server.flush(); socket.close(); } catch (Exception e) { System.err.println(e); System.exit(1); } System.exit(0); } }

関連するQ&A

  • Javaの簡易クライアント

    メールの閲覧ができるプログラムを作成してコンパイルして実行はできるのですが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。プログラムに詳しい方宜しくお願いします。 画像は実行結果です。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("LIST\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("RETR " +num+"\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • java ファイル操作

    現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。

  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • javaでファイル操作し検索するものを作ってます

    目的はテキストファイル内の文字列に検索をかけヒットしたものを表示する というものです import java.io.*; class kensakuTest{ public static void main(String[] args)throws IOException{ System.out.println("検索方法を選択してください。\n0:学籍番号で検索\n1:名前で検索\n2:出身地で検索"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //0が選択された場合 if(res == '0'){ System.out.println("学籍番号を入力してください。"); BufferedReader bn = new BufferedReader(new InputStreamReader(System.in)); String str0 = fn.readLine(); char num = str0.charAt(0); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //1が選択された場合 if(res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); char name = str1.charAt(0); try{ FileReader freader = new FileReader("data.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 //部分一致 while((tmp=breader.readLine())!=null){ if(tmp.indexOf(str1) > -1){ System.out.println("結果は:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2'){ System.out.println("出身地を入力してください。"); BufferedReader bl = new BufferedReader(new InputStreamReader(System.in)); String belong = bl.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } } } 現状はここまでできましたが完全一致の検索のやり方がわかりません。 あと問題点があるのですが 読み取るファイルがこのような場合 2000,田中 太郎,福島県 2001,福島 太郎,東京都 名前で福島 と検索をかけたとします この場合答えが 2000,田中 太郎,福島県 2001,福島 太郎,東京都 と表示されてしまいます このカンマで区切られている学籍番号、名前、出身地をうまく分け それぞれ判別する方法はないのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • javaについて

    以下のようにキーボードから入力していくプログラムを試行しているのですが、エラーが出てくるので行き詰まっています。 理想的にはキーボードに”あいう”エンター”えおか”エンターと打ち込んだら str[0]=あいう str[1]=えおか と表示させていきたいのですが、よろしくお願いします。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu2 { public static void main(String[] args) throws IOException { int i=0; while(i<2){ System.out.println("キーワード入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); char str[] = input.toCharArray(); System.out.println("キーワードは" + str[]); i=i+1; } for(i=0;i<2;i++){ System.out.println(str[]); } } } これがエラー表示です。 gugu2.java:17: '.class' がありません。 System.out.println("キーワードは" + str[]); ^ gugu2.java:21: '.class' がありません。 System.out.println(str[]); ^ エラー 2 個

    • ベストアンサー
    • Java
  • Java int sum = 0は必要ですか?

    やさしいJavaという本を買ったのですが、良くわからない箇所がありました。 --------------省略----------------- class Sample6 { public static void main(String[] args) throws IOException { System.out.println("整数を3つ入力してください。") ; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; String str1 = br.readLine() ; String str2 = br.readLine() ; String str3 = br.readLine() ; int sum = 0 ; sum += Integer.parseInt(str1) ; -------------------略----------------- int sum = 0 ; とありますが、0と設定しておく必要はありますか? 無いとまずいですか? いきなりこのコードが出てきたと思うのですが どこかに書いてましたっけ?

    • ベストアンサー
    • Java
  • プログラムの組み合わせ方

    java初心者です。 2つのプログラムを組み合わせて1つのプログラムにしたいんですが、イマイチ分かりません。 このプログラムと、 import java.io.*; class Hello2 {  public static void main(String[] args) throws IOException {   System.out.println("名前を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   System.out.println(str + "さん、こんにちは!");  } } このプログラムを、 import java.io.*; class Sanbai{  public static void main(String[] args) throws IOException {   System.out.println("好きな数を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   int x;   x = Integer.parseInt(str);   System.out.println("あなたの入力した数:" + x);   System.out.println("その3倍の数:" + (x*3));  } } 組み合わせて1つのプログラムにするにはどうしたらいいですか?(>_<)

    • ベストアンサー
    • Java
  • ネットワークプログラミングでの読み込みについて

    現在ネットワークプログラミングの勉強をしています。 クライアント側の標準入力で文字列入力→Enter押下→ サーバ側の標準出力でその文字列を出力 という処理を行いたいのですが、サーバ側の出力が表示されません。 まず具体的にソースを出した方が状況を説明しやすいので、提示致します。 ------------------------------- サーバ側 public static void main(String[] args)throws Exception ServerSocket ss=new ServerSocket(7777); while(true){ sock=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream())); String str=br.readLine(); if(str.equals("end"))break; System.out.println(str); } sock.close(); ss.close(); br.close(); } ---------------------------------- クライアント側 public static void main(String[] args)throws Exception { Socket sock=new Socket(コンピュータ名,7777); while(true){ BufferedWriter bw=new BufferedWriter(new InputStreamReader(sock.getOutputStream())); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str=br.readLine(); bw.write(str); bw.flush(); if(str.equals("end"))break; } bw.close(); sock.close(); ---------------------------------- 自分で色々試したところバッファリングで入力された文字列を溜めたまま 吐き出していないのが原因のような気がするのですが、BufferedReader#readLineのドキュメントを見ると >1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行とそれに続く改行のどれかで認識されます。 とあるのでクライアント側のbw.write(str)の後にbw.newLine()を呼んだりstr+="\n" などを行ってみたところ、 サーバ側は最初の入力をすぐに出力し、その後のクライアントからの入力には無反応になりました。 このようになる原因と解決が分かる方居ましたら、教えてください。

    • ベストアンサー
    • Java
  • java プログラミングについて

    独学でjavaに挑戦中ですが、書店で購入した本のソースプログラムを少し変えたいのですが、ご教授をお願いします。数当てゲームのプログラムで、一つの設問を正解すると終了するゲームですが、複数の設問を設定したいのです、質問がうまく伝わるか不安ですがよろしくお願いします、プログラムを少しだけ書いておきます。 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは";  /*質問箇所*/ String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力:"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です!"); break; } 

    • ベストアンサー
    • Java
  • java練習

    import java.util.Scanner; class test { public static void main (String[ ] args) throws IOException { System.out.println("文章を入力してください。"); BufferedReader input = new BufferedReader (new InputStreamReader (System.in)); String str = input.readLine( ); if (str == A) { str ="10"; } else if (str == 64) { str ="100"; } else if (str == 3E8) { str ="1000"; } else if (str == FF) { str ="255"; } else if (str == 100) { str ="256"; } System.out.println(" str + "); } } 今プログラミングの練習で文字や数字を判別するプログラムを作っています。 とりあえず16進数を入力したら10進数に変換されるプログラムを書いてたんですけどコンパイルしたらどうしてもエラーが出てきてしまいます。 調べてもよくわかりません、助けてください。

専門家に質問してみよう