SQLの窓

2014年11月13日


javamail でメール送信と、付属のバッチビルド用のスクリプトの解説



2014/11/13

Yahoo! のアカウントを使用して、SSL/465 で送信テストしました。44行〜46行は、SSL を使用する場合に必要です。587 を使用する場合は必要ありません(587でも送信できています)。また、javamail は当時(2011-09-29/1.4.4)のものを使用してテストしています

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

環境変数の CLASSPATH に、mail.jar のあるディレクトリを設定して下さい
( コマンドラインのオプションでも指定できます )
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

	// *******************************************
	// エントリポイント
	// *******************************************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// *******************************************
	// コンストラクタ
	// *******************************************
	public Main() {
		super();
		my_acton();
	}

	// *******************************************
	// 初期処理
	// *******************************************
	private void my_acton() {

		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		// *******************************************
		// プロパティオブジェクトを作成
		// プロパティオブジェクトは、
		// extends Hashtable(連想配列)
		// *******************************************
		Properties props = new Properties();
	
		// *******************************************
		// * 連想配列に送信用サーバのアドレスをセット
		// *******************************************
		props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");	// ホスト名またはIPアドレス
//		props.put("mail.smtp.port","587");	// サブミッションポート
		props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.socketFactory.port", "465");

		// *******************************************
		// メール用のセッションを作成
		// *******************************************
		SimpleAuthenticator sa =
			new SimpleAuthenticator("ユーザ","パスワード");
		Session MailSession = 
			Session.getInstance( props, sa );
	
		try {
	
			// *******************************************
			// メール用のメッセージオブジェクトを作成
			// *******************************************
			MimeMessage msg = new MimeMessage(MailSession);
	
			// *******************************************
			// 宛先
			// *******************************************
			msg.setRecipients(
				Message.RecipientType.TO,
				"ユーザ@nifty.com"
			);
	
			// *******************************************
			// 送信者
			// *******************************************
			msg.setFrom(
				new InternetAddress( "ユーザ@yahoo.co.jp" ) 
			);
	
			// *******************************************
			// 件名
			// *******************************************
			msg.setSubject(
				MimeUtility.encodeText(
					"日本語件名",
					"iso-2022-jp",
					"B"
				)
			);
	
			// *******************************************
			// 本文
			// *******************************************
			msg.setContent(
				"本文\n本文",
				"text/plain; charset=\"iso-2022-jp\""
			);
	
			// *******************************************
			// 送信
			// *******************************************
			Transport.send( msg );
	
		}
		catch (Exception e) {
			out.println("送信エラー");
		}

		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 );
		}

	}

	// ***********************************************
	// 認証用のプライベートクラス
	// ***********************************************
	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 );
		}
	}

}

2011-09-29 に記事を作成した時は、パッケージの中にクリップボードへコピーする為の .exe ファイルを同梱していましたが、昨今 Google Chrome のダウンロードで『危険扱い』されるので、.exe を削除し、現状の Windows で同等の clip.exe を使用するようにしました。

JAVA_BUILD.wsf

このスクリプトは、Java のコードをバッチでビルドする為に最適化したものです。実行すると、以下のテキストファイルを参照してビルド環境の整ったコマンドプロンプトを開きます。

__targetPath.txt
カレントディレクトリにする場所です。

ここでは、カレントにある javamail というディレクトリで、そこに Main.java があります
__buildPath.txt
java の sdk のパスです。

ここでは、C:\Program Files\Java\jdk1.7.0_40\bin となっていますが、自分の環境にあわせて変更する必要があります
__classPath.txt
CLASSPATH 環境変数にセットする内容です

ここでは、.;..\mail.jar となっており、カレントと同梱の mail.jar の場所を示しています
<JOB>
<COMMENT>
以下の リソースは、コマンドライン用の環境を設定する為のものです
</COMMENT>
<RESOURCE id="commandList">
<![CDATA[
mode con: cols=120
set PATH=$BIN;%PATH%
set CLASSPATH=$CLASSPATH
prompt java$G
title Java アプリケーションのビルド
]]>
</RESOURCE>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
<OBJECT id="Shell" progid="Shell.Application" />

