/*
このファイルの中身は、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) ______________________________________.
*/

//
//	メール送信機能 XMO JavaMail使用メール送信クラス
//	変更履歴
//	2004.01.08 中山雅文   新規作成

package jp.co.ntt.lms.xmo.Mail;

import java.util.Properties;
import java.util.Date;
import java.io.UnsupportedEncodingException;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Address;
import javax.mail.NoSuchProviderException;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

/**
 * JavaMailによるメール送信クラスです。
 */
public class MailSender {

	/** セッション情報 */
	private Session mobjSession;
	/** トランスポートオブジェクト */
	private Transport mobjTransport;

	/**
	 * SMTP送信オブジェクトを生成します。
	 * @exception NoSuchProviderException
	 *            プロトコルに対応するProviderが見つからなかった
	 */
	public MailSender() throws NoSuchProviderException {
		this("smtp");
	}

	/**
	 * 指定プロトコルによる送信オブジェクトを生成します。
	 * @param protocol 送信に用いるプロトコル名
	 * @exception NoSuchProviderException
	 *            プロトコルに対応するProviderが見つからなかった
	 */
	public MailSender(String protocol) throws NoSuchProviderException {
		mobjSession = Session.getInstance(new Properties(), null);
		// "mail.debug"のみシステムプロパティの情報を利用する事にします。
		mobjSession.setDebug(Boolean.getBoolean("mail.debug"));
		mobjTransport = mobjSession.getTransport(protocol);
	}

	/**
	 * サーバに接続します。
	 * @param host 接続ホスト名
	 * @param port 接続ポート
	 * @exception MessagingException 接続に失敗
	 */
	public void connect(String host, int port) throws MessagingException {
		mobjTransport.connect(host, port, null, null);
	}

	/**
	 * サーバから切断します。
	 */
	public synchronized void disconnect() {
		try {
			mobjTransport.close();
		}
		catch (MessagingException e) {
		}
	}

	/**
	 * 空のメッセージオブジェクトを生成します。
	 * @return メッセージオブジェクト
	 */
	public MimeMessage createMessage() {
		return new MimeMessage(mobjSession);
	}

	/**
	 * メッセージにTo:From:X-Mailer:を付加します。
	 * @param msg ヘッダを付加するメッセージ
	 * @param to To:の内容
	 * @param from From:の内容
	 * @exception MessagingException ヘッダの設定に失敗
	 * @exception AddressException to/fromが正しいメイルアドレスではない
	 */
	public static void setHeaders(MimeMessage msg, String[] to, String from)
				throws MessagingException, AddressException {

		String addressList = "";
		int	addressCnt = to.length;

		for (int i = 0; i < addressCnt; i++) {
			addressList += to[i];
			if ( i != addressCnt - 1 ) {
				addressList += ",";
			}
		}

		msg.setFrom(null);
		msg.addFrom(InternetAddress.parse(from, true));
		msg.setRecipients(MimeMessage.RecipientType.TO,
						  InternetAddress.parse(addressList, true));
		msg.setHeader("X-Mailer", "XMS2 Mailer");
	}


	/**
	 * メッセージを送信します。
	 * MimeMessageに設定されたTo:に対して、
	 * From:をenvelope-fromとして送信します。
	 * @param msg 送信するメッセージ
	 * @param envelopeFrom envelope-fromヘッダ
	 * @exception MessagingException 送信またはDateヘッダの設定に失敗
	 */
	public void send(MimeMessage msg, String envelopeFrom)
				throws MessagingException {
		send(msg, msg.getAllRecipients(), envelopeFrom);
	}

	/**
	 * メッセージを送信します。
	 * 第二パラメタに指定されたenvelopeToに対して、
	 * From:の内容をenvelope-fromとして送信します。
	 * @param msg 送信するメッセージ
	 * @param envelopeTo envelope-to(msgに設定されたRecipientsとは無関係です)
	 * @param envelopeFrom envelope-fromヘッダ
	 * @exception MessagingException 送信またはDateヘッダの設定に失敗
	 */
	public synchronized void send(
		MimeMessage msg, Address[] envelopeTo, String envelopeFrom)
				throws MessagingException {
		msg.setSentDate(new Date());

		mobjSession.getProperties().put("mail.smtp.from", envelopeFrom );

		// Message-ID:にFromアドレスを使用します。
		mobjSession.getProperties().put("mail.from",
				((InternetAddress)msg.getFrom()[0]).getAddress());
		msg.saveChanges();
		mobjTransport.sendMessage(msg, envelopeTo);

		mobjSession.getProperties().remove("mail.smtp.from");

	}

	/**
	 * 終期化処理メソッド
	 * @throws Throwable エラーが発生した場合
	 */
	protected void finalize() throws Throwable {
		disconnect();
	}

	/**
	 * メッセージを送信します。
	 * MimeMessageに設定されたTo:に対して、
	 * From:をenvelope-fromとして送信します。
	 * @param to TOヘッダ
	 * @param strMailFrom fromヘッダ
	 * @param strFromField FROM日本語名称
	 * @param strSubject 件名
	 * @param strBody メール本文
	 * @throws MessagingException 送信またはDateヘッダの設定に失敗
	 * @throws UnsupportedEncodingException ISO-2022-JPに対応していない場合
	 */
	public void sendOneMail(
		String[] to, String strMailFrom,
		String strFromField, String strSubject, String strBody )
				throws MessagingException, UnsupportedEncodingException {

		// 変換表取得用
		MailEnv mailEnv = null;

		// 変換表を取得
		mailEnv = MailEnv.getInstance();
		// =====================================================================
		// 文字コード変換表を取得し、件名、本文を変換する。
		char[][] convertCharactorMatrix = null;
		convertCharactorMatrix = mailEnv.getConvertCharactorMatrix();
		// １組ごとに件名と本文を変換する。
		for ( int i = 0; i < convertCharactorMatrix.length; i++ ) {
			// 変換元を取得
			char oldChar = convertCharactorMatrix[i][0];
			// 変換先を取得
			char newChar = convertCharactorMatrix[i][1];
			// 件名を変換
			strSubject = strSubject.replace(oldChar, newChar);
			// 本文を変換
			strBody = strBody.replace(oldChar, newChar);
		}
		// =====================================================================
		// 文字列変換表を取得し、件名、本文を変換する。
		String[][] replaceStringMatrix
			= mailEnv.getReplaceStringMatrix();
		// １組ごとに件名と本文を変換する。
		for ( int i = 0; i < replaceStringMatrix.length; i++ ) {
			// 変換元を取得
			String oldString = replaceStringMatrix[i][0];
			// 変換先を取得
			String newString = replaceStringMatrix[i][1];
			// 件名を変換
			strSubject = strSubject.replaceAll(oldString, newString);
			// 本文を変換
			strBody = strBody.replaceAll(oldString, newString);
		}

		MimeMessage msg = createMessage();
		setHeaders(msg, to, strFromField );
		msg.setSubject(MimeUtility.encodeText(strSubject, "ISO-2022-JP", "B"));
		msg.setText(strBody, "ISO-2022-JP");
		// メール送信
		send(msg, strMailFrom);
	}
}
