/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

/*
 *
 * メール送信サーブレット（SendMailServlet）
 *
 *		変更履歴
 *			2004.01.08	新規作成	斉藤 暁
*/
package jp.co.ntt.lms.Common.SendMailServlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsEnv;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.LumpInsert.LumpInsertClient;
import jp.co.ntt.lms.xmo.LumpInsert.LumpInsertEnv;
import jp.co.ntt.lms.xmo.Mail.MailClient;
import jp.co.ntt.lms.xmo.Mail.MailConst;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Lo.LoEnv;

/**
 * SendMailServletクラス<BR>
 *
 * SendMailServletの実装クラスです。<BR>
 */

public class SendMailServlet extends HttpServlet implements SendMailMessage
{
	/**
	 * セッション登録名 - ユーザリスト["USER_LIST"]
	 */
	private static final String GET_USER_LIST = "USER_LIST";

	/** セッション登録名 - LOリスト["USER_LIST"]
	 */
	private static final String GET_LO_LIST = "LO_LIST";

	/**
	 * セッション登録名 - 送信処理結果["RESULT_DATA"]
	 */
	private static final String GET_RESULT_DATA = "RESULT_DATA";

	/**
	 * セッション登録名 - 管理者or先生のユーザID["IUSERID"]
	 */
	private static final String GET_IUSERID = "IUSERID";

	/**
	 * パラメータ名 - メール種別["MAILTYPE"]
	 */
	private static final String PARAM_MAILTYPE = "MAILTYPE";

	/**
	 * パラメータ名 - LOID["LOID"]
	 */
	private static final String PARAM_LO_ID = "LOID";

	/**
	 * パラメータ名 - 親LOID["PARENT_LOID"]
	 */
	private static final String PARAM_PARENT_LOID = "PARENT_LOID";

	/**
	 * パラメータ名 - 教材名["MATERIAL_NAME"]
	 */
	private static final String PARAM_MATERIAL_NAME = "MATERIAL_NAME";

	/**
	 * 一括登録Mail種別 - Mail種別["0"]
	 */
	private static final String TYPE_LUMP = "0";

	/**
	 * アサインMail種別 - Mail種別["1"]
	 */
	private static final String TYPE_ASSIGNMENTS = "1";

	/**
	 * 激励Mail種別 - Mail種別["2"]
	 */
	private static final String TYPE_STIMULATE = "2";

	/**
	 * 一括登録INIファイル名 - INIファイル名["lumpinsert.ini"]
	 */
	private static final String FILE_LUMP_INI = "lumpinsert.ini";

	/**
	 * アサインINIファイル名 - INIファイル名["assignments.ini"]
	 */
	private static final String FILE_ASSIGNMENTS_INI = "assignments.ini";

	/**
	 * LoINIファイル名 - INIファイル名["lo.ini"]
	 */
	private static final String FILE_LO_INI = "lo.ini";

	/**
	 * DB登録結果 - DB登録結果["成功"]
	 */
	private static final String DB_RESULT_SUCCESS = "ＤＢ登録成功";

	/**
	 * メール送信結果 - メール送信結果["成功"]
	 */
	private static final String MAIL_RESULT_SUCCESS = "送信成功";

	/**
	 * メール送信結果 - メール送信結果["失敗"]
	 */
	private static final String MAIL_RESULT_FAIL = "送信失敗";

	/**
	 * メール送信結果 - メール送信結果["未送信"]
	 */
	private static final String MAIL_RESULT_NOTSEND = "未送信";


	/**
	 * 返却情報Hashtableキー情報 - ユーザ名["UserName"]
	 */
	private static final String KEY_USER_NAME = "UserName";

	/**
	 * 返却情報Hashtableキー情報 - ユーザID["UserID"]
	 */
	private static final String KEY_USER_ID = "UserID";

	/**
	 * 返却情報Hashtableキー情報 - 送信結果["SendResult"]
	 */
	private static final String KEY_SEND_RESULT = "SendResult";

	//========================================================
	//	publicメソッド
	//========================================================
	/**
	 * サーブレットの初期化処理を行います。<BR>
	 * @param svlConfig				サーブレット情報
	 * @exception ServletException	WBT例外
	 */
	public void init(ServletConfig svlConfig) throws ServletException
	{
		//	スーパークラスの初期化処理
		//	内部でServletConfigのフィールド設定を行っている
		super.init(svlConfig);
	}

