javamail は こちら(Oracle)からダウンロードします ダウンロードして解凍すると、サンプルが demo ディレクトリにあります。 その中の monitor.java に日本語でコメントを入れてもう少し解りやすく 改造したものです
import java.util.*; import java.io.*; import javax.mail.*; import javax.mail.event.*; import javax.activation.*; import com.sun.mail.imap.*; public class Main { private MyTool out = new MyTool(">>>"); // ***************************************************** // エントリポイント // ***************************************************** public static void main(String[] args) { Main thisClass = new Main(); } // ***************************************************** // コンストラクタ // ***************************************************** public Main() { super(); my_acton(); } // ***************************************************** // 初期処理 // ***************************************************** private void my_acton() { out.println("処理開始"); try { Properties props = System.getProperties(); // セッションオブジェクトの取得 Session session = Session.getInstance(props, null); // session.setDebug(true); // Store オブジェクトの取得 Store store = session.getStore("imap"); // 接続 store.connect("サーバー", "ユーザー", "パスワード"); // 現在のユーザのフォルダオブジェクトを取得 Folder[] folders = store.getPersonalNamespaces(); for (int index = 0; index < folders.length; index++) { // さくらインターネットでは、INBOX 一つ out.println(folders[index].getFullName()); } // フォルダの存在チェック Folder folder = folders[0]; // INBOX if (folder == null || !folder.exists()) { out.println("Invalid folder"); System.exit(1); } // URL の内容を表示 out.println( folder.getURLName().toString() ); // フォルダを開く folder.open(Folder.READ_WRITE); // 新しいメールを受信すると呼び出されるイベントの登録 folder.addMessageCountListener(new MessageCountAdapter() { public void messagesAdded(MessageCountEvent ev) { Message[] msgs = ev.getMessages(); out.println(msgs.length + "件の新しいメッセージを取得しました"); // メーセージ内容の表示 for (int i = 0; i < msgs.length; i++) { try { out.println("-----"); out.println("Message " + msgs[i].getMessageNumber() + ":"); // メッセージをコンソールに書き込み msgs[i].writeTo(System.out); } catch (IOException ioex) { ioex.printStackTrace(); } catch (MessagingException mex) { mex.printStackTrace(); } } } }); // メッセージ待ち処理 int freq = 5000; // idle できない場合の、スリープ間隔(ミリ秒) boolean supportsIdle = false; try { if (folder instanceof IMAPFolder) { IMAPFolder f = (IMAPFolder)folder; out.println("IDLE を開始します"); f.idle(); supportsIdle = true; } } catch (FolderClosedException fex) { throw fex; } catch (MessagingException mex) { supportsIdle = false; } // IDLE がサポートされていない場合の処理と、それと同時に // メッセージを受け取って、IDLE が一旦終了された時の為の継続ループ処理 while (true) { if (supportsIdle && folder instanceof IMAPFolder) { out.println("IDLE 中です"); IMAPFolder f = (IMAPFolder)folder; f.idle(); } else { out.println("sleep します"); Thread.sleep(freq); // イベントを起動する為にこちらから呼び出し処理 folder.getMessageCount(); } } } catch (Exception ex) { ex.printStackTrace(); } } // ***************************************************** // 内部用クラス // ***************************************************** private class MyTool { private String mark = null; MyTool(String pm) { mark = pm; } public void println(String str) { System.out.println( this.mark + str ); } } }
idle メソッドによって、メーッセージ受信待ちになるので、終了する時は CTRL+C で終了します。 Thread.sleep する事はまず無いと思いますが、サンプルでは古い環境でも 動くようにと付加されていたのだと思います。
|
【java : 通信関連の最新記事】
- Java : WEB上のテキストファイルを取得する
- Java11 + Visual Studio Code + JavaMail( with JavaBeans Activation Framework )
- Javamail で IMAP 受信
- OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う
- java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )
- Eclipse + JFace : HttpURLConnection で GET
- javamail でメール送信と、付属のバッチビルド用のスクリプトの解説
- Java : バッチでテストする Twiiter API の『検索処理』
- google-gson(Java) を使って、JSON を 定義済みクラスのオブジェクトに一括変換する
- Java : RSS(Document) から、item の中の先頭の指定した要素の値を取得するクラス
- google-gson で、JSON 文字列の構成要素の一覧を取り出す処理
- java : Apache commons-net-3.0.1 を使ってごく自然に FTPS(セキュア) でファイルのアップロード/ダウンロード
- javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする
- Java : WEB 上の XML データの内容を取得する