/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*	モジュール名		：JBSbatCCSendMail
*	ソースファイル名	：JBSbatCCSendMail.java
*	作成者				：FJ　
*	作成日				：2011年06月23日
*＜機能概要＞
*　メール送信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/23  FJ
*	v1.00.01	2011/07/24	FJ			メール送信情報組み立て時のチェック内容を追加
*   v5.00.00    2013/12/20   FJ         メール送信情報ログ出力追加
*   v12.00.00	2015/02/26	FJ)阪口		【OM-2015-0000238】メール送信時発生例外のマイナー化
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
// OM-2015-0000238 ADD START
import javax.mail.MessagingException;
// OM-2015-0000238 ADD END
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatCCIFM002001;
import eo.business.util.table.JBSbatCC_M_MAIL;
import eo.business.util.table.JBSbatCC_M_MAIL_DTL;
import eo.business.util.table.JBSbatCC_T_DTL_TEXT_HTKB;
import eo.business.util.table.JBSbatCC_T_MAIL_SEND;
import eo.business.util.table.JBSbatCC_T_MLAD;
import eo.business.util.table.JBSbatCC_T_TEMP_FILE;
import eo.business.util.table.JBSbatCC_T_TEXT_HTKB;
// OM-2015-0000238 ADD START
import eo.common.constant.JPCBatchMessageConstant;
// OM-2015-0000238 ADD END
import eo.common.util.JCCFileUtil;
import eo.common.util.JCCSendMailUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
// OM-2015-0000238 DEL START
//import eo.framework.util.JBSbatBusinessFileUtil;
// OM-2015-0000238 DEL END
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.application.JBSbatBusinessBase;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.application.JCCbatFrameworkException;