	/**
	 * 末端からのGET要求処理を行います。<BR>
	 * @param request	HTTPリクエスト
	 * @param response	HTTPレスポンス
	 * @exception ServletException	サーブレット例外
	 * @exception IOException		入出力例外
	 */
	public void doGet(HttpServletRequest request,
					  HttpServletResponse response) throws ServletException, IOException
	{
		//	リクエスト処理
		doRequest(request, response);
	}

	/**
	 * 末端からのPOST要求処理を行います。<BR>
	 * @param request	HTTPリクエスト
	 * @param response	HTTPレスポンス
	 * @exception ServletException	サーブレット例外
	 * @exception IOException		入出力例外
	 */
	public void doPost(HttpServletRequest request,
					   HttpServletResponse response) throws ServletException, IOException
	{
		//	リクエスト処理
		doRequest(request, response);
	}

	/**
	 * サーブレットの終了処理を行います。<BR>
	 */
	public void destroy()
	{
		//スーパークラスの終了処理
		super.destroy();
	}

	//========================================================
	//	privateメソッド
	//========================================================
	/**
	 * 末端からの要求処理を行います。<BR>
	 * @param request	HTTPリクエスト
	 * @param response	HTTPレスポンス
	 */
	private void doRequest(HttpServletRequest request,
						   HttpServletResponse response)
	{
		try
		{
			outputConsole("doRequest 開始");

			// HTTPリクエストよりリクエストパラメータを取得
			Hashtable htbParam = getParameter(request);

			String strLoID = (String)htbParam.get(PARAM_LO_ID);
			String strParentLoID = (String)htbParam.get(PARAM_PARENT_LOID);

			// HTTPリクエストよりセッションを取得
			HttpSession objSession = null;
			objSession = request.getSession();
			//セッションからユーザリストを取得
			Vector vctMasterUserList = (Vector)objSession.getAttribute(GET_USER_LIST);

			//セッションからLOリストを取得
			Vector vctMasterLoList = (Vector)objSession.getAttribute(GET_LO_LIST);

			if(vctMasterUserList == null)
			{
				outputConsole("ユーザリストサイズがNULLなので完了");
				createClose(response);
				return;
			}
			outputConsole("ユーザリストサイズ=[" + vctMasterUserList.size() + "]");

			//INIファイルから情報を取得
			String strMailType = (String)htbParam.get(PARAM_MAILTYPE);
			//MailTypeがNULLの場合
			if(strMailType == null)
			{
				//エラー処理
				String strLog = "メール種別不正=[null]";
				DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
				createErrorPage(response, NOMAIL_TYPE_ERR);
				return;
			}

			String strParam = null;
			String strTemplatePath = null;
			try{
				//メール種別によって情報取得先が変わる
				if(strMailType.compareToIgnoreCase(TYPE_LUMP) == 0)
				{//一括登録メールの場合
					LumpInsertEnv objEnv = LumpInsertEnv.getInstance();
					//テンプレートファイルフルパス
					strTemplatePath = objEnv.getSendMailPath();
					//一括送信数
					strParam = objEnv.getSendMailCount();
				}
				else if(strMailType.compareToIgnoreCase(TYPE_ASSIGNMENTS) == 0)
				{//アサインメールの場合
					AssignmentsEnv objEnv = AssignmentsEnv.getInstance();
					//テンプレートファイルフルパス
					strTemplatePath = objEnv.getSendMailPath();
					//一括送信数
					strParam = objEnv.getSendMailCount();
				}
				else if(strMailType.compareToIgnoreCase(TYPE_STIMULATE) == 0)
				{//激励メールの場合
					LoEnv objEnv = LoEnv.getInstance();
					//テンプレートファイルフルパス
					strTemplatePath = objEnv.getSendMailPath();
					//一括送信数
					strParam = objEnv.getSendMailCount();
				}
				else
				{//それ以外
					String strLog = "メール種別不正=[" + strMailType + "]";
					DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
					createErrorPage(response, MAIL_TYPE_ERR);
					return;
				}
			}catch( Exception e){
				e.printStackTrace();
				createErrorPage(response, FILE_ERR);
				return;
			}

			//一括送信数変換
			int intSendCountMax = 1;	//初期値 = 1
			if(strParam != null)
			{
				Integer intValue = new Integer(strParam);
				intSendCountMax = intValue.intValue();

				if(vctMasterUserList.size() < intSendCountMax )
				{
					intSendCountMax = vctMasterUserList.size();
				}
			}

			outputConsole("テンプレートファイルフルパス=[" + strTemplatePath + "]");
			outputConsole("一括送信数=[" + intSendCountMax + "]");

			//カーソル位置からリスト抽出
			Vector vctUserList = new Vector();
			Vector vctLoList   = new Vector();
			for(int i=0; i<intSendCountMax; i++)
			{
				vctUserList.add((String)vctMasterUserList.get(i));
				if ( vctMasterLoList != null ){
					vctLoList.add((String)vctMasterLoList.get(i));
				}
			}

			//*************************
			//メール送信処理
			//*************************
			Vector vctResultList = new Vector();	//結果格納用
			if(strMailType.compareToIgnoreCase(TYPE_LUMP) == 0)
			{//一括登録メールの場合
				sendMailLump(vctUserList, htbParam, strTemplatePath, vctResultList);
			}
			else if(strMailType.compareToIgnoreCase(TYPE_ASSIGNMENTS) == 0)
			{//アサインメールの場合
				sendMailAssign(vctUserList, htbParam, strTemplatePath, vctResultList, objSession);
			}
			else if(strMailType.compareToIgnoreCase(TYPE_STIMULATE) == 0)
			{//激励メールの場合
				sendMailStim(vctUserList, vctLoList, htbParam, strTemplatePath, vctResultList, objSession);
			}

			//処理完了のものはセッションから削除
			for(int i=0; i<intSendCountMax; i++)
			{
				vctMasterUserList.remove(0);
				if ( vctMasterLoList != null ){
					vctMasterLoList.remove(0);
				}
			}

			String strFlag = null;		//遷移先用パラメータ
			if(vctMasterUserList.size() == 0)
			{
				if(strMailType.compareToIgnoreCase(TYPE_ASSIGNMENTS) == 0 ||
				  strMailType.compareToIgnoreCase(TYPE_STIMULATE) == 0 )
				{
					objSession.removeAttribute(GET_IUSERID);
					if ( strMailType.compareToIgnoreCase(TYPE_STIMULATE) == 0 ){
						objSession.removeAttribute(GET_LO_LIST);
						vctMasterLoList = null;
					}
				}
				objSession.removeAttribute(GET_USER_LIST);
				vctMasterUserList = null;
				strFlag = "0";					//終了
			}
			else{
				objSession.setAttribute(GET_USER_LIST, vctMasterUserList);
				if ( vctMasterLoList != null ){
					objSession.setAttribute(GET_LO_LIST, vctMasterLoList);
				}
				Integer objInt = new Integer(vctMasterUserList.size());
				strFlag = objInt.toString();	//継続
			}

			//処理結果をセッションに格納
			objSession.setAttribute(GET_RESULT_DATA, vctResultList);

			//送信結果先へ遷移
			SendMailEnv objServletEnv = new SendMailEnv();
			String strNext = null;
			try{
				strNext = objServletEnv.getProperty(SendMailEnv.NEXT_URL);
			}catch(Exception e ){
				e.printStackTrace();
				createErrorPage(response, FILE_ERR);
				return;
			}
			if( strNext == null ){
				createErrorPage(response, FILE_ERR);
				return;
			}
			//パラメータ付加
			strNext += strFlag;
			strNext += "&" + PARAM_MAILTYPE + "=" + strMailType;
			strNext += "&SERVLET_URL=" + request.getRequestURL();

			if(strMailType.compareToIgnoreCase(TYPE_ASSIGNMENTS) == 0)
			{//アサインメールの場合
				objSession.setAttribute("ASSIGN_PARAM", (String)("LOID=" + strLoID + "&" + "PARENT_LOID=" + strParentLoID));
			}


			response.sendRedirect(strNext);

			outputConsole("doRequest 終了");
			return;
		}
		catch (Exception ex)
		{
			//例外処理
			ex.printStackTrace();
			//送信結果先へ遷移
			createErrorPage(response, SYSTEM_ERR);
			return;
		}
	}

