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