/**
* バッチによるメール送信を実行するクラスです。 <p>
*<BR>
* @author FJ
*/
public class JBSbatCCSendMail extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** テーブル(メール送信)*/
	private static final String D_TBL_NAME_CC_T_MAIL_SEND = "CC_T_MAIL_SEND";
	// /** テーブル(メール)*/  外部結合のため使用しない
	// private static final String D_TBL_NAME_CC_M_MAIL = "CC_M_MAIL";
	/** テーブル(メール明細) */
	private static final String D_TBL_NAME_CC_M_MAIL_DTL = "CC_M_MAIL_DTL";
	/** テーブル(メール_メール明細)*/
	private static final String D_TBL_NAME_CC_M_MAIL_MAIL_DTL = "CC_M_MAIL_MAIL_DTL";
	/** テーブル(本文非定型部) */
	private static final String D_TBL_NAME_CC_T_TEXT_HTKB = "CC_T_TEXT_HTKB";
	/** テーブル(明細本文非定型部) */
	private static final String D_TBL_NAME_CC_T_DTL_TEXT_HTKB = "CC_T_DTL_TEXT_HTKB";
	/** テーブル(メールアドレス) */
	private static final String D_TBL_NAME_CC_T_MLAD = "CC_T_MLAD";
	/** テーブル(添付ファイル) */
	private static final String D_TBL_NAME_CC_T_TEMP_FILE = "CC_T_TEMP_FILE";
	/** テーブルアクセスクラス(メール送信)*/
	private JBSbatSQLAccess db_CC_T_MAIL_SEND = null;
	// メールテーブルはメール送信テーブルに外部結合
	///** テーブルアクセスクラス(メール)*/
	// private JBSbatSQLAccess db_CC_M_MAIL = null;
	/** テーブルアクセスクラス(メール_メール明細)*/
	private JBSbatSQLAccess db_CC_M_MAIL_MAIL_DTL = null;
	/** テーブルアクセスクラス(メール明細) */
	private JBSbatSQLAccess db_CC_M_MAIL_DTL = null;
	/** テーブルアクセスクラス(本文非定型部) */
	private JBSbatSQLAccess db_CC_T_TEXT_HTKB = null;
	/** テーブルアクセスクラス(明細本文非定型部) */
	private JBSbatSQLAccess db_CC_T_DTL_TEXT_HTKB = null;
	/** テーブルアクセスクラス(メールアドレス) */
	private JBSbatSQLAccess db_CC_T_MLAD = null;
	/** テーブルアクセスクラス(添付ファイル)*/
	private JBSbatSQLAccess db_CC_T_TEMP_FILE = null;

	/** SQL定義キー(CC_SELECT_004)*/
	private static final String CC_T_MAIL_SEND_CC_SELECT_004 = "CC_SELECT_004";
	/** SQL定義キー(CC_SELECT_001)*/
	private static final String CC_M_MAIL_MAIL_DTL_CC_SELECT_001 = "CC_SELECT_001";
	/** SQL定義キー(CC_SELECT_001)*/
	private static final String CC_M_MAIL_DTL_CC_SELECT_001 = "CC_SELECT_001";
	/** SQL定義キー(CC_SELECT_002)*/
	private static final String CC_T_TEXT_HTKB_CC_SELECT_002 = "CC_SELECT_002";
	/** SQL定義キー(CC_SELECT_003)*/
	private static final String CC_T_DTL_TEXT_HTKB_CC_SELECT_003 = "CC_SELECT_003";
	/** SQL定義キー(CC_SELECT_002)*/
	private static final String CC_T_MLAD_CC_SELECT_002 = "CC_SELECT_002";
	/** SQL定義キー(CC_SELECT_003)*/
	private static final String CC_T_TEMP_FILE_CC_SELECT_003 = "CC_SELECT_003";

	//---------------------------------------------
	// メール送信インターバル制御
	//---------------------------------------------
	/** 送信件数カウンタ */
	private long sendCnt = 0;
	/** 送信スタート時刻 */
	private long sendStartTime = 0;
	/** 日付フォーマット */
	private static SimpleDateFormat formatDateTimeStamp  = new SimpleDateFormat("yyyyMMddHHmmssSSS");
	
	//---------------------------------------------
	// システム日付(固定)
	//---------------------------------------------
	/** システム日付(送信処理開始日付YYYYMMDD-一度取得したら固定) */
	private String sysDate = null;
	/** システム日付タイムスタンプ(送信処理開始日付YYYYMMDDhhmmssSSS-一度取得したら固定) */
	private String sysTimestamp = null;

	//---------------------------------------------
	// アプリケーションプロパティ設定キー
	//---------------------------------------------
	/** アプリケーションプロパティ:最大送信件数の単位時間(単位:秒) */
	private static final String KEY_MAILSEND_MAX_UNIT  = "MAILSEND_MAX_UNIT";
	/** アプリケーションプロパティ:メールサーバ接続エラー時のリトライ回数 */
	private static final String KEY_SENDMAIL_RETRY  = "SENDMAIL_RETRY";
	/** アプリケーションプロパティ:メールサーバ接続エラー時のリトライ間隔 */
	private static final String KEY_SENDMAIL_RETRY_INTERVAL  = "SENDMAIL_RETRYINTERVAL";
	/** アプリケーションプロパティ:単一プロセス単一時間に送信可能なメール数 */
	private static final String KEY_MAILSEND_MAX	  = "MAILSEND_MAX";
	/** アプリケーションプロパティ:メール送信エラー上限値 */
	private static final String KEY_MAILSEND_ERROR_MAX  = "MAILSEND_ERROR_MAX";
	/** SMTP識別コード取得キー(DBテーブル項目より取得するキーであり、ファイルには存在しないが処理簡素化のため追記) */
	private static final String KEY_SMTP_SKBT_CD = "SMTP_SKBT_CD";

	//---------------------------------------------
	// メール送信パラメータ情報マップ専用格納キー
	//---------------------------------------------
	/** メール送信情報マップ格納キー:SMTPサーバ */
	private static final String KEY_SMTP_HOST = "SMTP_HOST";
	/** メール送信情報マップ格納キー:SMTPサーバ ポート番号 */
	private static final String KEY_SMTP_PORT = "SMTP_PORT";
	/** メール送信情報マップ格納キー:メール送信文字コード */
	private static final String KEY_ENCODING = "MAIL_MOJI_CD";

	//---------------------------------------------
	// 汎用パラメータ情報格納マップ専用格納キー
	//---------------------------------------------
	// /** メール送信番号格納キー */   未送信メール情報の定義を利用
	// private static final String KEY_MAIL_SEND_NO = "MAIL_SEND_NO";
	/** 送信結果格納キー */
	private static final String KEY_SENDMAIL_RESULT = "SENDMAIL_RESULT";
	/** プロセス停止ファイルパス格納キー */
	private static final String KEY_PATH_STOPFILE = "PATH_STOPFILE";
	
	//---------------------------------------------
	// 定義値
	//---------------------------------------------
	/** メール送信ステータス:送信済み */
	private static final String  SEND_STATUS_COMPLETE = "002";
	/** メール送信ステータス:送信エラー */
	private static final String  SEND_STATUS_ERROR = "003";
	/** メール送信ステータス:送信停止 */
	private static final String  SEND_STATUS_STOP = "004";
	/** メール送信文字コードデフォルト */
	private static final String ENCODING_DEFAULT = "ISO-2022-JP";

	//---------------------------------------------
	// マップ定義
	//---------------------------------------------
	/** メール送信関連テーブル情報格納マップ */
	private HashMap<String, Object> dbInfo = new HashMap<String, Object>();
	/** メール送信パラメータ情報格納マップ */
	private HashMap<String, Object> sendMailInfo = new HashMap<String, Object>();
	/** 汎用パラメータ情報格納マップ */
	private HashMap<String, Object> paramInfo = new HashMap<String, Object>();
	/** アプリケーションプロパティファイル情報格納マップ */
	private HashMap<String, String> acInfo = new HashMap<String, String>();
	
	//---------------------------------------------
	// メール送信強制停止判定用フラグ 2011/11/17
	//---------------------------------------------
	private boolean mailSendForceStopFlg = false;

	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		db_CC_T_MAIL_SEND = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_MAIL_SEND);
		// メールテーブルはメール送信テーブルに外部結合
		// db_CC_M_MAIL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL);
		db_CC_M_MAIL_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL_DTL);
		db_CC_M_MAIL_MAIL_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL_MAIL_DTL);
		db_CC_T_TEXT_HTKB  = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_TEXT_HTKB);
		db_CC_T_DTL_TEXT_HTKB  = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_DTL_TEXT_HTKB);
		db_CC_T_MLAD  = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_MLAD);
		db_CC_T_TEMP_FILE  = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_TEMP_FILE);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		try
		{
			boolean result = false;
			// 2011/11/17 異常メールを送信対象から外す対応 start
			// 強制停止フラグの初期化
			this.mailSendForceStopFlg = false;
			// 2011/11/17 異常メールを送信対象から外す対応 end
			//---------------------------------------------------
			// 各種マップ初期化
			//---------------------------------------------------
			// メール送信関連テーブル情報格納マップ
			dbInfo.clear();
			// メール送信パラメータ情報格納マップ */
			sendMailInfo.clear();
			// 汎用パラメータ情報格納マップ */
			paramInfo.clear();
			// AplConstファイル情報格納マップは1度のみ読み込みのため初期化しない。
			// acInfo.clear();
			

			//---------------------------------------------------
			// 入力パラメータよりメール送信番号取得
			//---------------------------------------------------
			String mailSendNo = inMap.getString(JBSbatCCIFM002001.MAIL_SEND_NO);
			paramInfo.put(JBSbatCCIFM002001.MAIL_SEND_NO, mailSendNo);
			
			//---------------------------------------------------
			// システム日付取得
			//---------------------------------------------------
			// 現在時刻の取得（プロセス終了まで更新しない）
			if (isEmpty(sysTimestamp))
			{
				sysTimestamp = JCCBatCommon.getSysDateTimeStamp();
				sysDate = sysTimestamp.substring(0, 8);
			}
			
			//---------------------------------------------------
			// アプリケーションプロパティファイル情報取得
			//---------------------------------------------------
			getAplConstMailInfo(acInfo);

			//---------------------------------------------------
			// メール送信インターバル制御
			//---------------------------------------------------
			// メールサーバー接続エラーによるプロセス停止ファイル
			// 存在チェック
			checkAndSetStopFileInfo(paramInfo, acInfo);
			
			// メール送信インターバル制御
			intervalSendMail(acInfo);

			//---------------------------------------------------
			// 未送信メール情報抽出(From DB)
			//---------------------------------------------------
			if(!querySendMail(paramInfo, acInfo, dbInfo))
			{
				return null;
			}
			
			//---------------------------------------------------
			// 未送信メールの組み立て
			//---------------------------------------------------
			// DB取得結果でアプリケーションプロパティよりSMTP情報取得
			getAplConstMailInfoFromDb(dbInfo, acInfo);

			// 未送信メールの組み立て
			makeSendMail(paramInfo, acInfo, dbInfo, sendMailInfo);
			
			//---------------------------------------------------
			// メール送信
			//---------------------------------------------------
			result = sendMail(paramInfo, acInfo, dbInfo, sendMailInfo);
			paramInfo.put(KEY_SENDMAIL_RESULT, new Boolean(result));

			//---------------------------------------------------
			// メール送信ステータス更新
			//---------------------------------------------------
			updateSendMail(paramInfo, acInfo, dbInfo, sendMailInfo);
			
			
		}
		catch(Exception e){
			// 例外発生時、アプリケーションプロパティの情報をすべて読み取れているか不明なため、
			// 初期化する。
			acInfo.clear();
			//継続可能な業務エラーの場合は、終了処理呼び出しを行わない
			if(e instanceof JBSbatBusinessError)
			{
				throw e;
			}
			else
			{
				//処理中断時は終了処理を呼び出す
				callTerminal(e);
			}
		}
		finally
		{
			// 2011/11/17 異常メールを送信対象から外す対応 start
			// メールフォーマットの異常等でメール送信不可の場合は該当送信番号のメールは強制停止
			if(this.mailSendForceStopFlg == true)
			{
				
				// メール送信番号取得
				String mailSendNo = (String)paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO);
				
				// メール送信番号を保持していない場合は更新不可
				if(isEmpty(mailSendNo) == false)
				{
					//設定値をMapにつめる
					JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
					JBSbatCommonDBInterface valueMap = new JBSbatCommonDBInterface();
					whereMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_NO, mailSendNo);
					valueMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_STAT, SEND_STATUS_STOP);
					
					// システム日付タイムスタンプ取得
					String timeStamp = JCCBatCommon.getSysDateTimeStamp();
					valueMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_STP_DTM, timeStamp);
					
					// メール送信停止状態に更新する
					db_CC_T_MAIL_SEND.updateByPrimaryKeys(whereMap, valueMap);
					
					// デバッグログ表示
					super.logPrint.printDebugLog("メール送信番号["+mailSendNo+"]のメール送信を停止しました。");
					
				}
			}
			// 2011/11/17 異常メールを送信対象から外す対応 end
			
			if (sendMailInfo.containsKey("TEMP_FILE_PATH"))
			{
				// 電子ファイル削除
				String[] filePathList = (String[])sendMailInfo.get("TEMP_FILE_PATH");
				String dir  = null;
				for( int ii = 0; ii < filePathList.length; ii++)
				{
					dir = new File(filePathList[ii]).getParent();
					JCCFileUtil.removeDir(dir);
				}
			}
			
			// 2011/11/17 メール送信途中でのエラーで再送防止のため毎回コミット start
			super.commit();
			// 2011/11/17 メール送信途中でのエラーで再送防止のため毎回コミット end
		}
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		//シェル終了判定用の標準出力
		System.out.println("0");
		
		db_CC_T_MAIL_SEND.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		//db_CC_M_MAIL.close();
		db_CC_M_MAIL_DTL.close();
		db_CC_M_MAIL_MAIL_DTL.close();
		db_CC_T_TEXT_HTKB.close();
		db_CC_T_DTL_TEXT_HTKB.close();
		db_CC_T_MLAD.close();
		db_CC_T_TEMP_FILE.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 文字列がnullか判定する
	 * <br>
	 * @param arg0 判定する文字列
	 * @return 文字列がNullか空文字のときtrue
	 */
	private static boolean isEmpty(String arg0) 
	{
		if (arg0 == null || "".equals(arg0)) 
		{
			return true;
		}
		return false;
	}

	//---------------------------------------------------------------------------------------------------------------------
	//
	// メール送信タイミング実行制御処理郡
	//
	//---------------------------------------------------------------------------------------------------------------------

	/**
	 * プロセス停止ファイル存在チェックとパスの取得をします。
	 * メール送信でサーバー接続エラー時に生成されるプロセス停止ファイルの存在チェックを行います。
	 * プロセス停止ファイルが存在する場合、汎用パラメータ情報格納マップへ格納します。
	 * <br>
	 * @param paramInfo 汎用パラメータ情報格納マップ
	 * @param acInfo メール送信タイミング実行制御情報を格納したマップ
	 * @throws Exception
	 */
	private void checkAndSetStopFileInfo(HashMap<String, Object> paramInfo, HashMap<String, String> acInfo) throws Exception
	{
		// 中間ファイル出力パス
		String midPath = acInfo.get(JBSbatCCSearchSendMail.MID_DIR_CC);
		// 未送信メール情報ファイルのプロセス停止ファイル
		String stopFilePath = midPath + File.separator + JBSbatCCSearchSendMail.FILE_NAME + ".stop";
		paramInfo.put(KEY_PATH_STOPFILE, stopFilePath);
		// 停止ファイル存在チェック
		File stopFile = new File(stopFilePath);
		// ファイルが存在したら処理を終了
		if(stopFile.isFile())
		{
			throw new JCCbatFrameworkException("メールサーバ接続エラーのため、プロセスを停止しました。メール送信番号:[" + paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO) + "]");
		}
	}


	/**
	 * メール送信実行のインターバル制御を行います。
	 * メール送信実行時刻と現在時刻の時間差が60000ミリ秒経過していない場合、その間に送信したメール件数が最大送信件数に到達していた場合に、
	 * メール送信実行タイミングを調整します。
	 * <br>
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @throws Exception
	 */
	private void intervalSendMail(HashMap<String, String> acInfo) throws Exception
	{
		
		// メール送信最大件数 ← APLConst設定値
		long mailSendMax = new Long((String)acInfo.get(KEY_MAILSEND_MAX)).longValue();
				
		// 最大送信件数の単位時間(単位:秒)
		long mailSendMaxUnit = new Long((String)acInfo.get(KEY_MAILSEND_MAX_UNIT)).longValue()*1000;
		
		// 現在時刻
		Date date = formatDateTimeStamp.parse(JCCBatCommon.getSysDateTimeStamp());
		long nowTime = date.getTime();

		// 送信スタート時刻を現在時刻で初期化
		if (sendStartTime == 0)
		{
			sendStartTime = nowTime;
		}

		//送信処理件数カウントアップ
		sendCnt++;
		
		super.logPrint.printDebugLog("送信件数 =" + String.valueOf(sendCnt));

		// 現在時刻と送信スタート時刻の指定秒数以内に最大送信件数を超えたら指定秒数が経過するまでまつ
		// 差分時間が1分経過してなければ
		if (nowTime - sendStartTime <= mailSendMaxUnit)
		{
			// 送信件数がMAXを超えてなければ送信処理、MAXこえている場合
			if (sendCnt > mailSendMax)
			{
				//指定した時間が経過するまで10msずつスリープ
				super.logPrint.printDebugLog("IntervalWaitStart");
				while ((nowTime - sendStartTime) <= mailSendMaxUnit)
				{
					Thread.sleep(10);
					date = formatDateTimeStamp.parse(JCCBatCommon.getSysDateTimeStamp());
					nowTime = date.getTime();
				}
				super.logPrint.printDebugLog("IntervalWaitEnd");
				//カウンタと処理開始時間を初期化
				//sendCnt = 1;
				sendCnt = 0;
				date = formatDateTimeStamp.parse(JCCBatCommon.getSysDateTimeStamp());
				nowTime = date.getTime();
				sendStartTime = nowTime;
			}
		}
		else
		{
			//処理時間を１秒越えてたらカウンタと処理開始時間を初期化
			//sendCnt = 1;
			sendCnt = 0;
			sendStartTime = nowTime;
		}
	}

	//---------------------------------------------------------------------------------------------------------------------
	//
	// アプリケーションプロパティファイル関連処理郡
	//
	//---------------------------------------------------------------------------------------------------------------------
	
	/**
	 * アプリケーションプロパティファイル情報取得処理です。
	 * メール送信処理に必要な情報を取得します。
	 * <br>
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @throws JCCbatFrameworkException
	 */
	private void getAplConstMailInfo(HashMap<String, String> acInfo) throws JCCbatFrameworkException
	{
		//--------------------------------------------
		//  読み込みチェック
		//--------------------------------------------
		if(acInfo.size() > 0)
		{
			// 読み込み済みの場合、再度読み込みはしない。
			return;
		}

		//--------------------------------------------
		//  メールサーバ接続エラー時のリトライ回数
		//--------------------------------------------
		String sendMailRetry = JCCBatCommon.getApplicationConst(KEY_SENDMAIL_RETRY);
		if (isEmpty(sendMailRetry))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの「SENDMAIL_RETRY」：メールサーバ接続エラー時のリトライ回数は未設定です。");
		}
		
		if(!JCCBatCommon.isHannkakuSuuji1(sendMailRetry) || 1 > Integer.parseInt(sendMailRetry)){
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの「SENDMAIL_RETRY」：メールサーバ接続エラー時のリトライ回数の設定値が不正です。");
		}

		//--------------------------------------------
		//  メールサーバ接続エラー時のリトライ間隔
		//--------------------------------------------
		String sendMailRetryInterval = JCCBatCommon.getApplicationConst(KEY_SENDMAIL_RETRY_INTERVAL);
		if (isEmpty(sendMailRetryInterval))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの「SENDMAIL_RETRY_INTERVAL」：メールサーバ接続エラー時のリトライ間隔は未設定です。");
		}
		
		if(!JCCBatCommon.isHannkakuSuuji1(sendMailRetryInterval) || 1 > Integer.parseInt(sendMailRetryInterval)){
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの「SENDMAIL_RETRY_INTERVAL」：メールサーバ接続エラー時のリトライ間隔の設定値が不正です。");
		}

		//--------------------------------------------
		//  単一プロセス単一時間に送信可能なメール数
		//--------------------------------------------
		String mailSendMax = JCCBatCommon.getApplicationConst(KEY_MAILSEND_MAX);
		if (isEmpty(mailSendMax))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの単一プロセス単一時間に送信可能なメール数[MAILSEND_MAX]は未設定です。");
		}
		
		if(!JCCBatCommon.isHannkakuSuuji1(mailSendMax) || 1 > Long.parseLong(mailSendMax)){
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの単一プロセス単一時間に送信可能なメール数[MAILSEND_MAX]の設定値が不正です。");
		}

		//--------------------------------------------
		// メール送信エラー上限値取得
		//--------------------------------------------
		String mailSendErrMax = JCCBatCommon.getApplicationConst(KEY_MAILSEND_ERROR_MAX);
		if (isEmpty(mailSendErrMax))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルのメール送信エラー上限値[MAILSEND_ERROR_MAX]は未設定です。");
		}
		
		if(!JCCBatCommon.isHannkakuSuuji1(mailSendErrMax) || 0 > Long.parseLong(mailSendErrMax)){
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルのメール送信エラー上限値[MAILSEND_ERROR_MAX]の設定値が不正です。");
		}

		//--------------------------------------------
		// 中間ファイル出力パスの取得
		//--------------------------------------------
		String midPath = JCCBatCommon.getApplicationConst(JBSbatCCSearchSendMail.MID_DIR_CC);
		if(isEmpty(midPath))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルに中間ファイル出力パス「MID_DIR_CC」が設定されていません。");
		}

		//--------------------------------------------
		// 最大送信件数の単位時間(単位:秒)の取得
		//--------------------------------------------
		String mailSendMaxUnit = JCCBatCommon.getApplicationConst(KEY_MAILSEND_MAX_UNIT);
		if (isEmpty(mailSendMaxUnit))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの最大送信件数の単位時間(単位:秒)[MAILSEND_MAX_UNIT]は未設定です。");
		}
		
		if(!JCCBatCommon.isHannkakuSuuji1(mailSendMaxUnit) || 1 > Long.parseLong(mailSendMaxUnit))
		{
			throw new JCCbatFrameworkException("バッチアプリケーションプロパティファイルの最大送信件数の単位時間(単位:秒)[MAILSEND_MAX_UNIT]は設定値が不正です。");
		}

		//--------------------------------------------
		// アプリケーションプロパティ情報格納マップ設定
		//--------------------------------------------
		// メールサーバ接続エラー時のリトライ回数
		acInfo.put(KEY_SENDMAIL_RETRY, sendMailRetry);
		// メールサーバ接続エラー時のリトライ間隔
		acInfo.put(KEY_SENDMAIL_RETRY_INTERVAL, sendMailRetryInterval);
		// 単一プロセス単一時間に送信可能なメール数
		acInfo.put(KEY_MAILSEND_MAX, mailSendMax);
		// メール送信エラー上限値
		acInfo.put(KEY_MAILSEND_ERROR_MAX, mailSendErrMax);
		// 中間ファイル出力パス
		acInfo.put(JBSbatCCSearchSendMail.MID_DIR_CC, midPath);
		// 最大送信件数の単位時間(単位:秒)
		acInfo.put(KEY_MAILSEND_MAX_UNIT, mailSendMaxUnit);
		
	}

	/**
	 * アプリケーションプロパティファイル情報取得処理です。
	 * テーブル情報より取得したキーでメール送信処理に必要な情報を取得します。
	 * <br>
	 * @param dbInfo テーブル情報格納マップ
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @throws Exception
	 */
	private void getAplConstMailInfoFromDb(HashMap<String, Object> dbInfo, HashMap<String, String> acInfo) throws Exception
	{
		JBSbatCommonDBInterface rsMailSendMap = null;
		String smtpSkbtCd = null;
		String smtpSkbtKey = null;

		//--------------------------------------------
		// SMTP識別コードチェック;
		//--------------------------------------------
		// SMTP識別コードキーチェック
		rsMailSendMap = ((JBSbatCommonDBInterface)dbInfo.get(D_TBL_NAME_CC_T_MAIL_SEND));
		smtpSkbtKey = rsMailSendMap.getString(JBSbatCC_M_MAIL.SMTP_SKBT_CD);

		// アプリケーションプロパティ情報格納マップにSMTP識別情報のキーが存在するかチェック。
		if(acInfo.containsKey(smtpSkbtKey))
		{
			
			// キーが存在する場合、カレントSMTP識別コードとしてSMTP識別情報を"SMTP_SKBT_CD"キーでマップに設定する
			smtpSkbtCd = acInfo.get(smtpSkbtKey);
			acInfo.put(KEY_SMTP_SKBT_CD, smtpSkbtCd);
			return;
		}
		
		// アプリケーションプロパティ情報格納マップに存在しない場合、ファイルチェック。
		// SMTP識別コードチェック
		smtpSkbtCd = JCCBatCommon.getApplicationConst(smtpSkbtKey);
		if(isEmpty(smtpSkbtCd))
		{
			throw new JCCbatFrameworkException("アプリケーションプロパティファイルにSMTP識別コードに基づいた情報が存在しません。SMTP識別コード[" + smtpSkbtKey + "]");
		}
		// SMTP識別コード形式チェック
		if(smtpSkbtCd.indexOf(";") == -1)
		{
			throw new JCCbatFrameworkException("アプリケーションプロパティファイルのSMTP識別情報の書式に誤りがあります。SMTP識別コード[" + smtpSkbtKey + "]");
		}
		// アプリケーションプロパティ情報格納マップにSMTP識別情報を設定
		// カレントのSMTP識別コードにファイルより取得した値を設定
		acInfo.put(KEY_SMTP_SKBT_CD, smtpSkbtCd);
		// DBより取得したSMTP識別コードをキーに紐づくファイルより取得した値を設定
		acInfo.put(smtpSkbtKey, smtpSkbtCd);

	}
	//---------------------------------------------------------------------------------------------------------------------
	//
	// DBアクセス関連処理郡
	//
	//---------------------------------------------------------------------------------------------------------------------
	
	/**
	 * DBアクセスによる情報取得処理です。
	 * メール送信処理に必要な情報を取得します。
	 * <br>
	 * @param paramInfo 汎用パラメータ情報格納マップ
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @param dbInfo テーブル情報格納マップ
	 * @return 処理結果 OK(送信対象あり):true NG(送信対象なし):false
	 * @throws Exception
	 */
	private boolean querySendMail(HashMap<String, Object> paramInfo, HashMap<String, String> acInfo, HashMap<String, Object> dbInfo) throws Exception
	{
		//一時格納用変数を定義
		JBSbatCommonDBInterface rsMailSendMap = null;
		String mailCd = null;
		String cc0121MailCd = null;
		String smtpSkbtCd = null;

		// パラメータ設定
		Object[] param1 = new Object[2];
//		Object[] param2 = new Object[2];
		Object[] param3 = new Object[1];

		// テーブルへのパラメータは以下の3パターン
		// パラメータ1   配列[0] メール送信番号, 配列[1] システム日付
		param1[0] = paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO);
		param1[1] = sysDate;
