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