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

2011年09月28日


javamail 1.4.4 + JSP でとにかくメール送信

サンプルソースコードを使ってすぐできる実行環境は、以下で用意できます
( 含む Beans で lightbox.webapp )

Tomcat7 のインストールと、すぐ簡単にJSPアプリケーションテスト( DB アクセス、入力等 )

javamail は こちら(Oracle)からダウンロードします
( JDKは6以降のみで他は何もいりません )

※ 解凍して .jar を TOMCAT の lib にコピーして TOMCATを再起動します

サブミッションポートを使って、SMTP 認証を行うという前提のソースコードです。
テストは、さくらインターネットの環境で行いました。
java_mail.jsp
<!DOCTYPE html>
<html lang="ja">
<%@ page
	language="java"
	import="java.util.*"
	import="javax.mail.*"
	import="javax.mail.internet.*" 
	contentType="text/html;charset=shift_jis" %>
<jsp:useBean id="my" scope="session" class="lightbox.webapp" />

<style type="text/css">
body {
	font-family: "MS ゴシック";
}
</style>
<body>
<h1>javamail 1.4.4</h1>
<%!
// *********************************************************
// 認証用のプライベートクラス
// *********************************************************
private class SimpleAuthenticator extends Authenticator {

	private String user_string = null;
	private String pass_string = null;

	public SimpleAuthenticator( String user_s, String pass_s ) {
		super();
		user_string = user_s;
		pass_string = pass_s;
	}

	protected PasswordAuthentication getPasswordAuthentication(){
		return new PasswordAuthentication( this.user_string, this.pass_string );
	}
}
%>
<%
response.setHeader( "Expires", "Wed, 31 May 2000 14:59:58 GMT" );

// *********************************************************
// lightbox.webapp で入力データを取得
// *********************************************************
my.startApplication( application, "PAGE_01" );
my.Initialize( request );

if ( !my.get( "send" ).equals( "送信" ) ) {
%>

<form method="get">
	宛 先 <input
		type="text"
		name="to"
		value="<%= my.get("to") %>"
		style='width:340px;'
	/><br />

	差出人 <input
		type="text"
		name="from"
		value="<%= my.get("from") %>"
		style='width:340px;'
	/><br />

	題 名 <input
		type="text"
		name="subject"
		value="<%= my.get("subject") %>"
		style='width:340px;'
	/><br />

	<textarea
		name="comment"
		cols="40"
		rows="10"
		style='width:400px;'
	></textarea><br />

	<input
		type="submit"
		name="send"
		value="送信"
	/>
</form>


<%
}
else {
	out.println( "<br /><br />メール送信処理完了..." );
	out.println( "<a href=\"java_mail.jsp\">戻る</a><br />" );

	// *****************************************************
	// プロパティオブジェクトを作成
	// プロパティオブジェクトは、extends Hashtable(連想配列)
	// *****************************************************
	Properties props = new Properties();

	// *****************************************************
	// * 連想配列に送信用サーバのアドレスをセット
	// *****************************************************
	props.put("mail.smtp.host","サーバー");	// ホスト名またはIPアドレス
	props.put("mail.smtp.port","587");	// サブミッションポート
	props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

	// *****************************************************
	// メール用のセッションを作成
	// *****************************************************
	SimpleAuthenticator sa =
		new SimpleAuthenticator("ユーザ","パスワード");
	Session MailSession = 
		Session.getInstance( props, sa );

	try {

		// *****************************************************
		// メール用のメッセージオブジェクトを作成
		// *****************************************************
		MimeMessage msg = new MimeMessage(MailSession);

		// *****************************************************
		// 宛先
		// *****************************************************
		msg.setRecipients(
			Message.RecipientType.TO,
			my.get("to")
		);

		// *****************************************************
		// 送信者
		// *****************************************************
		msg.setFrom(
			new InternetAddress( my.get("from") ) 
		);

		// *****************************************************
		// 件名
		// *****************************************************
		msg.setSubject(
			MimeUtility.encodeText(
				my.get("subject"),
				"iso-2022-jp",
				"B"
			)
		);

		// *****************************************************
		// 本文
		// *****************************************************
		msg.setContent(
			my.get("comment"),
			"text/plain; charset=\"iso-2022-jp\""
		);

		// *****************************************************
		// 送信
		// *****************************************************
		Transport.send( msg );

	}
	catch (Exception e) {
		out.println("送信エラー");
	}

}

// デバッグ表示
out.println( "<br /><br /><hr />" );
out.println( my.getDebug() );
%>

</body>
</html>



posted by lightbox at 2011-09-28 23:04 | java : JSP | このブログの読者になる | 更新情報をチェックする

2011年09月27日


VB.net : Picasa にアクセスする為に、Google Data API にログインしてトークンを取得する

google-gdata - .NET library for the Google Data API

Google_Data_API_Setup_1.9.0.0.msi をダウンロードしてインストールすると、

C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Client.dll
C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Photos.dll

となるはずなので、カレントディレクトリにコピーして、

vbc.exe /r:Google.GData.Client.dll,Google.GData.Photos.dll ソースコード.vb

でビルドして実行します
Imports Google.GData.Client
Imports Google.GData.Photos

Module Module1

	Sub Main()

		Dim picasaService As PicasaService = New PicasaService("PhotoBrowser")

		picasaService.setUserCredentials("メールアドレス", "パスワード")

		Dim authToken As String = Nothing

		Try
			authToken = picasaService.QueryClientLoginToken()
		Catch ex As Exception
			Console.WriteLine( ex.Message )
			Exit Sub
		End Try

		Console.WriteLine( authToken )

	End Sub

End Module

"PhotoBrowser" は付属の C# のサンプルで使われていた文字列です 

以下は、英文でのガイドです

※ 3.Create a new PicasaService instance, setting your application's name
※ (in the form companyName-applicationName-versionID).



posted by lightbox at 2011-09-27 17:17 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2011年09月26日


Tomcat7 のインストールと、すぐ簡単にJSPアプリケーションテスト( DB アクセス、入力等 )

久しぶりに Tomcat へ行ったら、7 になってました。

※ 32-bit/64-bit Windows Service Installer をダウンロードします

( 参考 : Tomcat 6.0.20 のインストール ( 2009/09/22 ) )



当時のささやかなマネージャページのバグも無くなっていましたが、デフォルトでは index ページが表示されないのはそのままです。( ディレクトリリストを表示する( C:\Tomcat5.5\conf\web.xml ) )

6 の時と比べてたいして違いは無いですが、一応画像を取りました。





たいした容量でも無いので全てインストールするのが吉です







ここだけは変更しておいたほうがいいところです。習慣ではありますがスペースを含まないディレクトリ名にして、C:\ の直下に置きます。後から中を見る時には、パスが長くなるのでこうするのがおすすめです。

あと、そのフォルダに対するのアクセス権限が何か特殊になってないかを確認しておく事も、ひょっとして起こるかもしれないトラブルには有効です





Startup Type は Manual にしましょう。Tomcat6.0 と共存できるはずですし、
そのほうが無駄なメモリも使いませんし



そして、すぐアプリケーションテストできるように

以下を利用して下さい。解凍して setup.wsf を実行するとたいていにおいて
使えるようになります( 便利に使うには MKEditor が必要です )




※ Java の SDK はインストールして、bin にはパスが通っているという前提です。

以下は Tomcat6 のインストール時に書いたものですが、今となっては
Java は Oracle になっているし、JDK は 7 が出ていました。

Java SDK のインストール


ただ、このテスト( Tomcat7 ) では、JDK6 を使用しています


関連する記事

Tomcat 5.5.x の インストール


posted by lightbox at 2011-09-26 22:24 | java : JSP | このブログの読者になる | 更新情報をチェックする

2011年09月18日


VB.net : ODBC + MySQL で CSV をインポート( クラス化サンプル )



VB.net : CSVによるインポート用ファイルの作成( つまりエクスポート ) で作成した
CSV をインポートする処理ですが、データベースの処理等をクラス化しています

MyClass.vb
社員マスタ.sql
社員マスタ.csv
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

		' データベースとその他の処理をまとめたクラス
		Dim MyObj As MyLib = New MyLib("localhost","lightbox","root","password")

		' オブジェクトを使って接続処理
		if Not MyObj.CreateConnection() then
			Console.WriteLine("処理が異常終了しました")
			Return
		end if

		'---------------------------------------------------

		' insert 構文固定部分
		Dim InsertQueryBase As String = "insert into `社員マスタ` ("
		' 行毎完成 insert 文 を格納する変数
		Dim InsertQuery As String = Nothing

		' SHIFT_JIS で入力する為のテキストファイルの準備
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		Dim ReadFile As StreamReader = New StreamReader( MyLib.CsvPath, SJIS_Enc )

		' SHIFT_JIS で読み込む準備
		Dim LineText As String = Nothing
		' ループカウンタ用
		Dim idx As Integer = 0

		' Peek() は、StreamReader オブジェクトの現在位置は変わりません
		' それ以上読み取り可能な文字がない場合、戻り値は -1 です。
		Do While ReadFile.Peek() >= 0

			' 一行を読み込む
			LineText = ReadFile.ReadLine()

			if idx = 0 then
				LineText = LineText.Replace("""","`")
				InsertQueryBase = InsertQueryBase + LineText + ")"
				idx += 1
				Continue Do
			end if

			InsertQuery = InsertQueryBase + " values("
			LineText = LineText.Replace("""""","NULL")
			LineText = LineText.Replace("""","'")
			InsertQuery = InsertQuery + LineText + ")"

'			Console.WriteLine( InsertQuery )
			MyObj.Execute(InsertQuery)

			' 読み込みカウンタアップ
			idx += 1
		Loop

		' リソースの後片づけ
		ReadFile.Close()
		ReadFile.Dispose()

		'---------------------------------------------------

		MyObj.EndConnection()

	End Sub

End Module



posted by lightbox at 2011-09-18 23:16 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする
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 終わり