//		// パラメータ2   配列[0] メールコード(DB取得後に設定する), 配列[1] システム日付
//		param2[0] = "";
//		param2[1] = sysDate;
		// パラメータ3   配列[0] メール送信番号
		param3[0] = paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO);

		//------------------------------------
		// メール送信テーブル情報一意検索
		//------------------------------------
		executeCC_T_MAIL_SEND_CC_SELECT_004(param1);

		// メール送信/メールマスタデータはデータ取得のためselectを実行、
		rsMailSendMap = db_CC_T_MAIL_SEND.selectNext();
		if (null == rsMailSendMap)
		{
			// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 start
			// メール送信対象が取得できない場合、終了
			//super.logPrint.printDebugLog("メール送信番号に紐づくメールコードから有効なレコードを取得できませんでした。メール送信番号:[" + param1[0]  + "]");
			//return false;
			throw new JCCbatFrameworkException("指定のメール送信番号から有効なレコードが取得できませんでした。メール送信番号:[" + param1[0]  + "]");
			// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 end
		}
		// 1レコードなのでマップ保持する。
		dbInfo.put(D_TBL_NAME_CC_T_MAIL_SEND, rsMailSendMap);
		
		mailCd = rsMailSendMap.getString(JBSbatCC_T_MAIL_SEND.MAIL_CD);
