    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.mail;
    017
    018import static org.opengion.fukurou.util.StringUtil.csv2ArrayOnly;
    019
    020import java.util.ArrayList;
    021import java.util.List;
    022import java.util.Map;
    023import java.util.TreeMap;
    024
    025import javax.mail.internet.AddressException;
    026import javax.mail.internet.InternetAddress;
    027
    028import org.opengion.fukurou.db.DBUtil;
    029import org.opengion.hayabusa.common.HybsSystem;
    030
    031/**
    032 * メール定型文及びそれも基づいて各項目の合成を行うクラスです。
    033 * コンストラクタには定型文ID及びシステムIDで定型文マスタよりメールの定型文を取得します。
    034 * メール各項目のゲッターでは、定型文の内容を元にパラメータ値とマージして各項目を合成します。
    035 * 宛先について、セットした社員ID、グループIDと定型文の宛先設定に基づき、社員マスタと
    036 * グループマスタよりメールアドレス情報を取得して宛先マップを作成します。
    037 *
    038 *
    039 * @og.rev 5.6.6.0 (2013/07/05) host指定対応。GE37必須です。
    040 *
    041 * @og.group メールモジュール
    042 *
    043 * @version  4.0
    044 * @author   Sen.Li
    045 * @since    JDK1.6
    046 */
    047public class MailPattern {
    048
    049        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    050        private static final String CONTENTS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "CONTENT" : "CONTENTS";
    051        private static final String ADDRESS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "MEMBER" : "ADDRESS";
    052        private static final String NAME_JA = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "NAME" : "NAME_JA";
    053        private static final String KBNAME = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "NM_KBN" : "KBNAME";
    054
    055        // 5.1.0.0 (2009/11/04) CONTENT ⇒ CONTENTS
    056        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    057        private static final String selGE31     = "SELECT PTN_ID,FROM_ID,TO_ID,CC_ID,BCC_ID,TITLE,"+CONTENTS
    058                                                                                        + " ,JOKEN" // 5.6.6.0 (2013/07/05)
    059                                                                                        + " FROM GE31"
    060                                                                                        + " WHERE SYSTEM_ID =? AND PTN_ID=? AND FGJ='1'";
    061        // 5.1.0.0 (2009/11/04) MEMBER ⇒ ADDRESS , NM_KBN ⇒ KBNAME , NAME ⇒ NAME_JA
    062        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    063        private static final String     selGE33         = "SELECT A."+ADDRESS+",A."+NAME_JA+",B."+NAME_JA
    064                                                                                        + " FROM GE33 A,GE33 B"
    065                                                                                        + " WHERE A.FGJ='1' AND B.FGJ(+)='1' AND A.GROUP_ID=B.GROUP_ID(+)"
    066                                                                                        + " AND A."+KBNAME+"='1' AND B."+KBNAME+"(+)='0' AND A.SYSTEM_ID=B.SYSTEM_ID(+)"
    067                                                                                        + " AND A.SYSTEM_ID =? "
    068                                                                                        + " AND A.GROUP_ID =?";
    069
    070        /**
    071         * GE35のメールアドレス検索文
    072         */
    073        public static final String      selGE35         = "SELECT  "+NAME_JA+",MAIL"
    074                                                                                        + " FROM GE35"
    075                                                                                        + " WHERE USERID=?";
    076
    077        // 5.6.6.0 (2013/07/05) 振り分け条件
    078        private static final String     selGE37         = "SELECT  HOST,PORT,AUTH,AUTHUSER,AUTHPASS"
    079                                                                                        + " FROM GE37"
    080                                                                                        + " WHERE SYSTEM_ID = ?"
    081                                                                                        + " AND JOKEN = ?"
    082                                                                                        + " AND FGJ ='1'";
    083
    084        // 内部データのカラム番号(定型文マスタテーブル)
    085        // 5.1.9.0 (2010/09/01) public ⇒ private へ変更
    086 //     private static final int GE31_PTN_ID    = 0 ;           // 未使用
    087        private static final int GE31_FROM_ID   = 1 ;
    088        private static final int GE31_TO_ID             = 2 ;
    089        private static final int GE31_CC_ID             = 3 ;
    090        private static final int GE31_BCC_ID    = 4 ;
    091        private static final int GE31_TITLE             = 5 ;
    092        private static final int GE31_CONTENTS  = 6 ;           // 5.1.0.0 (2009/11/04) CONTENT ⇒ CONTENTS
    093        private static final int GE31_JOKEN             = 7 ;           // 5.6.6.0 (2013/07/05)
    094
    095        // 内部データのカラム番号(グループマスタ)
    096        private static final int GE33_ADDRESS   = 0 ;           // 5.1.0.0 (2009/11/04) MEMBER ⇒ ADDRESS
    097        private static final int GE33_MNAME             = 1 ;
    098        private static final int GE33_GNAME             = 2 ;
    099
    100        /**
    101         * GE35のユーザ名称
    102         */
    103        public static final int GE35_NAME               = 0 ;
    104        /**
    105         * GE35のメールアドレス
    106         */
    107        public static final int GE35_MAIL               = 1 ;
    108
    109        // 内部データのカラム番号(送信ホストマスタ)
    110        private static final int GE37_HOST              = 0 ;
    111        private static final int GE37_PORT              = 1 ;
    112        private static final int GE37_AUTH              = 2 ;
    113        private static final int GE37_AUTHUSER  = 3 ;
    114        private static final int GE37_AUTHPASS  = 4 ;
    115
    116        // 内部データのカラム番号(宛先テーブル)
    117        /** カラム番号(宛先テーブル) {@value} */
    118        public static final int IDX_DST_ID      = 0 ;
    119        /** カラム番号(宛先テーブル) {@value} */
    120        public static final int IDX_GROUP_ID    = 1 ;
    121        /** カラム番号(宛先テーブル) {@value} */
    122        public static final int IDX_GROUP_NAME  = 2 ;
    123        /** カラム番号(宛先テーブル) {@value} */
    124        public static final int IDX_DST_NAME    = 3 ;
    125        /** カラム番号(宛先テーブル) {@value} */
    126        public static final int IDX_DST_ADDR    = 4 ;
    127        /** カラム番号(宛先テーブル) {@value} */
    128        public static final int IDX_DST_KBN     = 5 ;
    129        /** カラム番号(宛先テーブル) {@value} */
    130        public static final int IDX_FGJ                 = 6 ;
    131
    132        /** メール送信区分 {@value} */
    133        public static final int KBN_TO                  = 0 ;   // メール送信区分(TO)
    134        /** メール送信区分 {@value} */
    135        public static final int KBN_CC                  = 1 ;   // メール送信区分(CC)
    136        /** メール送信区分 {@value} */
    137        public static final int KBN_BCC                 = 2 ;   // メール送信区分(BCC)
    138
    139        private static final String PreFixGroup = "GP.";
    140        private final List<String> errAddrList          = new ArrayList<String>();
    141        private final Map<String, String> paramMap ;
    142        private String  fromId          = null;
    143        private final String    toId    ;
    144        private final String    ccId    ;
    145        private final String    bccId   ;
    146        private String[][]      title   = null;
    147        private String[][]      content = null;
    148        private Map<String, String[]> mailDstMap;
    149
    150        // 5.6.6.0 (2013/07/05)
    151        private String host     = HybsSystem.sys( "COMMON_MAIL_SERVER" );
    152        private String smtpPort = HybsSystem.sys( "SMTP_PORT" );
    153        private String auth             = HybsSystem.sys( "MAIL_SEND_AUTH" );
    154        private String authUser = HybsSystem.sys( "MAIL_SEND_AUTH_USER" );
    155        private String authPass = HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" );
    156
    157
    158        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
    159
    160        /**
    161         * メール定型文オブジェクトを作成するコンストラクタです。
    162         * 定型文マスタより取得したデータを各フィルードにセットします。
    163         *
    164         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    165         * @og.rev 5.6.6.0 (2013/07/05) 振り分け対応
    166         *
    167         * @param       params  パラメータのマップ
    168         */
    169        public MailPattern( final Map<String, String> params ){
    170                paramMap = params;
    171                String sysId = params.get( "SYSTEM_ID" );
    172                String pid = params.get( "PTN_ID" );
    173                String[] selGE30Args = { sysId,pid };
    174                String[][] ptn = DBUtil.dbExecute( selGE31, selGE30Args, AbstractMailManager.appInfo, DBID );           // 5.5.5.1 (2012/08/07)
    175                if( ptn == null || ptn.length <=0 ) {
    176                        String errMsg = "定型文取得できません。システムID：" + sysId + "定型文ID：" + pid ;
    177                        throw new RuntimeException( errMsg );
    178                }
    179                fromId  = ptn[0][GE31_FROM_ID];
    180                toId    = ptn[0][GE31_TO_ID];
    181                ccId    = ptn[0][GE31_CC_ID];
    182                bccId   = ptn[0][GE31_BCC_ID];
    183                String tit = ptn[0][GE31_TITLE];
    184                if( tit != null && tit.length() > 0 ) {
    185                        title = splitParam( tit );
    186                }
    187                String con = ptn[0][GE31_CONTENTS];                     // 5.1.0.0 (2009/11/04) CONTENT ⇒ CONTENTS
    188                if( con != null && con.length() > 0 ) {
    189                        content = splitParam( con );
    190                }
    191                // 5.6.6.0 (2013/07/05) 振り分け対応
    192                String joken = ptn[0][GE31_JOKEN];
    193                if( joken != null && joken.length() > 0 ) {
    194                        String[] selGE37Args = { sysId,joken };
    195                        String[][] jkn = DBUtil.dbExecute( selGE37, selGE37Args, AbstractMailManager.appInfo, DBID );
    196                        if( ptn == null || ptn.length <=0 ) {
    197                                String errMsg = "メールホストの振分先が取得できません。システムID：" + sysId + "振分条件：" + joken ;
    198                                throw new RuntimeException( errMsg );
    199                        }
    200                        host            = jkn[0][GE37_HOST];
    201                        smtpPort        = jkn[0][GE37_PORT];
    202                        auth            = jkn[0][GE37_AUTH];
    203                        authUser        = jkn[0][GE37_AUTHUSER];
    204                        authPass        = jkn[0][GE37_AUTHPASS];
    205                }
    206        }
    207
    208        /**
    209         * 定型文の送信者ID欄の設定値とパラメータ{&#064;FROM}を元に送信者アドレスを取得します。
    210         * 定型文には{&#064;FROM}とセットされている場合は、パラメータ｛&#064;FROM｝の値を元に、社員IDをセット
    211         * されている場合、直接そのIDを元に社員マスタから送信者アドレスを取得します。
    212         * 送信者アドレス取得できなければ例外を投げます。
    213         *
    214         * @og.rev 4.3.7.5 (2009/07/08) 送信元名称が設定されていない場合は、アドレスを&lt;&gt;で囲わない
    215         *
    216         * @return      送信者アドレス
    217         */
    218        public String getFromAddr(){
    219                // 定型文に{&#064;FROM}⇒ユーザーよりセットしたデータで置換える、ユーザーIDの場合はそのまま
    220                if( "{@FROM}".equals( fromId ) ) {
    221                        fromId = paramMap.get( "FROM" );
    222                }
    223                paramMap.put( "FROM_ID" , fromId );     // 送信者ID
    224
    225                String[] userInf = getUserInfo( fromId );
    226                String fromAddr = null;
    227                if( userInf != null && checkAddr ( fromId, userInf[1] ) ){      // 送信者メールアドレスチェック
    228                        paramMap.put( "FROM_NAME", userInf[0] );                                // 送信者名前
    229                        // 4.3.7.5 (2009/07/08)
    230                        if( userInf[0] != null && userInf[0].length() > 0 ) {
    231                                fromAddr = userInf[0] + "<" + userInf[1] + ">" ;
    232                        }
    233                        else {
    234                                fromAddr = userInf[1];
    235                        }
    236                        paramMap.put( "FROM_ADDR", fromAddr );                                  // 送信者メールアドレス
    237                }
    238                else {
    239                        String errMsg = "送信者ユーザー情報エラー。ユーザーID：" + fromId;
    240                        throw new RuntimeException( errMsg );
    241                }
    242
    243                return fromAddr;
    244        }
    245
    246        /**
    247         * マージ済のメールタイトルを返します。
    248         *
    249         * @return      メールタイトル
    250         *
    251         */
    252        public String getTitle(){
    253                return marge( title );
    254        }
    255
    256        /**
    257         * マージ済のメール本文を返します。
    258         *
    259         * @og.rev 5.1.0.0 (2009/11/04) HEADER ⇒ H_TXT , FOOTER ⇒ F_TXT カラム名変更
    260         *
    261         * @return      メール本文
    262         */
    263        public String getContent(){
    264                String header = paramMap.get( "HEADER" );               // 5.1.0.0 (2009/11/04) HEADER ⇒ H_TXT
    265                StringBuilder contentBuf = new StringBuilder();
    266                if ( header != null ) {
    267                        contentBuf.append( header ).append( '\n' );
    268                }
    269                contentBuf.append( marge( content ) ).append( '\n' );
    270                String fooder = paramMap.get( "FOOTER" );               // 5.1.0.0 (2009/11/04) FOOTER ⇒ F_TXT
    271                if ( fooder != null ) {
    272                        contentBuf.append( fooder );
    273                }
    274
    275                return contentBuf.toString();
    276        }
    277
    278        /**
    279         * 引数の文字列により、定数文字列の部分とパラメータの部分を分解します。
    280         * 例："A{&#064;PARAM1}B"⇒rtn[0][0]="A",rtn[0][1]="B",rtn[1][0]="PARAM1"
    281         *
    282         * @param       src             分解対象の文字列
    283         *
    284         * @return      定数文字列の部分とパラメータの部分を分解した配列
    285         */
    286        private String[][] splitParam( final String src ) {
    287                String[][] rtn = new String[2][];
    288                if( src == null ) { return new String[2][0]; }
    289
    290                ArrayList<String> listCons = new ArrayList<String>() ;
    291                ArrayList<String> listPara = new ArrayList<String>() ;
    292
    293                int start = 0;
    294                int index = src.indexOf( "{@" );
    295                while( index >= 0 ) {
    296                        listCons.add( src.substring( start, index ) );
    297                        int end = src.indexOf( '}',index );
    298                        if( end < 0 ) {
    299                                String errMsg = "{@ と } との対応関係がずれています。"
    300                                                        + "src=[" + src + "] : index=" + index ;
    301                                throw new RuntimeException( errMsg );
    302                        }
    303                        listPara.add( src.substring( index + 2, end ));
    304
    305                        start = end+1 ;
    306                        index = src.indexOf( "{@",start );
    307                }
    308                listCons.add ( src.substring( start ) );
    309
    310                rtn[0] = listCons.toArray( new String[listCons.size()] );
    311                rtn[1] = listPara.toArray( new String[listPara.size()] );
    312
    313                return rtn;
    314        }
    315
    316        /**
    317         * 送信先のアドレスをセットします。
    318         * 定型文に定義されている宛先(TO、CC、BCC)を引数として渡します。引数には{&#064;TO}、{&#064;CC}、{&#064;BCC}が含まれています。
    319         * {&#064;TO}、{&#064;CC}、{&#064;BCC}を初期設定の値で置換えて、実のメールアドレスマップを作成します。
    320         *
    321         * @return 宛先のマップ
    322         */
    323        public Map<String, String[]> getDstMap(){
    324                String[] toBuf = getDstArray( toId );
    325                String[] ccBuf = getDstArray( ccId );
    326                String[] bccBuf = getDstArray( bccId );
    327
    328                // 送信先(TO、CC、BCC)のマップを作成します。
    329                mailDstMap =  (TreeMap<String, String[]>)getDstAddrMap( bccBuf, KBN_BCC );
    330                mailDstMap.putAll( (TreeMap<String, String[]>) getDstAddrMap( ccBuf, KBN_CC ) );
    331                mailDstMap.putAll( (TreeMap<String, String[]>) getDstAddrMap( toBuf, KBN_TO ) );
    332                setDstWord();
    333
    334                return mailDstMap;
    335        }
    336
    337        /**
    338         * アドレスエラーのメッセージリストを返します。
    339         *
    340         * @return      メッセージリスト
    341         */
    342        public List<String> getErrList(){
    343                return errAddrList;
    344        }
    345
    346        /**
    347         * 送信先のアドレスをcsv形式から配列にセットします。
    348         * 引数は定型文マスタにセットしたものです。例：{&#064;TO},C12345,GP.IT
    349         * ｛&#064;TO｝、｛&#064;CC｝、｛&#064;BCC｝はパラメータテーブルにセットしたもので置き換えます。
    350         * 分解後の配列には、ユーザーID及びグループIDが混在します。
    351         *
    352         * @param       csvId   csv形式のアドレス
    353         *
    354         * @return      送信先のアドレスの配列
    355         */
    356        private String[] getDstArray( final String csvId ){
    357                String[] csvArr = csv2ArrayOnly( csvId );
    358                ArrayList<String> list = new ArrayList<String>();
    359
    360                String[] tmp;
    361                int size = csvArr.length;
    362                for( int i = 0; i < size; i++ ){
    363                        if( csvArr[i].startsWith( "{@" )){
    364                                tmp = csv2ArrayOnly( paramMap.get( csvArr[i].substring( 2, csvArr[i].length() - 1 ) ) );
    365                                int len = tmp.length;
    366                                for(int j=0;j<len;j++){
    367                                        list.add( tmp[j] );
    368                                }
    369                        }
    370                        else{
    371                                list.add( csvArr[i]);
    372                        }
    373                }
    374                return list.toArray( new String[list.size()] );
    375        }
    376
    377        /**
    378         * 送信先のアドレス・マップを作成します。
    379         *　引数 dstBuf にはユーザーIDとグループID混在する配列です。
    380         *　ユーザーIDの場合、社員マスタのビューから名前及びメールアドレスを取得してマップにセットします。
    381         *　グループIDの場合、グループマスタより、名前及びメールアドレスを取得してマップにセットします。
    382         *　重複のユーザーが存在する場合、最後にセットした方が採用されます。
    383         *
    384         * @og.rev 5.1.0.0 (2009/11/04) MEMBER ⇒ ADDRESS カラム名変更
    385         *
    386         * @param       dstBuf  ユーザーIDとグループID混在する配列
    387         * @param       kbn             送信区分[0:TO/1:CC/2:BCC]
    388         *
    389         * @return      送信先のアドレス・マップ
    390         */
    391        private Map<String, String[]> getDstAddrMap( final String[] dstBuf, final int kbn ){
    392                Map<String,String[]> dstMap= new TreeMap<String,String[]>();
    393                 // IDX_DST_ID ,IDX_GROUP_ID, IDX_GROUP_NAME ,IDX_DST_NAME ,IDX_DST_ADDR ,IDX_DST_KBN ,IDX_FGJ
    394                 String[] dstInit = { "", "", "", "", "", Integer.toString( kbn ), "7" };
    395
    396                 int len = dstBuf.length;
    397                 for( int i=0; i < len; i++ ){
    398                         if( dstBuf[i].startsWith( PreFixGroup ) ) { // グループIDの場合、グループマスタより、メンバーを取得します。
    399                                String[][] groupUsers = getGroupUsers( dstBuf[i].substring( PreFixGroup.length() ) );
    400                                if( groupUsers.length > 0 ) {
    401                                        int memberCnt = groupUsers.length;
    402                                        for( int j = 0; j < memberCnt; j++ ) { // グループメンバーの処理
    403                                                String[] grpMember = dstInit.clone();
    404                                                grpMember[IDX_GROUP_ID]   = dstBuf[i].substring( PreFixGroup.length() ); // グループID
    405                                                grpMember[IDX_GROUP_NAME] = groupUsers[j][GE33_GNAME];          // グループ名
    406                                                grpMember[IDX_DST_ID]     = groupUsers[j][GE33_ADDRESS];        // 宛先ID
    407                                                grpMember[IDX_DST_NAME]   = groupUsers[j][GE33_MNAME];          // 宛先名
    408                                                if( groupUsers[j][GE33_ADDRESS].contains( "@" ) ) {             // メールアドレスがセットされる場合
    409                                                        grpMember[IDX_DST_ADDR] = groupUsers[j][GE33_ADDRESS];  //　メールアドレス
    410                                                }
    411                                                else { // 社員IDがセットされた場合
    412                                                        String[] userAddr = getUserInfo( groupUsers[j][GE33_ADDRESS] );
    413                                                        if ( userAddr != null && userAddr.length > 0 ){
    414                                                                grpMember[IDX_DST_ADDR] = userAddr[GE35_MAIL];          //　メールアドレス
    415                                                        }
    416                                                }
    417                                                if ( checkAddr( grpMember[IDX_DST_ID], grpMember[IDX_DST_ADDR] ) ){ // アドレス構文チェック
    418                                                        grpMember[IDX_FGJ] = AbstractMailManager.FGJ_SEND_WAIT;      // 送信待
    419                                                }
    420                                                else {
    421                                                        grpMember[IDX_FGJ] = AbstractMailManager.FGJ_ADDR_ERR;       // アドレス取得エラー
    422                                                        errAddrList.add( "アドレス取得エラー。ユーザーID：" + grpMember[IDX_DST_ID] + " アドレス：" + grpMember[IDX_DST_ADDR] );
    423                                                }
    424                                                dstMap.put( groupUsers[j][GE33_ADDRESS], grpMember );
    425                                        }
    426                                }
    427                                else { // グループマスタよりメンバー取得できない場合
    428                                        String[] emptyGp = dstInit.clone();
    429                                        emptyGp[IDX_GROUP_ID] = dstBuf[i]; // グループID
    430                                        emptyGp[IDX_GROUP_NAME] = "*"; // グループID
    431                                        emptyGp[IDX_DST_ID] = "NO-MEMBER"; // 宛先ID
    432                                        dstMap.put( dstBuf[i], emptyGp );
    433                                }
    434                        }
    435                        else { // ユーザーIDの場合
    436                                String[] indMember = dstInit.clone();
    437                                indMember[IDX_DST_ID] = dstBuf[i];                                                      // 宛先ID
    438                                indMember[IDX_GROUP_ID] = "*";                                                          // グループID
    439                                indMember[IDX_GROUP_NAME] = "*";                                                        // グループID
    440                                String[] userAddr = getUserInfo( dstBuf[i] );
    441                                if ( userAddr != null && userAddr.length > 0 ){
    442                                        indMember[IDX_DST_NAME] = userAddr[GE35_NAME];                  // 宛先名
    443                                        indMember[IDX_DST_ADDR] = userAddr[GE35_MAIL];                  //　メールアドレス
    444                                        if ( checkAddr( indMember[IDX_DST_ID], userAddr[1] ) ) {
    445                                                indMember[IDX_FGJ] = AbstractMailManager.FGJ_SEND_WAIT;
    446                                        }
    447                                        else {
    448                                                indMember[IDX_FGJ] = AbstractMailManager.FGJ_ADDR_ERR;
    449                                                errAddrList.add( "アドレス取得エラー。ユーザーID：" + indMember[IDX_DST_ID] + " アドレス：" + indMember[IDX_DST_ADDR] );
    450                                        }
    451
    452                                }
    453                                else {
    454                                        indMember[IDX_FGJ] = AbstractMailManager.FGJ_ADDR_ERR; // 状況コード
    455                                }
    456                                dstMap.put( dstBuf[i], indMember );
    457                        }
    458                }
    459                 return dstMap;
    460        }
    461
    462        /**
    463         * グループマスタより、ユーザー情報を取得します。
    464         * 戻り値の配列には、ユーザーIDまたはメールアドレス、ユーザー名、グループ名が格納されています。
    465         *
    466         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    467         *
    468         * @param       groupId グループID
    469         *
    470         * @return      ユーザー情報
    471         */
    472        private String[][] getGroupUsers( final String groupId ){
    473                String sysId = paramMap.get( "SYSTEM_ID" );
    474                String[] ge33SelArgs = { sysId,groupId };
    475                String[][] ge33Datas = DBUtil.dbExecute( selGE33,ge33SelArgs,AbstractMailManager.appInfo, DBID );               // 5.5.5.1 (2012/08/07)
    476
    477                if ( ge33Datas.length == 0 ) {
    478                        String errMsg = "グループ情報取得できません。グループID：" + groupId ;
    479                        if( "true".equals( paramMap.get( "ADDR_CHECK" ) ) ){
    480                                throw new RuntimeException( errMsg );
    481                        }
    482                        else {
    483                                errAddrList.add( errMsg );
    484                        }
    485                }
    486                return ge33Datas;
    487        }
    488
    489        /**
    490         * メール送信ホストを返します。
    491         * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの HOST を取得します。
    492         * 振り分け条件が未設定の場合は、システム定数のCOMMON_MAIL_SERVER を使用します。
    493         *
    494         * (初期値:システム定数のCOMMON_MAIL_SERVER[={@og.value org.opengion.hayabusa.common.SystemData#COMMON_MAIL_SERVER}])。
    495         *
    496         * @og.rev 5.6.6.0 (2013/07/05)
    497         *
    498         * @return      メール送信ホスト
    499         */
    500        public String getHost(){
    501                return host;
    502        }
    503
    504        /**
    505         * メール送信ポート番号を返します
    506         * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの PORT を取得します。
    507         * 振り分け条件が未設定の場合は、システム定数のSMTP_PORT を使用します。
    508         *
    509         * (初期値:システム定数のSMTP_PORT[={@og.value org.opengion.hayabusa.common.SystemData#SMTP_PORT}])。
    510         *
    511         * @og.rev 5.6.6.0 (2013/07/05)
    512         *
    513         * @return      メール送信ポート番号
    514         */
    515        public String getSmtpPort(){
    516                return smtpPort;
    517        }
    518
    519        /**
    520         * メール送信時認証有無を返します
    521         * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの AUTH を取得します。
    522         * 振り分け条件が未設定の場合は、システム定数のMAIL_SEND_AUTH を使用します。
    523         *
    524         * (初期値:システム定数のMAIL_SEND_AUTH[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH}])。
    525         *
    526         * @og.rev 5.6.6.0 (2013/07/05)
    527         *
    528         * @return      メール送信時認証有無
    529         */
    530        public String getAuth(){
    531                return auth;
    532        }
    533
    534        /**
    535         * メール送信認証ユーザを返します
    536         * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの AUTHUSER を取得します。
    537         * 振り分け条件が未設定の場合は、システム定数のMAIL_SEND_AUTH_USER を使用します。
    538         *
    539         * (初期値:システム定数のMAIL_SEND_AUTH_USER[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH_USER}])。
    540         *
    541         * @og.rev 5.6.6.0 (2013/07/05)
    542         *
    543         * @return      メール送信認証ユーザ
    544         */
    545        public String getAuthUser(){
    546                return authUser;
    547        }
    548
    549        /**
    550         * メール送信認証パスワードを返します
    551         * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの AUTHPASS を取得します。
    552         * 振り分け条件が未設定の場合は、システム定数のMAIL_SEND_AUTH_PASSWORD を使用します。
    553         *
    554         * (初期値:システム定数のMAIL_SEND_AUTH_PASSWORD[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH_PASSWORD}])。
    555         *
    556         * @og.rev 5.6.6.0 (2013/07/05)
    557         *
    558         * @return      メール送信認証パスワード
    559         */
    560        public String getAuthPass(){
    561                return authPass;
    562        }
    563
    564        /**
    565         * アドレスの構文チェックを行います、合法の場合は'true'(取得できた)、違法の場合は'false'(有効アドレス取得できず)を返します。
    566         *
    567         * @param   userId  ユーザーID
    568         * @param   address アドレス
    569         *
    570         * @return  アドレスの構文チェック結果(true:取得/false:取得できず)
    571         */
    572        private boolean checkAddr( final String userId, final String address ) {
    573                boolean rtn = true;
    574                try {
    575                        new InternetAddress( address );
    576                }
    577                catch ( AddressException aep ) {
    578                        if ( "true".equals( paramMap.get( "ADDR_CHECK" ) ) ) {
    579                                String errMsg = "ユーザーメールアドレスエラー。ユーザーID：" + userId + " アドレス：" + address;
    580                                throw new RuntimeException( errMsg,aep );
    581                        }
    582                        rtn = false;
    583                }
    584                return rtn;
    585        }
    586
    587        /**
    588         * 引数の配列から文書を合成します。
    589         * src[0]に配列には定数文字列、src[1]にはパラメータ
    590         *
    591         * @param       src     引数の配列
    592         *
    593         * @return      合成された文章
    594         */
    595        private String marge( final String[][] src ){
    596                StringBuilder rtnBuf = new StringBuilder();
    597                String rtn;
    598                if ( src != null ){
    599                        int len = src[1].length;
    600                        for(int i=0; i< len; i++) {
    601                                rtnBuf.append( src[0][i] );
    602                                rtnBuf.append( paramMap.get( src[1][i] ) );
    603                        }
    604                        rtnBuf.append( src[0][len] );
    605                        rtn = rtnBuf.toString();
    606                }
    607                else {
    608                        rtn = null;
    609                }
    610
    611                return rtn;
    612        }
    613
    614        /**
    615         * 宛先(TO、CC、BCC)のID、名前、メールアドレスをパラメータマップにセットします。
    616         *
    617         */
    618        private void setDstWord() {
    619                StringBuilder to_id    = new StringBuilder();
    620                StringBuilder to_name  = new StringBuilder();
    621                StringBuilder to_addr  = new StringBuilder();
    622                StringBuilder cc_id    = new StringBuilder();
    623                StringBuilder cc_name  = new StringBuilder();
    624                StringBuilder cc_addr  = new StringBuilder();
    625                StringBuilder bcc_id   = new StringBuilder();
    626                StringBuilder bcc_name = new StringBuilder();
    627                StringBuilder bcc_addr = new StringBuilder();
    628                int kbn;
    629                for( String dstId : mailDstMap.keySet() ) {
    630                        kbn = Integer.parseInt( mailDstMap.get( dstId )[IDX_DST_KBN]);
    631                        switch( kbn ) {
    632                                case KBN_TO:
    633                                        to_id.append( ',' ).append( dstId );
    634                                        to_name.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] );
    635                                        to_addr.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] );
    636                                        to_addr.append( '<' ).append( mailDstMap.get( dstId )[IDX_DST_ADDR] ).append( ">" );
    637                                        break;
    638                                case KBN_CC:
    639                                        cc_id.append( ',' ).append( dstId );
    640                                        cc_name.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] );
    641                                        cc_addr.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] );
    642                                        cc_addr.append( '<' ).append( mailDstMap.get( dstId )[IDX_DST_ADDR] ).append( ">" );
    643                                        break;
    644                                case KBN_BCC:
    645                                        bcc_id.append( ',' ).append( dstId );
    646                                        bcc_name.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] );
    647                                        bcc_addr.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] );
    648                                        bcc_addr.append( '<' ).append( mailDstMap.get( dstId )[IDX_DST_ADDR] ).append( ">" );
    649                                        break;
    650                                default:
    651                                        String errMsg = "このアドレス区分がサポートされません。区分：" + kbn;
    652                                        throw new RuntimeException( errMsg );
    653                        }
    654                }
    655                // 予約語マップに追加します。
    656                paramMap.put( "TO_ID"   , ( to_id.length()    > 0 ) ? to_id.toString().substring( 1 )   :"" );
    657                paramMap.put( "TO_NAME" , ( to_name.length()  > 0 ) ? to_name.toString().substring( 1 ) :"" );
    658                paramMap.put( "TO_ADDR" , ( to_addr.length()  > 0 ) ? to_addr.toString().substring( 1 ) :"" );
    659                paramMap.put( "CC_ID"   , ( cc_id.length()    > 0 ) ? cc_id.toString().substring( 1 )   :"" );
    660                paramMap.put( "CC_NAME" , ( cc_name.length()  > 0 ) ? cc_name.toString().substring( 1 ) :"" );
    661                paramMap.put( "CC_ADDR" , ( cc_addr.length()  > 0 ) ? cc_addr.toString().substring( 1 ) :"" );
    662                paramMap.put( "BCC_ID"  , ( bcc_id.length()   > 0 ) ? bcc_id.toString().substring( 1 )  :"" );
    663                paramMap.put( "BCC_NAME", ( bcc_name.length() > 0 ) ? bcc_name.toString().substring( 1 ):"" );
    664                paramMap.put( "BCC_ADDR", ( bcc_addr.length() > 0 ) ? bcc_addr.toString().substring( 1 ):"" );
    665        }
    666
    667        /**
    668         * 社員マスタより名前、メールアドレスを取得します。
    669         * 戻り値 rtn[0]:ユーザー名、 rtn[1]:ユーザーメールアドレス
    670         *
    671         * @og.rev 4.3.6.6 (2009/05/15) メールアドレスが直接指定された場合に対応
    672         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    673         *
    674         * @param   userId  ユーザーID
    675         *
    676         * @return      配列文字列(rtn[0]:ユーザー名、 rtn[1]:ユーザーメールアドレス)
    677         */
    678        private String[] getUserInfo( final String userId ){
    679                String[] rtn = null;
    680
    681                if ( userId.contains( "@" ) ) {
    682                        rtn = new String[2];
    683                        rtn[0] = "";
    684                        rtn[1] = userId;
    685                }
    686                else {
    687                        String[] ge35SelArgs = { userId };
    688                        String[][] ge35Datas = DBUtil.dbExecute( selGE35,ge35SelArgs,AbstractMailManager.appInfo, DBID );               // 5.5.5.1 (2012/08/07)
    689                        if ( ge35Datas.length > 0) {
    690                                rtn = ge35Datas[0];
    691                        }
    692                        else {
    693                                String errMsg = "ユーザー情報取得できません。ユーザーID：" + userId ;
    694                                if( "true".equals( paramMap.get( "ADDR_CHECK" ) ) ){
    695                                        throw new RuntimeException( errMsg );
    696                                }
    697                                else {
    698                                        errAddrList.add( errMsg );
    699                                }
    700                        }
    701                }
    702                return rtn;
    703        }
    704}