<SCRIPT language=VBScript>
' ************************************************
' 処理開始( コマンドラインからビルドする為の
' スクリプトです )
' ************************************************

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

' ************************************************
' 任意の引数がある場合は、参照用パスを __targetPath.txt に
' 追加する処理が実行されます
' ************************************************
if Wscript.Arguments.Count <> 0 then
	' ダイアログ表示
	Set objFolder = Shell.BrowseForFolder( 0, "選択する前に __classPath.txt で" & vbCrLf & "必要な CLASSPATH を設定して下さい", 11, 0 )
	' キャンセル
	if objFolder is nothing then
		WScript.Quit
	end if
	if not objFolder.Self.IsFileSystem then
		WScript.Echo "ファイルシステムではありません"
		WScript.Quit
	end if

	' ************************************************
	' 選択したパスが既に一覧にあるかどうかのチェック
	' ************************************************
	SelectPath = objFolder.Self.Path
	Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
	Flg = false
	Do While not objHandle.AtEndOfStream
		sTargetPath = objHandle.ReadLine
		if UCase( sTargetPath ) = Ucase(SelectPath) then
			Flg = true
			Exit Do
		end if
	Loop
	objHandle.Close

	' ************************************************
	' 一覧に無かった場合の追加処理
	' ************************************************
	if Not Flg then
		Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
		AddPath = objHandle.ReadAll
		' ************************************************
		' 現在のパス一覧の先頭に追加
		' ※ 仕様により、このパスがカレントディレクトリ
		'    になります
		' ************************************************
		AddPath = SelectPath & vbCrLf & AddPath
		objHandle.Close
		Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 2, True )
		objHandle.Write AddPath
		objHandle.Close
	end if
end if


' **********************
' ビルド対象
' **********************
Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sTargetPath = objHandle.ReadLine
	if Left( sTargetPath, 1 ) <> ";" and sTargetPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