//		param2[0] = mailCd;
		cc0121MailCd = rsMailSendMap.getString("CC0121_" + JBSbatCC_M_MAIL.MAIL_CD);
		smtpSkbtCd = rsMailSendMap.getString(JBSbatCC_M_MAIL.SMTP_SKBT_CD);

		if (null != db_CC_T_MAIL_SEND.selectNext())
		{
			throw new JCCbatFrameworkException("メール送信テーブルの情報は一意ではありません。メール送信番号:[" + param1[0]  + "] システム日付:[" + param1[1] + "]");
		}	
		
		// メール送信に外部結合しているメールマスタのメールコードチェック
		cc0121MailCd = rsMailSendMap.getString("CC0121_" + JBSbatCC_M_MAIL.MAIL_CD);
		if (isEmpty(cc0121MailCd))
		{
			throw new JCCbatFrameworkException("メールマスタの情報が取得できませんでした。メール送信番号:[" + param1[0]  + "] システム日付:[" + param1[1] + "]");
		}

		// SMTP識別コードチェック
		if (isEmpty(smtpSkbtCd))
		{
			throw new JCCbatFrameworkException("メールマスタのSMTP識別コードが取得できませんでした。メールコード:[" + mailCd  + "]");
		}

		//---------------------------------------
		// メールアドレステーブル情報一覧検索
		//---------------------------------------
		executeCC_T_MLAD_SELECT_002(param3);

		//---------------------------------------
		// 本文非定型部テーブル情報一覧検索
		//---------------------------------------
		executeCC_T_TEXT_HTKB_CC_SELECT_002(param3);

		//---------------------------------------
		// メール明細テーブル情報一覧検索処理
		//---------------------------------------
		//executeCC_T_MAIL_DTL_CC_SELECT_001(param2);
		executeCC_T_MAIL_DTL_CC_SELECT_001(param1);

		//---------------------------------------
		// 明細本文非定型部テーブル情報一覧検索
		//---------------------------------------
		executeCC_T_DTL_TEXT_HTKB_CC_SELECT_003(param3);

		//---------------------------------------
		// 添付ファイル情報一覧検索処理
		//---------------------------------------
		executeCC_T_TEMP_FILE_CC_SELECT_003(param3);
		
		return true;
	}

	/**
	 * メール送信テーブル情報一意検索処理です。<br>
	 * SQLKEY(CC_SELECT_004)でDBアクセスを行います。<br>
	 * メール送信テーブルより、指定したメール送信番号に紐づく情報を抽出します。<br>
	 * このときメールテーブルを外部結合して取得します。<br>
	 * @param param バイント変数の値配列。param[0]:メール送信番号,param[1]:システム日付
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_MAIL_SEND_CC_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// メール送信.メール送信番号 ← 未送信メール情報ファイル.メール送信番号
		paramList.setValue(param[0].toString());
		// メール.予約適用年月日 ← システム日付
		paramList.setValue(param[1].toString());
		// メール.メール適用開始年月日 ← システム日付
		paramList.setValue(param[1].toString());
		// メール.メール適用終了年月日 ← システム日付
		paramList.setValue(param[1].toString());
		// メール送信.メール送信番号 ← 未送信メール情報ファイル.メール送信番号
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_T_MAIL_SEND.selectBySqlDefine(paramList, CC_T_MAIL_SEND_CC_SELECT_004);
	}
	
	/**
	 * メール_メール明細テーブル情報取得処理です。<br>
	 * SQLKEY(CC_SELECT_002)でDBアクセスを行います。<br>
	 * メール_メール明細テーブルより指定したメールコードとメール明細コードに紐づく情報を取得します。<br>
	 * @param param バイント変数の値配列。
	 * 					param[0]:メールコード
	 * 					param[1]:メール明細コード
	 * 					param[2]:システム日付
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_M_MAIL_MAIL_DTL_CC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// メール_メール明細.メールコード ← メール.メールコード
		paramList.setValue(param[0].toString());
		// メール_メール明細.メールコード ← メール.メール明細コード
		paramList.setValue(param[1].toString());
		// メール_メール明細.メール適用開始年月日 ← システム日付
		paramList.setValue(param[2].toString());
		// メール_メール明細.メール適用終了年月日 ← システム日付
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_CC_M_MAIL_MAIL_DTL.selectBySqlDefine(paramList, CC_M_MAIL_MAIL_DTL_CC_SELECT_001);
	}
	

	/**
	 * メール明細テーブル情報一覧検索処理です。<br>
	 * SQLKEY(CC_SELECT_001)でDBアクセスを行います。<br>
	 * メール明細テーブルより指定メールコードに紐づくメール明細情報を取得します。<br>
	 * @param param バイント変数の値配列。param[0]:メールコード,param[1]:システム日付
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_MAIL_DTL_CC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// v1.00.01 エラー要因を分離するため、明細コード取得時にはメール_メール明細はSQL文から除外
		// メール_メール明細.メールコード ← メール.メールコード
		//paramList.setValue(param[0].toString());
		// メール_メール明細.メール適用開始年月日 ← システム日付
		//paramList.setValue(param[1].toString());
		// メール_メール明細.メール適用終了年月日 ← システム日付
		//paramList.setValue(param[1].toString());
		
		// メール送信番号
		paramList.setValue(param[0].toString());
		// メール明細.予約適用年月日 ← システム日付
		paramList.setValue(param[1].toString());
		// メール明細.メール適用開始年月日 ← システム日付
		paramList.setValue(param[1].toString());
		// メール明細.メール適用終了年月日 ← システム日付
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CC_M_MAIL_DTL.selectBySqlDefine(paramList, CC_M_MAIL_DTL_CC_SELECT_001);
	}

	/**
	 * 本文非定型部テーブル情報一覧検索処理です。<br>
	 * SQLKEY(CC_SELECT_002)でDBアクセスを行います。<br>
	 * 指定したメール送信番号に紐づく本文非定型部テーブルの情報を抽出します。<br>
	 * 結果は本文非定型部連番でソートします。<br>
	 * @param param バイント変数の値配列。param[0]:メール送信番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_TEXT_HTKB_CC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// 本文非定型部.メール送信番号 ← 未送信メール情報ファイル.メール送信番号
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_T_TEXT_HTKB.selectBySqlDefine(paramList, CC_T_TEXT_HTKB_CC_SELECT_002);
	}

	/**
	 * 明細本文非定型部テーブル情報一覧検索処理です。<br>
	 * SQLKEY(CC_SELECT_003)でDBアクセスを行います。<br>
	 * 指定したメール送信番号に紐づく明細本文非定型部テーブルの情報を抽出します。<br>
	 * 結果はメール明細コード、明細本文非定型部連番でソートします。<br>
	 * @param param バイント変数の値配列。param[0]:メール送信番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_DTL_TEXT_HTKB_CC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// 明細本文非定型部.メール送信番号 ← 未送信メール情報ファイル.メール送信番号
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_T_DTL_TEXT_HTKB.selectBySqlDefine(paramList, CC_T_DTL_TEXT_HTKB_CC_SELECT_003);
	}

	/**
	 * メールアドレステーブル情報一覧検索処理です。<br>
	 * SQLKEY(CC_SELECT_002)でDBアクセスを行います。<br>
	 * 指定したメール送信番号に紐づくメールアドレステーブルの情報を抽出します。
	 * @param param バイント変数の値配列。param[0]:メール送信番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_MLAD_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// メールアドレス.メール送信番号 ← 未送信メール情報ファイル.メール送信番号
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_T_MLAD.selectBySqlDefine(paramList, CC_T_MLAD_CC_SELECT_002);
	}

	
	/**
	 * 添付ファイル情報一覧検索処理です。<br>
	 * SQLKEY(CC_SELECT_003)でDBアクセスを行います。<br>
	 * 添付ファイルテーブルより、指定したメール送信番号に紐づく添付ファイル情報を抽出します。
	 * @param param バイント変数の値配列。param[0]:メール送信番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_T_TEMP_FILE_CC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// 添付ファイル.メール送信番号 ← 未送信メール情報ファイル.メール送信番号
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_T_TEMP_FILE.selectBySqlDefine(paramList, CC_T_TEMP_FILE_CC_SELECT_003);
	}

	//---------------------------------------------------------------------------------------------------------------------
	//
	// メール組み立て処理郡
	//
	//---------------------------------------------------------------------------------------------------------------------
	
	/**
	 * DBアクセスによる情報取得処理です。
	 * メール送信処理に必要な情報を取得します。
	 * <br>
	 * @param paramInfo 汎用パラメータ情報格納マップ
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @param dbInfo テーブル情報格納マップ
	 * @param sendMailInfo メール送信パラメータ情報格納マップ
	 * @throws Exception
	 */
	private void makeSendMail(HashMap<String, Object> paramInfo, HashMap<String, String> acInfo, HashMap<String, Object> dbInfo, HashMap<String, Object> sendMailInfo) throws Exception
	{
		String mailCd = null;
		String mailHeaderIf = null;
		String mailTitle = null;
		String mailText = null;
		String sendmMlad = null;
		String sendmMladDspNm = null;
		String hnsinMlad = null;
		String hnsinMladDspNm = null;
		String errMlad = null;
//		int recCntMailMailDtl = 0;

		// メール本文組立て用領域
		StringBuffer sbMailText = new StringBuffer("");
		StringBuffer sbMailTextMaster = new StringBuffer("");
		//------------------------------------
		// メール送信テーブル検索一意結果取得
		//------------------------------------
	    {
			String smtpSkbtCd = null;
			//一時格納用変数を定義
			JBSbatCommonDBInterface rsMailSendMap = null;
			rsMailSendMap = (JBSbatCommonDBInterface)dbInfo.get(D_TBL_NAME_CC_T_MAIL_SEND);
			// メール送信テーブル情報
			mailCd = rsMailSendMap.getString(JBSbatCC_T_MAIL_SEND.MAIL_CD);
			mailHeaderIf = rsMailSendMap.getString(JBSbatCC_T_MAIL_SEND.MAIL_HEADER_IF);
			// 外部結合:メールマスタ情報
			mailTitle = rsMailSendMap.getString(JBSbatCC_M_MAIL.MAIL_TITLE);
			// メールタイトルの設定
			if(isEmpty(mailTitle))
			{
				mailTitle = "";
			}
			mailText = rsMailSendMap.getString(JBSbatCC_M_MAIL.MAIL_TEXT);
			if(isEmpty(mailText))
			{
				mailText = "";
			}
			// 送信元メールアドレスの設定
			sendmMlad = rsMailSendMap.getString(JBSbatCC_M_MAIL.SENDM_MLAD);
			sendmMladDspNm = rsMailSendMap.getString(JBSbatCC_M_MAIL.SENDM_MLAD_DSP_NM);
			
			// 返信先メールアドレスの設定
			hnsinMlad = rsMailSendMap.getString(JBSbatCC_M_MAIL.HNSIN_MLAD);
			hnsinMladDspNm = rsMailSendMap.getString(JBSbatCC_M_MAIL.HNSIN_MLAD_DSP_NM);
			
			// エラーメールアドレスの設定
			errMlad = rsMailSendMap.getString(JBSbatCC_M_MAIL.ERR_MLAD);
			
			//SMTP識別コードの設定
			smtpSkbtCd = rsMailSendMap.getString(JBSbatCC_M_MAIL.SMTP_SKBT_CD);

			// メールマスタ:メールコード取得
			sendMailInfo.put(JBSbatCC_T_MAIL_SEND.MAIL_CD, mailCd);

			// SMTP識別情報取得:マスタテーブルよりSMTP識別コードを取得して、その値をキーにして設定値をアプリケーションプロパティーより取得したもの
			String smtpSkbtInfo = acInfo.put(KEY_SMTP_SKBT_CD, smtpSkbtCd);
			
			//--------------------------------------------
			// メール送信情報 → MAP セット
			//--------------------------------------------
			String mojiCd = null;
			// smtpInfo [0]:ホスト名 必須、[1]:ポート番号 必須、[2]:文字コード 任意
			String[] smtpInfo = smtpSkbtInfo.split(";");
			// 文字コードが設定されていれば使用する。
			mojiCd = (2 < smtpInfo.length) ? smtpInfo[2]:ENCODING_DEFAULT;
			sendMailInfo.put(KEY_SMTP_HOST, smtpInfo[0]);
			sendMailInfo.put(KEY_SMTP_PORT, smtpInfo[1]);
			sendMailInfo.put(KEY_ENCODING, mojiCd);
		}

		//送信先氏名格納用領域
		HashMap<String, Object> mladNm = new HashMap<String, Object>();
		HashMap<String, String> mladFromNm = new HashMap<String, String>();
		HashMap<String, String> mladToNm = new HashMap<String, String>();
		HashMap<String, String> mladCcNm = new HashMap<String, String>();
		HashMap<String, String> mladBccNm = new HashMap<String, String>();
		HashMap<String, String> mladReplyNm = new HashMap<String, String>();

		
		//------------------------------------
		// メールアドレステーブル検索一覧取得
		//------------------------------------
		{
			//一時格納用変数を定義
			JBSbatCommonDBInterface rsMladMap = null;
	
			// 送信先メールアドレス情報設定領域
			ArrayList<String> adrToList = new ArrayList<String>();
			ArrayList<String> adrCcList = new ArrayList<String>();
			ArrayList<String> adrBccList = new ArrayList<String>();

			String mlad = null;
			String mladDspNm = null;
			String mladSetFieldCd = null;
	
			while((rsMladMap = db_CC_T_MLAD.selectNext()) != null)
			{
				mlad = rsMladMap.getString(JBSbatCC_T_MLAD.MLAD);
				mladDspNm = rsMladMap.getString(JBSbatCC_T_MLAD.MLAD_DSP_NM);
				mladSetFieldCd = rsMladMap.getString(JBSbatCC_T_MLAD.MLAD_SET_FIELD_CD);
				// 01:Toの場合
				if("01".equals(mladSetFieldCd))
				{
					adrToList.add(mlad);
					mladToNm.put(mlad, mladDspNm);
				}
				// v1.00.01 任意の送信元FROMが指定されている場合はそちらを優先して設定
				// 02:Fromの場合
				else if("02".equals(mladSetFieldCd))
				{
					sendmMlad = mlad;
					if(null == mladDspNm)
					{
						sendmMladDspNm = "";
					}
					else
					{
						sendmMladDspNm = mladDspNm;
					}
				}
				// 03:Ccの場合
				else if("03".equals(mladSetFieldCd))
				{
					adrCcList.add(mlad);
					mladCcNm.put(mlad, mladDspNm);
				}
				// 04:Bccの場合
				else if("04".equals(mladSetFieldCd))
				{
					adrBccList.add(mlad);
					mladBccNm.put(mlad, mladDspNm);
				}
			}

			// メール送信情報格納マップ 
			sendMailInfo.put("MLAD_FROM", sendmMlad);
			mladFromNm.put(sendmMlad, sendmMladDspNm);
			
			sendMailInfo.put("MLAD_TO", (String[])adrToList.toArray(new String[0]));
			sendMailInfo.put("MLAD_CC", (String[])adrCcList.toArray(new String[0]));
			sendMailInfo.put("MLAD_BCC", (String[])adrBccList.toArray(new String[0]));
			
			mladNm.put("MLAD_FROM_NM", mladFromNm);
			mladNm.put("MLAD_TO_NM", mladToNm);
			mladNm.put("MLAD_CC_NM", mladCcNm);
			mladNm.put("MLAD_BCC_NM", mladBccNm);
			
			// 返信先メールアドレス名及び表示名の設定
			mladReplyNm.put(hnsinMlad, hnsinMladDspNm);
			sendMailInfo.put("MLAD_REPLY_TO", hnsinMlad);
			mladNm.put("MLAD_REPLY_NM", mladReplyNm);
			
			// エラーメール送信先の設定
			sendMailInfo.put("MLAD_RETURN_PATH", errMlad);
			
			// 表示名のHashMapを設定
			sendMailInfo.put("MLAD_NM", mladNm);
			sendMailInfo.put("MAIL_TITLE", mailTitle);
			
			// その他のヘッダー情報を設定
			HashMap<String, String> mailHeaderIfMap = JCCBatCommon.getMailHeader(mailHeaderIf);
			sendMailInfo.put("MAIL_HEADER_IF", mailHeaderIfMap);
		}
		
		//------------------------------------
		// 本文非定型部テーブル検索一覧取得
		//------------------------------------
		{
			//一時格納用変数を定義
			JBSbatCommonDBInterface rsTextHtkbMap = null;
			String textHtkCkanMoji = null;
			boolean existTextHtkb = false;
			
			// v1.00.01 本文非定型部の数をカウントアップする領域
			int htkbCntr = 0;
			
			// v1.00.01 メール本文内の"%"の数を格納しておく領域
			int srcCkanCntr = getStrCnt(mailText, "%");
			
			// 本文中の"%"を本文非定型部置換文字列に置き換えながら連結
			while((rsTextHtkbMap = db_CC_T_TEXT_HTKB.selectNext()) != null)
			{
				// v1.00.01 本文非定型部の数をカウントアップ
				htkbCntr++;
				
				existTextHtkb = true;
				textHtkCkanMoji = rsTextHtkbMap.getString(JBSbatCC_T_TEXT_HTKB.TEXT_HTK_CKAN_MOJI);
				if(mailText.indexOf("%") == -1)
				{
					sbMailText.append(mailText);
					break;
				}
				else
				{
					// "%"部分までを登録用本文にセット
					sbMailText.append(mailText.substring(0, mailText.indexOf("%")));
					// 非定型置換文字列を連結
					// 2011/11/17 指定値がnullの場合は空文字に置換する start
					if(null == textHtkCkanMoji)
					{
						textHtkCkanMoji = "";
					}
					// 2011/11/17 指定値がnullの場合は空文字に置換する end
					sbMailText.append(textHtkCkanMoji);
					// 登録した部分までをトリミング
					mailText = mailText.substring(mailText.indexOf("%") + 1);
					//"%"が無くなった場合は残り全てを連結してループ抜け
					if(mailText.indexOf("%") == -1)
					{
						sbMailText.append(mailText);
					}
				}
			}
			// 本文非定型部データが空の場合
			if (!existTextHtkb)
			{
				sbMailText.append(mailText);
			}
			
			// v1.00.01 メール本文中の"%"の数と置換文字の数が一致しない場合は例外をスロー
			if (htkbCntr != srcCkanCntr)
			{
				// 2011/11/17 異常メールを送信対象から外す対応 start
				this.mailSendForceStopFlg = true;
				// 2011/11/17 異常メールを送信対象から外す対応 end
				
				throw new JCCbatFrameworkException("メール本文中の置換文字数_本文非定型置換文字数不一致エラー。"
													// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 start
													+ "メールコード:[" + mailCd  + "] "
													// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 end
													+ "メール本文中の置換文字の数:[" + String.valueOf(srcCkanCntr)  + "] "
													+ "本文非定型部の数:[" + String.valueOf(htkbCntr) + "]");
			}
		}
		
		//------------------------------------
		// 明細部分作成
		//------------------------------------
		{
			HashMap<String, Object> mailDtlTextMap = new HashMap<String, Object>();

			//------------------------------------
			// メール明細本文マップ登録
			//------------------------------------
			{
				//一時格納用変数を定義
				JBSbatCommonDBInterface rsMailDtlMap = null;
				String mailDtlCd = null;
				String mailDtlText = null;
				
				// v1.00.01 メール本文内の"$"の数を格納しておく領域とカウントする領域
				int srcDtlCkanCntr = getStrCnt(sbMailText.toString(), "$");
				int dtlhtkbCntr = 0;
				String tmpDtlCd = "";
				
				while((rsMailDtlMap = db_CC_M_MAIL_DTL.selectNext()) != null)
				{
					// メール明細テーブル 
					mailDtlCd = rsMailDtlMap.getString(JBSbatCC_M_MAIL_DTL.MAIL_DTL_CD);
					mailDtlText = rsMailDtlMap.getString(JBSbatCC_M_MAIL_DTL.MAIL_DTL_TEXT);
					
// 2012/08/13 FST)arata Fortify対応 start
					// メール明細本文マップにメール明細コードをキーにメール明細本文を登録する。
					if(!tmpDtlCd.equals(mailDtlCd))
// 2012/08/13 FST)arata Fortify対応 end
					{
						mailDtlTextMap.put(mailDtlCd, mailDtlText);
						dtlhtkbCntr++;
						
						// v1.00.01 メールコードとメール明細コードの紐づけをチェック
						Object[] param = new Object[3];
						param[0] = mailCd;
						param[1] = mailDtlCd;
						param[2] = sysDate;
						executeCC_M_MAIL_MAIL_DTL_CC_SELECT_001(param);
						if(null == db_CC_M_MAIL_MAIL_DTL.selectNext())
						{
							// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 start
							//throw new JCCbatFrameworkException("メール_メール明細テーブルにメールコードとメール明細コードを紐づけるレコードが存在しません");
							throw new JCCbatFrameworkException("メール_メール明細テーブルにメールコードとメール明細コードを紐づけるレコードが存在しません。"
									+ "メールコード:[" + mailCd  + "] "
									+ "メール明細コード:[" + mailDtlCd  + "]");
						}
						tmpDtlCd = mailDtlCd;
					}
				}
				// v1.00.01 メール本文中の"$"の数と明細本文の数が一致しない場合は例外をスロー
				if (dtlhtkbCntr != srcDtlCkanCntr)
				{
					// 2011/11/17 異常メールを送信対象から外す対応 start
					this.mailSendForceStopFlg = true;
					// 2011/11/17 異常メールを送信対象から外す対応 end
					
					throw new JCCbatFrameworkException("メール本文中の明細置換文字数_メール明細コード数不一致エラー。"
															// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 start
															+ "メールコード:[" + mailCd  + "] "
															// 2013/02/14 FST_mukuo)ログ出力メッセージ見直し対応 end
															+ "メール本文中の明細置換文字の数:[" + String.valueOf(srcDtlCkanCntr) + "] "
															+ "メール明細コードの数:[" + String.valueOf(dtlhtkbCntr) + "]");
				}
			}
			
			//------------------------------------
			// 明細本文非定型文を明細本文に埋め込み
			//------------------------------------
			{
				//一時格納用変数を定義
				JBSbatCommonDBInterface rsDtlTextHtkbMap = null;
				String tempMailDtlCd = "";
				String mailDtlText = "";
				String tmpBpdyText = sbMailText.toString();
				String mailDtlCd = null;
				String dtlTextHtkCkanMoji = null;
				boolean existDtlTextHtkb = false;
				// メール明細コードが指定されている場合は更に置換
				StringBuffer sbMailDtlTextMaster = new StringBuffer();
				
				// v1.00.01 メール明細本文内の"%"の数を格納しておく領域とカウントする領域
				int srcDtlDtlCkanCntr = 0;
				int dtlDtlhtkbCntr = 0;
				
				while((rsDtlTextHtkbMap = db_CC_T_DTL_TEXT_HTKB.selectNext()) != null)
				{
					existDtlTextHtkb = true;
					//------------------------------------
					// 明細本文非定型文 + 明細本文取得
					//------------------------------------
					// メール明細コードを取得
					mailDtlCd = rsDtlTextHtkbMap.getString(JBSbatCC_T_DTL_TEXT_HTKB.MAIL_DTL_CD);
					
					// 取得したメール明細コードが変わった場合は、次の明細本文を取得
					if(!tempMailDtlCd.equals(mailDtlCd))
					{
						// メール明細コードに紐付いたメール明細本文をメール明細本文マップより取得
						if(!mailDtlTextMap.containsKey(mailDtlCd))
						{
							throw new JCCbatFrameworkException("メール明細マスタから有効なレコードを取得できませんでした。メール明細コード:[" + mailDtlCd + "]");
						}
						//メール明細コードをキーに設定したメール明細本文を メール明細本文マップより取得する。
						mailDtlText = (String)mailDtlTextMap.get(mailDtlCd);
						if(null == mailDtlText)
						{
							mailDtlText = "";
						}
						//  v1.00.01 メール明細本文内の"%"の数をカウントアップ
						srcDtlDtlCkanCntr += getStrCnt(mailDtlText, "%");
					}
					// 明細本文非定型置換文字
					dtlTextHtkCkanMoji = rsDtlTextHtkbMap.getString(JBSbatCC_T_DTL_TEXT_HTKB.DTL_TEXT_HTK_CKAN_MOJI);
					
					// v1.00.01 セットした非定型置換文字をカウントアップ
					// 2011/12/14 nullはカウントしない（空文字はカウントする） start
					if(null != dtlTextHtkCkanMoji)
					{
						dtlDtlhtkbCntr++;
					}
					// 2011/12/14 nullはカウントしない（空文字はカウントする） end
					//------------------------------------
					// 明細本文より置換文字埋め込み位置検索
					//------------------------------------
					if(mailDtlText.indexOf("%") == -1)
					{
						sbMailDtlTextMaster.append(mailDtlText);
						// 本文中の"$"部分までを登録用本文にセット
						sbMailTextMaster.append(tmpBpdyText.substring(0, tmpBpdyText.indexOf("$")));
						// 非定型置換文字列を連結
						sbMailTextMaster.append(sbMailDtlTextMaster);
						// 登録した部分までをトリミング
						tmpBpdyText = tmpBpdyText.substring(tmpBpdyText.indexOf("$") + 1);
						//"$"が無くなった場合は残り全てを連結してループ抜け
						if(tmpBpdyText.indexOf("$") == -1)
						{
							sbMailTextMaster.append(tmpBpdyText);
							break;
						}
						sbMailDtlTextMaster.delete(0, sbMailDtlTextMaster.length());
						continue;
					}
					//------------------------------------
					// 明細本文に置換文字埋め込み位置なし
					//------------------------------------
					else
					{
						// "%"部分までを登録用本文にセット
						sbMailDtlTextMaster.append(mailDtlText.substring(0, mailDtlText.indexOf("%")));
						// 非定型置換文字列を連結
						// 2011/11/17 指定値がnullの場合は空文字に置換する end
						if(null == dtlTextHtkCkanMoji)
						{
							dtlTextHtkCkanMoji = "";
						}
						// 2011/11/17 指定値がnullの場合は空文字に置換する end
						sbMailDtlTextMaster.append(dtlTextHtkCkanMoji);
						// 登録した部分までをトリミング
						mailDtlText = mailDtlText.substring(mailDtlText.indexOf("%") + 1);
						//"%"が無くなった場合は残り全てを連結
						if(mailDtlText.indexOf("%") == -1)
						{
							// 明細本文の完成
							sbMailDtlTextMaster.append(mailDtlText);
							// 本文中の"$"部分までを登録用本文にセット
							sbMailTextMaster.append(tmpBpdyText.substring(0, tmpBpdyText.indexOf("$")));
							// 非定型置換文字列を連結
							sbMailTextMaster.append(sbMailDtlTextMaster);
							// 登録した部分までをトリミング
							tmpBpdyText = tmpBpdyText.substring(tmpBpdyText.indexOf("$") + 1);
							//"$"が無くなった場合は残り全てを連結してループ抜け
							if(tmpBpdyText.indexOf("$") == -1)
							{
								sbMailTextMaster.append(tmpBpdyText);
								break;
							}
							sbMailDtlTextMaster.delete(0, sbMailDtlTextMaster.length());
							continue;
						}
					}
					tempMailDtlCd = mailDtlCd;
				}

// 2011/12/15 明細本文非定型置換文字の個数チェックは行わない(DBの仕様上nullと空文字の区別がつかないため) start
//				// v1.00.01 置換文字に残りがある場合はカウントアップ
//				if(null != rsDtlTextHtkbMap)
//				{
//					while((rsDtlTextHtkbMap = db_CC_T_DTL_TEXT_HTKB.selectNext()) != null)
//					{
//						dtlTextHtkCkanMoji = rsDtlTextHtkbMap.getString(JBSbatCC_T_DTL_TEXT_HTKB.DTL_TEXT_HTK_CKAN_MOJI);
//						// 2011/12/14 nullはカウントしない（空文字はカウントする） start
//						if(null != dtlTextHtkCkanMoji)
//						{
//							dtlDtlhtkbCntr++;
//						}
//						// 2011/12/14 nullはカウントしない（空文字はカウントする） start
//					}
//				}
//				// v1.00.01 メール明細中の%の数と明細本文非定型部の数が一致しない場合は例外をスロー
//				
//				if(srcDtlDtlCkanCntr != dtlDtlhtkbCntr)
//				{
//					// 2011/11/17 異常メールを送信対象から外す対応 start
//					this.mailSendForceStopFlg = true;
//					// 2011/11/17 異常メールを送信対象から外す対応 end
//					
//					throw new JCCbatFrameworkException("メール明細本文中の置換文字数_明細本文非定型置換文字数不一致エラー。"
//							+ "メール明細本文中の明細置換文字の数:[" + String.valueOf(srcDtlDtlCkanCntr) + "] "
//							+ "明細本文非定型置換文字の数:[" + String.valueOf(dtlDtlhtkbCntr) + "]");
//				}
// 2011/12/15 明細本文非定型置換文字の個数チェックは行わない(DBの仕様上nullと空文字の区別がつかないため) end
				
				// 明細本文非定型部レコードなしの場合	
				if (!existDtlTextHtkb)
				{
					sbMailTextMaster.append(sbMailText.toString());
				}
				// 本文を送信情報に登録
				sendMailInfo.put("MAIL_TEXT", sbMailTextMaster.toString());
			}
		}
		//------------------------------------
		// 添付ファイル検索一覧取得
		//------------------------------------
		{
			//一時格納用変数を定義
			JBSbatCommonDBInterface rsTempFileMap = null;
			String efileKanriNo = null;
			String filePath = null;
			String fileNm = null;
			String filePathArray[] = null;
			ArrayList<String> filePathList = new ArrayList<String>();
			
			int fileSizeSum = 0;
			int fileSizeLimit = 0;
			String limitStr = null;
//			HashMap<String, Object> eFileMap = new HashMap<String, Object>();

			// v1.00.01 1メールに添付できる添付ファイルの最大サイズを取得
			limitStr = JCCBatCommon.getApplicationConst("SEND_MAIL_TEMP_MAX_SIZE");
			if(limitStr == null || JCCBatCommon.isHannkakuSuuji1(limitStr) == false)
			{
				// 指定が無い場合(または指定誤り時)は制限値を5Mとする
				limitStr = "5";
			}
			fileSizeLimit = Integer.parseInt(limitStr);
			fileSizeLimit <<= 20;
			
			// 電子ファイル管理番号が指定されている場合は添付ファイルを送信情報に登録
			while((rsTempFileMap = db_CC_T_TEMP_FILE.selectNext()) != null)
			{
				// 電子ファイル管理番号とファイル名の取得
				efileKanriNo = rsTempFileMap.getString(JBSbatCC_T_TEMP_FILE.EFILE_KANRI_NO);
				fileNm = rsTempFileMap.getString(JBSbatCC_T_TEMP_FILE.FILE_NM);
				if(efileKanriNo != null)
				{	
					// 電子ファイル管理一意照会処理
					filePath = JCCBatCommon.searchDenshiFile(super.commonItem, efileKanriNo);
					File f = new File(filePath);
					
					// v1.00.01 1メールに添付できる添付ファイルの最大サイズのチェック
					fileSizeSum += f.length();
					String fileName = f.getName();
					filePath = filePath.replace(fileName, fileNm);
					f.renameTo(new File(filePath));
					{
						filePathList.add(filePath);
					}
				}
			}
			if(fileSizeSum > fileSizeLimit)
			{
				// 2011/11/17 異常メールを送信対象から外す対応 start
				this.mailSendForceStopFlg = true;
				// 2011/11/17 異常メールを送信対象から外す対応 end
				
				throw new JCCbatFrameworkException("メールに添付できるファイルサイズの合計を超過しました。"
											+ "添付ファイルサイズの制限値:[" + String.valueOf(fileSizeLimit) + "] "
											+ "添付したファイルサイズの合計:[" + String.valueOf(fileSizeSum) + "]");
			}
			if (0 < filePathList.size())
			{
				filePathArray = (String[])filePathList.toArray(new String[0]);
			}
			if(null != filePathArray && 0 < filePathArray.length)
			{
				sendMailInfo.put("TEMP_FILE_PATH", filePathArray );
			}
		}
	}

	//---------------------------------------------------------------------------------------------------------------------
	//
	// メール送信処理郡
	//
	//---------------------------------------------------------------------------------------------------------------------

	/**
	 * <p>
	 * メール送信処理です。
	 * @param paramInfo 汎用パラメータ情報格納マップ
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @param dbInfo テーブル情報格納マップ
	 * @param sendMailInfo メール送信パラメータ情報格納マップ
	 * @return メール送信結果 成功:true  失敗:false
	 * </p>
	 * @throws Exception 
	 */
	private boolean sendMail(HashMap<String, Object> paramInfo, 
			HashMap<String, String> acInfo, HashMap<String, Object> dbInfo, HashMap<String, Object> sendMailInfo) throws Exception
	{
		// v5.00.00 2013/12/20 メール送信情報ログ出力
		String[] toList = (String[]) sendMailInfo.get("MLAD_TO");
		String logStr = "";
		if (toList != null) {
			for (String to : toList) {
				logStr += " <" + to + ">";
			}
		}
		logPrint.printLogMsg(JBSbatBusinessBase.SYSTEM_INFORMATION, "メール送信開始：" + paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO) + logStr);