	/**
	 * リクエストパラメータを取得します。<BR>
	 * HTTPリクエストから抽出したパラメータを取得する。<BR>
	 * @param request	HTTPリクエスト
	 * @return			リクエストパラメータ
	 * @exception WBTException	WBT例外
	 */
	private Hashtable getParameter(HttpServletRequest request)
	{
		// パラメータを格納するテーブルを生成
		Hashtable htbRet = new Hashtable();

		// 入力パラメータのキーの一覧を取得
		Enumeration enmKey = request.getParameterNames();

		// 入力パラメータのキーから入力パラメータを抽出
		while (enmKey.hasMoreElements() )
		{
			// 入力パラメータのキーを取得
			String strKey;			//	入力パラメータのキー
			String[] strValues; 	//	入力パラメータの値(配列)
			String strValue;		//	入力パラメータの値

			strKey		= (String)enmKey.nextElement();
			strValues	= request.getParameterValues(strKey);
			strValue	= strValues[0];

			// 入力パラメータをハッシュテーブルに設定する
			htbRet.put(strKey, strValue);

			outputConsole("sreKey=[" + strKey + "]");
			outputConsole("strValue=[" + strValue + "]");
		}
		return htbRet;
	}

	/**
	 * 送信処理メソッドを実行します。<BR>
	 * @param vctUserList メール送信ユーザID群<BR>
	 * @param htbParam    リクエストパラメータ群<BR>
	 * @param strTemplatePath  テンプレートファイルフルパス<BR>
	 * @return void<BR>
	 * @exception Exception
	 */
	private void sendMailLump(Vector vctUserList, Hashtable htbParam, String strTemplatePath, Vector vctRet) throws SendMailException
	{
		try
		{
			outputConsole("一括登録メール送信処理開始");

			int intRet = MailConst.RESULT_SUCCESS;	//初期値：正常

			MailClient objMCL = new MailClient();

			//パラメータ作成
			//一括送信数分、ユーザ情報取得
			String strUserID = null;
			String[] strUserIDList = new String[1];

			for(int i=0; i<vctUserList.size(); i++)
			{
				strUserID = (String)vctUserList.get(i);
				strUserIDList[0] = strUserID;

				//パラメータ取得
				// ログインURLの取得
				Environment objEnv = new Environment();
				// パラメータ取得
				String strSystemURL = objEnv.getSystemURL();				// システムURL
				String strLoginURL = strSystemURL + "/";
				// ユーザ名を取得する
				PeopleClient objPeople = new PeopleClient();
				objPeople.setWhereUserID( strUserID );
				String strUserName = null;
				// 検索処理
				if( !objPeople.select() )
				{
					// 検索失敗
					outputConsole("一括登録メール送信検索失敗:[" + objPeople.getMessageData() + "]");
					throw new SendMailException( objPeople.getMessageData() );
				}
				// 検索成功
				if( objPeople.next() ) {
					strUserName = objPeople.getUserName();
				}

				//メール送信
				intRet = objMCL.sendMail(strUserIDList,			//メール送信ユーザID群				←セッションから取得
										 null,					//
										 strLoginURL,			//システムログインURL				←
										 null,					//
										 null,					//
										 strTemplatePath );		//テンプレートファイルフルパス		←INIファイルから取得

				//結果情報作成
				//ログ出力処理
				outputLog(objMCL, strUserID, strUserName, intRet, vctRet);
			}
			outputConsole("一括登録メール送信処理終了");
		}
		catch (Exception ex)
		{
			//例外処理
			ex.printStackTrace();
			throw new SendMailException(SYSTEM_ERR);
		}
	}