' **********************
' SDK の場所
' **********************
Set objHandle = Fso.OpenTextFile( obj.Path & "\__buildPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sPath = objHandle.ReadLine
	if Left( sPath, 1 ) <> ";" and sPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

' **********************
' CLASSPATH
' **********************
Set objHandle = Fso.OpenTextFile( obj.Path & "\__classPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sClassPath = objHandle.ReadLine
	if Left( sClassPath, 1 ) <> ";" and sClassPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

' ************************************************
' 先頭にあるリソースの内容を取得します
' ************************************************
aData = Split( GetInline( "commandList" ), vbCrLf )

' ************************************************
' 対象ディレクトリがある場合はそこへ移動して
' コマンドラインで1行目を実行するようにします
' ************************************************
if Trim(sTargetPath) <> "" then
	strCommand = "cmd.exe /k cd """ & sTargetPath & """ & " & aData(0)
else
	strCommand = "cmd.exe /k " & aData(0)
end if

' ************************************************
' 2行目以降の置き換え用文字列を置き換えます
' ************************************************
For I = 1 to Ubound( aData )
	if instr( aData(I), "$BIN" ) > 0 then
		aData(I) = Replace( aData(I), "$BIN", sPath )
	end if
	if instr( aData(I), "$CLASSPATH" ) > 0 then
		aData(I) = Replace( aData(I), "$CLASSPATH", sClassPath )
	end if
	strCommand = strCommand & "&" & aData(I)
Next

' ************************************************
' 準備されたコマンドプロンプトを開きます
' ************************************************
Call WshShell.Run( strCommand, 3 )

' ************************************************
' 関数(全角スペースを含めたトリム)
' ************************************************
Function GetInline( strName )

	GetInline = RegTrim( getResource( strName ) ) & vbCrLf

End Function
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
</SCRIPT>
</JOB>



copy_buildline.wsf

通常実行するビルド用のコマンドラインを、__clipCommand.txt から取り出して、クリップポードにコピーするスクリプトです。JAVA_BUILD.wsf で開いたコマンドブロンプト上で右クリックで貼り付けます

関連する記事

コマンドプロンプトの簡易編集モードのデフォルトを on にする
<JOB>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<SCRIPT language=VBScript>
' ****************************************
' 処理開始( コマンドラインをクリップボードに
' コピーします )
' ****************************************

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

Set objHandle = Fso.OpenTextFile( obj.Path & "\__clipCommand.txt", 1 )
strCommand = ""
Do While not objHandle.AtEndOfStream
	strLine = objHandle.ReadLine
	if Left( strLine, 1 ) <> ";" and strLine <> "" then
		strCommand = strCommand & strLine & vbCrLf
	end if
Loop
objHandle.Close

Set objHandle = Fso.OpenTextFile( obj.Path & "\__clipCommand.tmp", 2, True )
objHandle.Write strCommand
Call WshShell.Run( "cmd.exe /c type """ & obj.Path & "\__clipCommand.tmp"" | clip.exe", 0, True )


</SCRIPT>
</JOB>



java_start.wsf

JAVA_BUILD.wsf と同様にして、テキストファイルより情報を集めて、ビルドが終わったアプリケーションを実行します。

これ専用の __java_start.txt の中に実行用のコマンドを複数行で指定し、コマンドプロンプトでは順次実行させます

ここではこうなっています
java Main
pause
exit
<JOB>
<RESOURCE id="commandList">
<![CDATA[
mode con: cols=120
set PATH=$BIN;%PATH%
set CLASSPATH=$CLASSPATH
prompt java$G
title Java アプリケーションの実行
]]>
</RESOURCE>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<SCRIPT language=VBScript>
' ***********************************************
' 処理開始( 実行する為のスクリプトです )
' ●参照 : __buildPath.txt(SDK の場所)
' ●参照 : __classPath.txt(CLASSPATH)
' ●参照 : __java_start.txt(実行コマンド( 複数行可 ))
' ***********************************************

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

' ビルド対象
Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sTargetPath = objHandle.ReadLine
	if Left( sTargetPath, 1 ) <> ";" and sTargetPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

Set objHandle = Fso.OpenTextFile( obj.Path & "\__buildPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sPath = objHandle.ReadLine
	if Left( sPath, 1 ) <> ";" then
		Exit Do
	end if
Loop
objHandle.Close

Set objHandle = Fso.OpenTextFile( obj.Path & "\__classPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sClassPath = objHandle.ReadLine
	if Left( sClassPath, 1 ) <> ";" and sClassPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

aData = Split( GetInline( "commandList" ), vbCrLf )

if Trim(sTargetPath) <> "" then
	strCommand = "cmd.exe /k cd """ & sTargetPath & """ & " & aData(0)
else
	strCommand = "cmd.exe /k " & aData(0)
end if

For I = 1 to Ubound( aData )
	if instr( aData(I), "$BIN" ) > 0 then
		aData(I) = Replace( aData(I), "$BIN", sPath )
	end if
	if instr( aData(I), "$CLASSPATH" ) > 0 then
		aData(I) = Replace( aData(I), "$CLASSPATH", sClassPath )
	end if
	strCommand = strCommand & "&" & aData(I)
Next
Set objHandle = Fso.OpenTextFile( obj.Path & "\__java_start.txt", 1 )
Do While not objHandle.AtEndOfStream
	strLine = objHandle.ReadLine
	if Left( strLine, 1 ) <> ";" then
		strCommand = strCommand & "&" & strLine
	end if
Loop
objHandle.Close
Call WshShell.Run( strCommand, 3 )

' ***********************************************
' 関数
' ***********************************************
Function GetInline( strName )

	GetInline = RegTrim( getResource( strName ) ) & vbCrLf

End Function
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
</SCRIPT>
</JOB>



タグ:java javamail
posted by lightbox at 2014-11-13 12:27 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり