POP3とはPost Office Protocol version 3の事で、メールサーバとメッセージを受信するクライアントとの間の通信規約のことです。POP3はRFC1939で規定されています。数々あるRFCのプロトコルの規定の中では短いほうですし、電子メールの受信という身近な機能に関するものですので、ソフトウェア英語の勉強のつもりで読み始めるには良い例ではないかと思います。もっともJavaMailを使う限りはPOP3の中身を知る必要はあまりありません。便利っちゃぁ便利ですね。
さて、メッセージを読むにはまずメッセージが保存されているStoreオブジェクトを取得する必要があります。StoreオブジェクトはSessionオブジェクトを使って、
Store store = session.getStore("pop3");
の様にプロトコルを指定して取得します。storeにはそれぞれのプロトコルに応じたStoreのサブクラスが返されてきています。この場合だとcom.sun.mail.pop3.POP3Store
のインスタンスが返されています。
Storeオブジェクトが取得できたら、connectメソッドを呼び出して接続を行います。
store.connect(hostname, user, password);
ここでhostnameは接続先サーバ名、userはアカウント名、passwordはそのパスワードです。これらの値はSessionオブジェクトに属性を設定しておくなり、Authenticatorを設定しておくなりすることで省略することができます(そのためのconnectメソッドも用意されています)。
Storeオブジェクトに対しては、イベントリスナを設定してイベントを処理することができます。Storeオブジェクトで発生するイベントは、
Storeオブジェクトには一般に複数のFolderオブジェクトがツリー状に存在しています。個々のメッセージはこのFolderオブジェクト内にあります。POP3を使っている場合は"INBOX"という名前のFolderだけが有効ですが、IMAPをサポートしているサーバの場合はツリー状のFolderを使う事ができます。
FolderオブジェクトはStoreにconnectしている状態で、Storeオブジェクトから取得してきます。
Folder folder = store.getFolder("INBOX");
folderにも実際には各プロトコルに応じたFolderのサブクラスが返されています。
Folderオブジェクトが取得できたら、中のメッセージにアクセスするためにFolderオブジェクトをopenします。単に読み出す場合はFolder.READ_ONLYを指定し、読み出した後サーバから削除したり、マークをつけたりするといった書き込みを伴う場合にはFolder.READ_WRITEを指定します。
foler.open(Folder.READ_ONLY);
Folderオブジェクトもイベントを発生させます。
Folder内ではメッセージは1から始まる追番が振られています。Folderがopenされていれば、この番号を指定してメッセージを取得する事ができます。
int num = folder.getMessageCount();
for (int seq = 1; seq <= num; seq++) {
Message message = folder.getMessage(seq);
実際にはこの時点ではメッセージの実体はまだ手元にはなく、管理情報のみが取得できています。従ってSubjectだけ読み出すといった事がしたい場合は、
Message[] messages = folder.getMessages();
fp.add("Subject");
folder.fetch(messages, fp);
for (int seq = 1; seq <= num; seq++) {
String subject = messages[seq].getSubject();
の様にfetchメソッドを使用することができます。