	/**
	 * 送信処理メソッドを実行します。<BR>
	 * @param vctUserList メール送信ユーザID群<BR>
	 * @param htbParam    リクエストパラメータ群<BR>
	 * @param strTemplatePath  テンプレートファイルフルパス<BR>
	 * @return void<BR>
	 * @exception Exception
	 */
	private void sendMailAssign(Vector vctUserList, Hashtable htbParam, String strTemplatePath, Vector vctRet, HttpSession objSession) throws SendMailException
	{
		try
		{
			int intRet = MailConst.RESULT_SUCCESS;	//初期値：正常

			MailClient objMCL = new MailClient();

			//パラメータ取得
			String strTeacherId = (String)objSession.getAttribute(GET_IUSERID);
			String strLoID = (String)htbParam.get(PARAM_LO_ID);
			String strParentLoID = (String)htbParam.get(PARAM_PARENT_LOID);
			String strMaterialID = strParentLoID + strLoID;

			//パラメータ作成
			// 教材名の取得
			LoClient objLo = new LoClient();
			objLo.setWhereLoID( strLoID );
			String strLoTitle = "";
			// 検索処理の実行
			if( !objLo.select() ) {
				throw new SendMailException( objLo.getMessageData() );
			}

			// 結果の取得
			if( objLo.next() ) {
				strLoTitle = objLo.getLoTytle();
			}

			//一括送信数分、ユーザ情報取得
			String strUserID = null;
			String[] strUserIDList = new String[1];
			for(int i=0; i<vctUserList.size(); i++)
			{
				strUserID = (String)vctUserList.get(i);
				strUserIDList[0] = strUserID;

				// ログインURLの作成
				// ユーザIDからパスワードを取得する
				PeopleClient objPeople = new PeopleClient();
				objPeople.setWhereUserID( strUserID );
				String strLoginID = null;
				String strPassword = null;
				String strUserName = null;
				// 検索処理
				if( !objPeople.select() ) {
					// 検索失敗
					outputConsole("アサインメール送信検索失敗:[" + objPeople.getMessageData() + "]");
					throw new SendMailException( objPeople.getMessageData() );
				}
				// 検索成功
				if( objPeople.next() ) {
					strLoginID = objPeople.getLoginID();
					strPassword = objPeople.getEncryptPassword();
					strUserName = objPeople.getUserName();
				}
				// マクロ展開用の文字列を作成
				Hashtable htbMacro = new Hashtable();
				htbMacro.put( AssignmentsEnv.UID, URLEncoder.encode(strLoginID, "UTF-8") );
				htbMacro.put( AssignmentsEnv.PS, strPassword );
				htbMacro.put( AssignmentsEnv.LID, strLoID );
				htbMacro.put( AssignmentsEnv.MTID, strMaterialID );
				AssignmentsEnv objEnv = AssignmentsEnv.getInstance();
				String strLoginURL = objEnv.getLoginURL( htbMacro );

				//メール送信
				intRet = objMCL.sendMail(strUserIDList,			//メール送信ユーザID群				←セッションから取得
										 strTeacherId,			//管理者 or 先生のユーザID			←起動時のパラメータから取得
										 null,			
										 strLoTitle,			//教材名							←検索して取得
										 strLoginURL,			//教材起動URL						←検索して取得
										 strTemplatePath );		//テンプレートファイルフルパス		←INIファイルから取得

				//ログ出力処理
				outputLog(objMCL, strUserID, strUserName, intRet, vctRet);
			}
		}
		catch (Exception ex)
		{
			//例外処理
			ex.printStackTrace();
			throw new SendMailException(SYSTEM_ERR);
		}
	}

	/**
	 * 送信処理メソッドを実行します。<BR>
	 * @param vctUserList メール送信ユーザID群<BR>
	 * @param vctLoList メール送信LOID群<BR>
	 * @param htbParam    リクエストパラメータ群<BR>
	 * @param strTemplatePath  テンプレートファイルフルパス<BR>
	 * @return void<BR>
	 * @exception Exception
	 */
	private void sendMailStim(Vector vctUserList, Vector vctLoList, Hashtable htbParam, String strTemplatePath, Vector vctRet, HttpSession objSession) throws SendMailException
	{
		try
		{
			int intRet = MailConst.RESULT_SUCCESS;	//初期値：正常

			MailClient objMCL = new MailClient();

			//パラメータ取得
			String strTeacherId = (String)objSession.getAttribute(GET_IUSERID);

			//一括送信数分、ユーザ情報取得
			String strUserID = null;
			String[] strUserIDList = new String[1];
			for(int i=0; i<vctUserList.size(); i++)
			{
				strUserID = (String)vctUserList.get(i);
				strUserIDList[0] = strUserID;

				//パラメータ作成
				// 教材名の取得
				LoClient objLo = new LoClient();
				objLo.setWhereLoID( (String)vctLoList.get(i) );
				String strLoTitle = "";
				// 検索処理の実行
				if( !objLo.select() ) {
					throw new SendMailException( objLo.getMessageData() );
				}

				// 結果の取得
				if( objLo.next() ) {
					strLoTitle = objLo.getLoTytle();
					outputConsole("激励メール教材名:[" + strLoTitle + "]");
				}

				//パラメータ作成
				//マテリアルIDの取得
				LoRelationClient objLoRelation = new LoRelationClient();
				objLoRelation.setWhereChildID( (String)vctLoList.get(i) );
				String strMaterialID = "";
				
				// 検索処理の実行
				if( !objLoRelation.select() ) {
					throw new SendMailException( objLoRelation.getMessageData() );
				}

				// 結果の取得
				if( objLoRelation.next() ) {
					strMaterialID = objLoRelation.getmaterialID();
				}
				
				PeopleClient objPeople = new PeopleClient();
				objPeople.setWhereUserID( strUserID );
				String strLoginID = null;
				String strPassword = null;
				String strUserName = null;
				// 検索処理
				if( !objPeople.select() ) {
					// 検索失敗
					outputConsole("激励メール送信検索失敗:[" + objPeople.getMessageData() + "]");
					throw new SendMailException( objPeople.getMessageData() );
				}
				// 検索成功
				if( objPeople.next() ) {
					strUserName = objPeople.getUserName();
					strLoginID = objPeople.getLoginID();
					strPassword = objPeople.getEncryptPassword();

				}

				// マクロ展開用の文字列を作成
				Hashtable htbMacro = new Hashtable();
				htbMacro.put( AssignmentsEnv.UID, URLEncoder.encode(strLoginID, "UTF-8") );
				htbMacro.put( AssignmentsEnv.PS, strPassword );
				htbMacro.put( AssignmentsEnv.LID, (String)vctLoList.get(i) );
				htbMacro.put( AssignmentsEnv.MTID, strMaterialID );
				AssignmentsEnv objEnv = AssignmentsEnv.getInstance();
				String strLoginURL = objEnv.getLoginURL( htbMacro );

				//メール送信
				intRet = objMCL.sendMail(strUserIDList,			//メール送信ユーザID群				←セッションから取得
										 strTeacherId,			//管理者 or 先生のユーザID			←起動時のパラメータから取得
										 null,
										 strLoTitle,			//教材名							←検索して取得
										 strLoginURL,			//教材起動URL						←検索して作成
										 strTemplatePath );		//テンプレートファイルフルパス		←INIファイルから取得

				//ログ出力処理
				outputLog(objMCL, strUserID, strUserName, intRet, vctRet);
			}
		}
		catch (Exception ex)
		{
			//例外処理
			ex.printStackTrace();
			throw new SendMailException(SYSTEM_ERR);
		}
	}