// OM-2015-0000238 DEL START
//		int retryCnt = 0;
// OM-2015-0000238 DEL END
		boolean result = false;
		boolean chkFlg = true;
		//---------------------------------
		// メール送信リトライ実施
		//---------------------------------
		while(chkFlg)
		{
			//---------------------------------
			// メール送信
			//---------------------------------
			try
			{
				Integer ret = 0;
				String retStr = "";
				ret = JCCSendMailUtil.sendMail(sendMailInfo);
				retStr = JCCSendMailUtil.getSendParamErrMsg(ret);
				// 戻り値がエラーの場合、例外出力
				if("".equals(retStr) == false)
				{
					throw new JCCbatFrameworkException(retStr);
				}
				// メール送信正常時、処理終了
				result = true;
				break;
			}
			//---------------------------------
			// メール送信例外エラー
			//---------------------------------
// OM-2015-0000238 ADD START
			catch(MessagingException me)
			{
				// v5.00.00 2013/12/20 メール送信情報ログ出力
				logPrint.printLogMsg(JBSbatBusinessBase.SYSTEM_INFORMATION, "JCCSendMailUtilエラー" + me.toString());

				// メール送信エラー（MessagingException配下の例外発生）により処理終了（例外処理なし）
				logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECCB0440AW, 
													new String[] { (String) paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO) });
				result = false;
				break;
			}
			catch(Exception e)
			{
				// v5.00.00 2013/12/20 メール送信情報ログ出力
				logPrint.printLogMsg(JBSbatBusinessBase.SYSTEM_INFORMATION, "JCCSendMailUtilエラー" + e.toString());
				
				throw e;
			}
