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 する事はまず無いと思いますが、サンプルでは古い環境でも
動くようにと付加されていたのだと思います。