	/**
	 * ログ出力処理を実行します。<BR>
	 * メール送信が異常な場合にのみ呼ばれます。
	 * @param objMCL メールクライアントインスタンス<BR>
	 * @param strUserID ユーザID<BR>
	 * @param strUserName ユーザ名<BR>
	 * @param intRet メールクライアント送信結果<BR>
	 * @param vctRet クライアントへの返却情報<BR>
	 * @return void <BR>
	 * @exception Exception
	 */
	private void outputLog(MailClient objMCL, String strUserID, String strUserName, int intRet, Vector vctRet) throws SendMailException
	{
		try
		{
			outputConsole("ログ出力開始");

			Hashtable htbResultList = new Hashtable();

			//返却情報作成
			htbResultList.put(KEY_USER_NAME, strUserName);
			htbResultList.put(KEY_USER_ID, strUserID);

			String strLog = "メール送信結果:";
			if( intRet != MailConst.RESULT_SUCCESS )
			{
				// メール送信に失敗した場合
				//        ユーザID          ユーザ名            DB登録結果               メール送信結果
				strLog  = strLog
						+ strUserID + ":" + strUserName + ":" + DB_RESULT_SUCCESS + ":" + MAIL_RESULT_FAIL;
				//出力
				DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
				outputConsole(strLog);

				htbResultList.put(KEY_SEND_RESULT, MAIL_RESULT_FAIL);
				vctRet.add(htbResultList);
			}
			else
			{
				int	nResult = 0;

				// 配送失敗メールの確認
				ArrayList objNgResult = objMCL.checkNgResult();
				if(objNgResult != null)
				{
					if(objNgResult.size() != 0)
					{
						//        ユーザID          ユーザ名            DB登録結果               メール送信結果
						strLog  = strLog
								+ strUserID + ":" + strUserName + ":" + DB_RESULT_SUCCESS + ":" + MAIL_RESULT_FAIL;
						//出力
						DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
						outputConsole(strLog);

						htbResultList.put(KEY_SEND_RESULT, MAIL_RESULT_FAIL);
						vctRet.add(htbResultList);

						nResult = 1;

					}
				}

				if( nResult != 1 )
				{							
					// 未配送メールの確認
					ArrayList objNotSendResult = objMCL.checkNotSendResult();
					if(objNotSendResult != null)
					{
						if(objNotSendResult.size() != 0)
						{
							//        ユーザID          ユーザ名            DB登録結果               メール送信結果
							strLog  = strLog
									+ strUserID + ":" + strUserName + ":" + DB_RESULT_SUCCESS + ":" + MAIL_RESULT_NOTSEND;
							//出力
							DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
							outputConsole(strLog);

							htbResultList.put(KEY_SEND_RESULT, MAIL_RESULT_NOTSEND);
							vctRet.add(htbResultList);
						}
						else{
							//送信成功
							//        ユーザID          ユーザ名            DB登録結果               メール送信結果
							strLog  = strLog
									+ strUserID + ":" + strUserName + ":" + DB_RESULT_SUCCESS + ":" + MAIL_RESULT_SUCCESS;
							//出力
							DebugLog.write(this.getClass(), strLog, DebugLog.ROW);
							outputConsole(strLog);

							htbResultList.put(KEY_SEND_RESULT, MAIL_RESULT_SUCCESS);
							vctRet.add(htbResultList);
						}
					}
				}
			}

			outputConsole("ログ出力終了");
		}
		catch (Exception ex)
		{
			//例外処理
			ex.printStackTrace();
			throw new SendMailException(SYSTEM_ERR);
		}
	}

	/**
	 * エラーページを作成します。<BR>
	 * エラーページのHTMLを作成し、HTTPレスポンスに設定します。<BR>
	 * @param response	HTTPレスポンス
	 * @return void
	 */
	private void createErrorPage(HttpServletResponse response, String strErrMsg)
	{
		if ( strErrMsg == null ){
			strErrMsg = SYSTEM_ERR;
		}
		try
		{
			SendMailEnv objServletEnv = new SendMailEnv();
			String strErrURL = objServletEnv.getProperty(SendMailEnv.ERR_URL);
			strErrURL = strErrURL + URLEncoder.encode( strErrMsg, "UTF-8");
			response.sendRedirect(strErrURL);
			return;
		}
		catch (Exception ex){}
	}

	private void createClose(HttpServletResponse response)
	{
		try {
			StringBuffer strBuf = new StringBuffer();

			// HTML作成
			strBuf.append("<HTML>\n");
			strBuf.append("<HEAD>\n");
			strBuf.append("<TITLE>エラー</TITLE>\n");
			strBuf.append("<SCRIPT LANGUAGE=\"JavaScript\">\n");
			strBuf.append("function windowClose(){\n");
			strBuf.append("self.close();\n}\n");
			strBuf.append("</SCRIPT>\n");
			strBuf.append("</HEAD>\n");
			strBuf.append("<BODY onLoad=\"windowClose()\">\n");
			strBuf.append("</BODY>\n");
			strBuf.append("</HTML>");

			// HTTPレスポンスにHTML内容設定
			response.setContentType("text/html; charset=Windows-31J");

			PrintWriter objOutput = response.getWriter();
			response.setBufferSize(strBuf.length());
			objOutput.println(strBuf.toString());

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

	/**
	 * デバッグ用<BR>
	*/
	private void outputConsole(String strMsg)
	{
	}
}

