SQLの窓

2011年09月30日


javamail 1.4.4 : IMAP のメール受信イベントでメールを受け取ったら処理を行う

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


posted by lightbox at 2011-09-30 14:06 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり