SQLの窓

2011年09月30日


javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする

javamail は こちら(Oracle)からダウンロードします

ダウンロードして解凍すると、サンプルが demo ディレクトリにあります。
その中の copier.java に日本語でコメントを入れてもう少し解りやすく
改造したものです。

サンプルは、URLName で接続していましたが、ユーザ間のコピーのほうが
解りやすいので変更しています。
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);

			int m_cnt = folder.getMessageCount();

			if (m_cnt == 0) {
				out.println("メッセージが存在しません");
				folder.close(false);	// true では、メッセージは全て削除
				store.close();
				System.exit(0);
			}

			out.println("メッセージ件数 : " + m_cnt);

			Store store2 = session.getStore("imap");
	
			// 別ユーザに接続
			store2.connect("サーバー", "別のユーザ", "別のユーザのパスワード");

			// 別ユーザのフォルダオブジェクト
			Folder[] folders_2 = store2.getPersonalNamespaces(); 
			Folder dfolder = folders_2[0];
			if (!dfolder.exists()) {
				out.println("出力先フォルダが存在しません");
				folder.close(false);
				store.close();
				System.exit(0);
			}

			// コピーするメッセージの範囲を作成
			// Message[] msgs = folder.getMessages(2, 4); // 範囲指定
			Message[] msgs = folder.getMessages();	// 全てのメッセージ

			// メッセージのコピー
			folder.copyMessages(msgs, dfolder);

			folder.close(false);
			store.close();

		} catch (Exception ex) {
			ex.printStackTrace();
		}

		out.println("処理終了");


	}

	// *****************************************************
	// 内部用クラス
	// *****************************************************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}

}

メッセージの取得には、単一メッセージの取得もあります。


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

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 : 通信関連 | このブログの読者になる | 更新情報をチェックする

2009年09月27日


Java : WEB 上の XML データの内容を取得する

要点

DOM の部分はどの言語でもほとんど同じです。

Java では、Node を継承して Element があり、Element のほうに getElementsByTagName があるという事を知っておれば良いです。
( Node も Element もインターフェイスです )

また、Java だけではありませんが、<要素>〜</要素> の間のテキストは nodeValue では無く、暗黙のテキストノードがあって、そのノードの nodeValue になります
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class Main {

	public static void main(String[] args) {

		try {
			// ターゲット
			URL url = new URL("http://winofsql.jp/exlink.xml");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			// XML 取得の準備
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dbfactory.newDocumentBuilder();
			// InputStream から Documentオブジェクトを取得
			Document doc = builder.parse(http.getInputStream());

			// ここから先は一般的な DOM の処理
			// ルート要素
			Element root = doc.getDocumentElement();
			// System.out.println(root.getNodeName());
			
			// <row> 〜 </row>
			// getElementsByTagName が一番直感的で確実
			NodeList nl1 = root.getElementsByTagName("row");
			// 一つ目のノード
			Node nd1 = nl1.item(0);
			// System.out.println(nd1.getNodeName());
			
			// <fld3>名称</fld3>
			// Node を Element にキャストして getElementsByTagName を使う
			NodeList nl2 = ((Element)nd1).getElementsByTagName("fld3");
			// 最初の row ブロックの fld3 の 列挙
			for( int i = 0; i < nl2.getLength(); i++ ) {

				// <fld3>
				// System.out.println((nl2.item(i)).getNodeName());
				// 要素に挟まれた値は、実際はテキストノードの中にあります
				System.out.println((nl2.item(i)).getFirstChild().getNodeValue());

			}

			// 接続解除
			http.disconnect();
		}
		catch (Exception e) {
		}
	}
}


関連する記事

VBS : XMLファイルのテキストノードの値の更新



タグ:java xml
posted by lightbox at 2009-09-27 00:03 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



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

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