// OM-2015-0000238 ADD END
// OM-2015-0000238 DEL START
//			catch(Exception e)
//			{
//				// v5.00.00 2013/12/20 メール送信情報ログ出力
//				logPrint.printLogMsg(JBSbatBusinessBase.SYSTEM_INFORMATION, "JCCSendMailUtilエラー" + e.toString());
//
//				String msg = e.toString();
//				commonItem.getLogPrint().printDebugLog(msg);
//				String chkSendErr1 = "SendFailedException";
//				String chkSendErr2 = "MessagingException";
//				// メール送信失敗
//				if(msg.indexOf(chkSendErr1) >= 0)
//				{
//					// メール送信失敗により処理終了（例外処理なし:リトライなし）
//					result = false;
//					break;
//				}
//				// メールサーバー接続エラー
//				else if(msg.indexOf(chkSendErr2) >= 0)
//				{
//					// リトライ
//				}
//				// その他エラー
//				else
//				{
//					throw e;
//				}
//			}
//			//---------------------------------
//			// リトライ回数判定
//			//---------------------------------
//			if(retryCnt >= Integer.parseInt(acInfo.get(KEY_SENDMAIL_RETRY)))
//			{
//				// リトライ回数以上だったらエラーで終了
//				// プロセス停止ファイルの生成
//				String stopFilePath = (String)paramInfo.get(KEY_PATH_STOPFILE);
//				JBSbatBusinessFileUtil outFileObj = new JBSbatBusinessFileUtil(stopFilePath, "", "", "\t");
//				// ファイルに出力する
//				outFileObj.print("ERROR");
//				// クローズする
//				outFileObj.close();
//				// メールサーバー接続エラー時のメール送信テーブル更新
//				paramInfo.put(KEY_SENDMAIL_RESULT, new Boolean(false));
//				updateSendMail(paramInfo, acInfo, dbInfo, sendMailInfo);
//				// エラーで中断
//				throw new JCCbatFrameworkException("メールサーバ接続エラーが発生しました。メール送信番号:[" + paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO)+ "]");
//
//			} 
//			else
//			{
//				retryCnt++;
//				
//				super.logPrint.printDebugLog("リトライ回数 = " + String.valueOf(retryCnt));
//				
//				// リトライ間隔(秒)のぶん、スリープ
//				super.logPrint.printDebugLog("RetryWaitStart");
//				Thread.sleep(Integer.parseInt(acInfo.get(KEY_SENDMAIL_RETRY_INTERVAL))*1000);
//				super.logPrint.printDebugLog("RetryWaitEnd");
//				// chkFlgを初期化
//				chkFlg = true;
//			}
// OM-2015-0000238 DEL END
		}
		// v5.00.00 2013/12/20 メール送信情報ログ出力
		logPrint.printLogMsg(JBSbatBusinessBase.SYSTEM_INFORMATION, "メール送信終了（" + (result ? "正常" : "異常") + "）：" + paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO));
		return result;
	}

	/**
	 * 処理中断時のterminal（終了処理）呼び出し用メソッド
	 * @throws Exception
	 */
	private void callTerminal(Exception exp) throws Exception{
		terminal();
		commit();
		throw exp;
	}
	
	//---------------------------------------------------------------------------------------------------------------------
	//
	// メール送信ステータス更新処理郡
	//
	//---------------------------------------------------------------------------------------------------------------------

	/**
	 * <p>
	 * メールス送信テータス更新処理です。
	 * メール送信テーブルのステータスを更新します。
	 * @param paramInfo 汎用パラメータ情報格納マップ
	 * @param acInfo アプリケーションプロパティ情報格納マップ
	 * @param dbInfo テーブル情報格納マップ
	 * @param sendMailInfo メール送信パラメータ情報格納マップ
	 * </p>
	 * @throws Exception 
	 */
	private void updateSendMail(HashMap<String, Object> paramInfo, HashMap<String, String> acInfo, 
			HashMap<String, Object> dbInfo, HashMap<String, Object> sendMailInfo)  throws Exception
	{
		String status = null;
		long lerrCounter = 0L;
		long lmailSendErrMax = 0L;
		JBSbatCommonDBInterface rsMailSendMap = null;

		//------------------------------
		// メール送信結果判定
		//------------------------------
		// メール送信番号
		String mailSendNo = (String)paramInfo.get(JBSbatCCIFM002001.MAIL_SEND_NO);
		// メール送信結果
		Boolean result = (Boolean)paramInfo.get(KEY_SENDMAIL_RESULT);
		// メール送信エラー上限値
		lmailSendErrMax = new Long((String)acInfo.get(KEY_MAILSEND_ERROR_MAX)).longValue();
		// メール送信テーブルのエラーカウンター取得
		rsMailSendMap = (JBSbatCommonDBInterface)dbInfo.get(D_TBL_NAME_CC_T_MAIL_SEND);
		String errCounter = (String)rsMailSendMap.getString(JBSbatCC_T_MAIL_SEND.ERR_COUNTER);
		if (null != errCounter)
		{
			lerrCounter = new Long(errCounter).longValue();
		}

		// メール送信ステータス
		// メール送信成功
		if (result.booleanValue())
		{
			// 送信済み   "002"
			status = SEND_STATUS_COMPLETE;
		}
		// メール送信失敗
		else
		{
			lerrCounter++;
			// 今回のエラーカウンター >= アプリケーションプロパティ:メール送信エラー上限値の場合、送信停止
			if(lerrCounter >= lmailSendErrMax)
			{
				// 送信停止   "004"
				status = SEND_STATUS_STOP;
			}
			else
			{
				// その他は送信エラー "003"
				status = SEND_STATUS_ERROR;
			}
		}

		//------------------------------
		// メール送信テーブル更新
		//------------------------------
		//設定値をMapにつめる
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface valueMap = new JBSbatCommonDBInterface();
		whereMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_NO, mailSendNo);
		valueMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_STAT, status);
		if (!result.booleanValue())
		{
			valueMap.setValue(JBSbatCC_T_MAIL_SEND.ERR_COUNTER, lerrCounter);
		}
		// メール送信成功:送信済みに設定する場合、メール送信実施年月日時分秒設定
		if (SEND_STATUS_COMPLETE.equals(status))
		{
			// システム日付タイムスタンプ取得
			String timeStamp = JCCBatCommon.getSysDateTimeStamp();
			valueMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_JSSI_DTM, timeStamp);
		}
		// メール送信停止:送信停止に設定する場合、メール送信停止年月日時分秒設定
		if (SEND_STATUS_STOP.equals(status))
		{
			// システム日付タイムスタンプ取得
			String timeStamp = JCCBatCommon.getSysDateTimeStamp();
			valueMap.setValue(JBSbatCC_T_MAIL_SEND.MAIL_SEND_STP_DTM, timeStamp);
		}
			
		// メール送信更新
		int retCount = db_CC_T_MAIL_SEND.updateByPrimaryKeys(whereMap, valueMap);
		if (0 == retCount)
		{
			// 業務継続可能な例外
			throw new JBSbatBusinessError();
		}
	}
	
	/**
	 * 文字列中に存在するの任意の文字列の個数を取得する
	 * @param srcStr 検索元の文字列
	 * @param searchStr 検索したい文字列
	 * @return 存在数
	 */
	private static int getStrCnt(String srcStr, String searchStr)
	{
		int cnt = 0;
		if(isEmpty(srcStr) || isEmpty(searchStr))
		{
			return 0;
		}
		String tmpStr = srcStr;
		
		while(tmpStr.indexOf(searchStr) != -1)
		{
			cnt++;
			tmpStr = tmpStr.substring(tmpStr.indexOf(searchStr) + searchStr.length());
		}
		return cnt;
	}

}
