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.nval;
019    
020    import java.util.List;
021    import java.util.ArrayList;
022    import java.util.HashMap;
023    import java.util.Map;
024    
025    import javax.mail.Address;
026    import javax.mail.SendFailedException;
027    import javax.mail.internet.InternetAddress;
028    
029    import org.opengion.fukurou.db.DBUtil;
030    import org.opengion.fukurou.mail.MailTX;
031    import org.opengion.fukurou.util.ApplicationInfo;
032    import org.opengion.hayabusa.common.HybsSystem;
033    
034    /**
035     * タグ mailSender2 及ã?バッチによる送信の共通å?ç�?ƒ¨åˆ?‚’実è£?�—てã�?�¾すã?
036     * 送信タグ mailSender2 もしくã?送信ãƒ??モンからパラメータを受取りますã?
037     * パラメータ中の定型文ID及ã?シスãƒ?ƒ IDで定型æ–??スタよりメールの定型æ–?‚’取得してã€?
038     * パラメータ値とマã?ジしてメールæ–?‚’合æ?しますã?同時に、宛å?にセãƒ?ƒˆした社員IDã€?
039     * グループIDと定型æ–??宛å?設定に基づきã?社員マスタとグループã?スタよりメールアドレス
040     * æƒ??を取得して送信を行いますã?
041     * エラーがなければ送信したå†?®¹を履歴ãƒ??ブル、宛å?ãƒ??ブルに書き込みますã?
042     * æœ?¾Œに本処ç�??呼出å…?�«送信結果、エラーメãƒ?‚»ージを返しますã?
043     *
044     * @og.group メールモジュール
045     *
046     * @version  4.0
047     * @author   Sen.Li
048     * @since    JDK1.6
049     */
050    public abstract class AbstractMailManager {
051    
052            // 5.2.0.0 (2010/09/01) Ver4互換モード対å¿?
053            private static final String CONTENTS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "CONTENT" : "CONTENTS";
054    
055            private static final String     selYkno = "SELECT GE32S02.NEXTVAL YKNO FROM DUAL";
056            // 5.0.3.0 (2009/11/04) CONTENT �CONTENTS
057            // 5.2.0.0 (2010/09/01) Ver4互換モード対å¿?
058    //      private static final String     insGE32         = "INSERT INTO GE32(YKNO,PARA_KEY,PTN_ID,FROM_ADDR,TITLE,CONTENTS,ATTACH1,ATTACH2,ATTACH3,ATTACH4,ATTACH5,DYSET,USRSET,PGUPD,SYSTEM_ID,FGJ)"
059            private static final String     insGE32         = "INSERT INTO GE32(YKNO,PARA_KEY,PTN_ID,FROM_ADDR,TITLE,"+CONTENTS+",ATTACH1,ATTACH2,ATTACH3,ATTACH4,ATTACH5,DYSET,USRSET,PGUPD,SYSTEM_ID,FGJ)"
060                                                                                            + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'1')";
061            private static final String insGE34             = "INSERT INTO GE34(YKNO,DST_ID,GROUP_ID,DST_NAME,DST_ADDR,DST_KBN,FGJ,DYSET,USRSET,PGUPD)"
062                                                                                            + " VALUES(?,?,?,?,?,?,?,?,?,?)";
063            /** フラグ定数 {@value} */
064            protected static final String FGJ_SEND_WAIT     = "0";
065            /** フラグ定数 {@value} */
066            protected static final String FGJ_SEND_OVER     = "1";
067            /** フラグ定数 {@value} */
068            protected static final String FGJ_ADDR_ERR      = "7";
069            /** フラグ定数 {@value} */
070            protected static final String FGJ_ACNT_ERR      = "8";
071    
072            // å†?ƒ¨ãƒ??タのカラãƒ?•ª号(履歴ãƒ??ブル)
073            private static final int GE32_YKNO              = 0 ;
074            private static final int GE32_PARAKEY   = 1 ;
075            private static final int GE32_PTN_ID    = 2;
076            private static final int GE32_FROM_ADDR = 3;
077            private static final int GE32_TITLE     = 4;
078            private static final int GE32_CONTENTS  = 5;            // 5.0.3.0 (2009/11/04) CONTENT �CONTENTS
079            private static final int GE32_ATTACH1   = 6;
080            private static final int GE32_ATTACH2   = 7;
081            private static final int GE32_ATTACH3   = 8;
082            private static final int GE32_ATTACH4   = 9;
083            private static final int GE32_ATTACH5   = 10;
084            private static final int GE32_DYSET             = 11;
085            private static final int GE32_USRSET    = 12;
086            private static final int GE32_PGUPD     = 13;
087            private static final int GE32_SYSTEM_ID = 14;
088            // å†?ƒ¨ãƒ??タのカラãƒ?•ª号(履歴ãƒ??ブル)
089            private static final int GE34_YKNO              = 0 ;
090            private static final int GE34_DST_ID    = 1 ;
091            private static final int GE34_GROUP_ID  = 2 ;
092            private static final int GE34_DST_NAME  = 3 ;
093            private static final int GE34_DST_ADDR  = 4 ;
094            private static final int GE34_DST_KBN   = 5 ;
095            private static final int GE34_FGJ               = 6 ;
096            private static final int GE34_DYSET             = 7 ;
097            private static final int GE34_USRSET    = 8 ;
098            private static final int GE34_PGUPD     = 9 ;
099    //      private static String           host            = HybsSystem.sys( "COMMON_MAIL_SERVER" );
100            private static String           charset         = HybsSystem.sys( "MAIL_DEFAULT_CHARSET" );
101    //      private static String           smtpPort        = HybsSystem.sys( "SMTP_PORT" );                                // 5.4.3.2 (2012/01/06)
102    //      private static String           auth            = HybsSystem.sys( "MAIL_SEND_AUTH" );                   // 5.4.3.2 (2012/01/06)
103    //      private static String           authUser        = HybsSystem.sys( "MAIL_SEND_AUTH_USER" );              // 5.4.3.2 (2012/01/06)
104    //      private static String           authPass        = HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" );  // 5.4.3.2 (2012/01/06)
105            private boolean                         debugFlag   = false;
106            private final List<String>        errAddrList = new ArrayList<String>();
107            private static final int MAX_RETRY              = 3 ;   // メールアドレスエラー発生したå?合ã?メール再é?回数
108    
109            // 5.6.6.0 (2013/07/05) host等ã?外部æŒ?®šに対å¿?
110            private String          host            = HybsSystem.sys( "COMMON_MAIL_SERVER" );               // 5.6.6.0 (2013/07/05)
111            private String          smtpPort        = HybsSystem.sys( "SMTP_PORT" );                                // 5.6.6.0 (2013/07/05)
112            private String          auth            = HybsSystem.sys( "MAIL_SEND_AUTH" );                   // 5.6.6.0 (2013/07/05)
113            private String          authUser        = HybsSystem.sys( "MAIL_SEND_AUTH_USER" );              // 5.6.6.0 (2013/07/05)
114            private String          authPass        = HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" );  // 5.6.6.0 (2013/07/05)
115    
116            private String  mailTitle, mailContent, fromAddr;
117            private String[] attachFiles;
118            private Map<String, String[]>     mailDstMap              = null;
119            private Map<String,String>                initParamMap    = null;         // パラメータマッãƒ?
120            private MailTX                                  mail                    = null;
121    
122            protected final String DBID = HybsSystem.sys( "RESOURCE_DBID" );                // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対å¿?
123    
124            /** コネクションにアプリケーションæƒ??を追記するかどã�?�‹æŒ?®?*/
125            private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
126    
127            /** アプリケーションæƒ?? */
128            public static final ApplicationInfo appInfo;
129            static {
130                    if( USE_DB_APPLICATION_INFO ) {
131                            appInfo = new ApplicationInfo();
132                            // ユーザーID,IPアドレス,ホスト名
133                            appInfo.setClientInfo( "MailModuel", HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME );
134                            // 画面ID,操ä½?プログラãƒ?D
135                            appInfo.setModuleInfo( "MailModuel", "MailManager", "MailManager" );
136                    }
137                    else {
138                            appInfo = null;
139                    }
140            }
141    
142            /**
143             * 呼出å…?‚ˆりパラメータマップを受取って、メールオブジェクãƒ?mailObj)を作æ?しますã?
144             * メールオブジェクトã?定型文ID及ã?シスãƒ?ƒ IDに基づã�?�¦定型æ–??スタからメールの定型æ–?‚’取得してã€?
145             * パラメータ値とマã?ジしてメールæ–??å�??目を合成しますã?
146             * 宛å?につã�?�¦は、宛å?にセãƒ?ƒˆした社員ID、グループIDと定型æ–??宛å?設定に基づきã?社員マスタとグループã?スタ
147             * よりメールアドレスを取得して宛å?マップを作æ?しますã?
148             * まã�??添付ファイルのセãƒ?ƒˆ処ç�?‚‚行ってã�?�¾すã?
149             * 
150             * @og.rev 5.6.6.0 (2013/07/05) host等ã?外部設定対å¿?
151             *
152             * @param       params  パラメータのマッãƒ?
153             */
154            public void create( final Map<String, String> params ) {
155                    initParamMap = params;
156                    MailPattern mailObj = new MailPattern( params );
157                    fromAddr = mailObj.getFromAddr();
158                    setAttachFiles( params.get( "ATTACH1" )
159                                              , params.get( "ATTACH2" )
160                                              , params.get( "ATTACH3" )
161                                              , params.get( "ATTACH4" )
162                                              , params.get( "ATTACH5" ) ); // 添付ファイルのセãƒ?ƒˆ
163                    mailDstMap = mailObj.getDstMap();
164                    mailTitle = mailObj.getTitle();
165                    mailContent = mailObj.getContent();
166                    errAddrList.addAll( mailObj.getErrList() );
167                    
168                    // 5.6.6.0 (2013/07/05)
169                    host            = nval( mailObj.getHost()               ,host           );
170                    smtpPort        = nval( mailObj.getSmtpPort()   ,smtpPort       );
171                    auth            = nval( mailObj.getAuth()               ,auth           );
172                    authUser        = nval( mailObj.getAuthUser()   ,authUser       );
173                    authPass        = nval( mailObj.getAuthPass()   ,authPass       );
174            }
175    
176            /**
177             * メール送信を行うメソãƒ?ƒ‰ですã?
178             * createメソãƒ?ƒ‰より合æ?したå†?®¹で送信を行いますã?アドレスエラー発生時にã€?
179             * ユーザー設å®?addrCheck)により再é?/中止しますã?
180             * メールサーバã?に送信して、例å¤?SendFailedException"をキャãƒ?ƒ�できたらã?
181             * メールアカウントがエラーとなるã?をå?かりますã?そして、例外ã?オブジェクトかã‚?
182             * エラーとなってã�?‚‹アカウントを取得して宛å?マップから除外して、残りのアドレスに再é?できますã?
183             * 送信後履歴ãƒ??ブル(GE32)、宛å?ãƒ??ブル(GE34)に送信結果を書き込みますã?
184             *
185             * og.rev 5.4.3.2 (2012/01/06) 送信時認証対å¿?
186             *
187             */
188            public void send() {
189                    List<String> invalidAddrBuf       = new ArrayList<String>();
190                    // mail = new MailTX( host, charset );
191                    mail = new MailTX( host, charset, smtpPort, auth, authUser, authPass ); // 5.4.3.2 認証対å¿?
192                    mail.setFrom( fromAddr );                       // 送信è€?‚¢ドレス
193                    mail.setFilename( attachFiles );        // 添付ファイルをセãƒ?ƒˆしますã?
194                    mail.setSubject( mailTitle );           // メールタイトル
195                    mail.setMessage( mailContent );         // メール本æ–?
196                    mail.setDebug( debugFlag );
197                    setMailDst( invalidAddrBuf );           // 宛å?をセãƒ?ƒˆしますã?
198                    // メール送信を行いますã?
199                    int retryCount = MAX_RETRY;
200                    while( retryCount > 0 ) {
201                            try {
202                                    mail.sendmail();
203                            }
204                            catch( RuntimeException rex ) {
205                                    Throwable cause = rex.getCause();
206                                    if( cause instanceof SendFailedException ) {
207                                            Address[] invAddress = ( (SendFailedException) cause ).getInvalidAddresses();
208                                            if( invAddress != null ) {
209                                                    int invCount = invAddress.length;
210                                                    for( int i = 0; i < invCount; i++ ) {
211                                                            invalidAddrBuf.add( ( (InternetAddress) invAddress[i] ).getAddress() );
212                                                    }
213                                            }
214                                    }
215                                    else {
216                                            String errMsg = "送信時にエラー発生しましたã€? + rex.getMessage();
217                                            throw new RuntimeException( errMsg,rex );
218                                    }
219                            }
220    
221    //                      if( invalidAddrBuf.size() > 0 ) {
222    //                              StringBuilder errMsgBuf = new StringBuilder();
223    //                              for( int i = 0; i < invalidAddrBuf.size(); i++ ) {
224    //                                      errMsgBuf.append( "," ).append( invalidAddrBuf.get( i ) );
225    //                              }
226    //                              String userIds = getUserIds( invalidAddrBuf );
227    //                              String errMsg = "アドレスエラー。ユーザーID?? + userIds + " アドレス?? + errMsgBuf.toString().substring( 1 );
228    //                              if( "true".equals( initParamMap.get( "ADDR_CHECK" ) ) ){
229    //                                      throw new RuntimeException( errMsg );
230    //                              }
231    //                              else {
232    //                                      // メールアカウントチェãƒ?‚¯しなã�??合ã?無効のメールアドレスを除ã�?�¦再é?しますã?
233    //                                      setMailDst( invalidAddrBuf );
234    //                                      retryCount--;
235    //                                      invalidAddrBuf.clear();
236    //                                      errAddrList.add( errMsg );
237    //                              }
238    //                      }
239    //                      else {
240    //                              retryCount = -1;
241    //                      }
242    
243                            if( invalidAddrBuf.isEmpty() ) {
244                                    retryCount = -1;
245                            }
246                            else {
247                                    StringBuilder errMsgBuf = new StringBuilder();
248                                    for( int i = 0; i < invalidAddrBuf.size(); i++ ) {
249                                            errMsgBuf.append( ',' ).append( invalidAddrBuf.get( i ) );
250                                    }
251                                    String userIds = getUserIds( invalidAddrBuf );
252                                    String errMsg = "アドレスエラー。ユーザーID?? + userIds + " アドレス?? + errMsgBuf.toString().substring( 1 );
253                                    if( "true".equals( initParamMap.get( "ADDR_CHECK" ) ) ){
254                                            throw new RuntimeException( errMsg );
255                                    }
256                                    else {
257                                            // メールアカウントチェãƒ?‚¯しなã�??合ã?無効のメールアドレスを除ã�?�¦再é?しますã?
258                                            setMailDst( invalidAddrBuf );
259                                            retryCount--;
260                                            invalidAddrBuf.clear();
261                                            errAddrList.add( errMsg );
262                                    }
263                            }
264                    }
265                    commitMailDB();         // 送信結果を履歴ãƒ??ブル、宛å?ãƒ??ブルにセãƒ?ƒˆしますã?
266            }
267    
268            /**
269             * ãƒ?ƒ�ãƒ?‚°æƒ??の表示を行うかどã�?�‹[true/false]をセãƒ?ƒˆしますã?
270             *
271             * @param   debug  [true:出力すã‚?それ以å¤?しない]
272             */
273            public void setDebug( final boolean debug ) {
274                    debugFlag = debug;
275            }
276    
277            /**
278             * メール送信è€?‚¢ドレスをセãƒ?ƒˆしますã?
279             *
280             * @param  from 送信è€?‚¢ドレス
281             */
282            public void setFromAddr( final String from ) {
283                    fromAddr = from;
284            }
285    
286            /**
287             * メールタイトルをセãƒ?ƒˆしますã?
288             *
289             * @param  title メールタイトル
290             */
291            public void setTitle( final String title ) {
292                    mailTitle = title;
293            }
294    
295            /**
296             * メール本æ–?‚’セãƒ?ƒˆしますã?
297             *
298             * @param  content メール本æ–?
299             */
300            public void setContent( final String content ) {
301                    mailContent = content;
302            }
303    
304            /**
305             * メール送信ホストをセãƒ?ƒˆしますã?
306             * 初期値は、シスãƒ?ƒ 定数のCOMMON_MAIL_SERVER を使用しますã?
307             *
308             * (初期値:シスãƒ?ƒ 定数のCOMMON_MAIL_SERVER[={@og.value org.opengion.hayabusa.common.SystemData#COMMON_MAIL_SERVER}])ã€?
309             * 
310             * @og.rev 5.6.6.0 (2013/07/05)
311             *
312             * @param  hostName 送信ホスãƒ?
313             */
314            public void setHost( final String hostName ) {
315                    host = nval( hostName, host );
316            }
317    
318            /**
319             * メール送信ポã?ト番号をセãƒ?ƒˆしますã?
320             * 初期値は、シスãƒ?ƒ 定数のSMTP_PORT を使用しますã?
321             *
322             * (初期値:シスãƒ?ƒ 定数のSMTP_PORT[={@og.value org.opengion.hayabusa.common.SystemData#SMTP_PORT}])ã€?
323             * 
324             * @og.rev 5.6.6.0 (2013/07/05)
325             * 
326             * @param  port SMTPポã?ãƒ?
327             */
328            public void setPort( final String port ) {
329                    smtpPort = nval( port, smtpPort );
330            }
331    
332            /**
333             * メール送信時認証有無をセãƒ?ƒˆしますã?
334             * 認証を行う場合ã?「POP_BEFORE_SMTP」とæŒ?®šして下さã�??
335             * 認証時には認証ユーザと認証パスワードを設定するå¿?¦�がありますã?
336             * 初期値は、シスãƒ?ƒ 定数のMAIL_SEND_AUTH を使用しますã?
337             *
338             * (初期値:シスãƒ?ƒ 定数のMAIL_SEND_AUTH[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH}])ã€?
339             * 
340             * @og.rev 5.6.6.0 (2013/07/05)
341             * 
342             * @param  useAuth 認証方å¼?
343             */
344            public void setAuth( final String useAuth ) {
345                    auth = nval( useAuth, auth );
346            }
347    
348            /**
349             * メール送信認証ユーザをセãƒ?ƒˆしますã?
350             * 初期値は、シスãƒ?ƒ 定数のMAIL_SEND_AUTH_USER を使用しますã?
351             *
352             * (初期値:シスãƒ?ƒ 定数のMAIL_SEND_AUTH_USER[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH_USER}])ã€?
353             * 
354             * @og.rev 5.6.6.0 (2013/07/05)
355             * 
356             * @param  user 認証ユーザ
357             */
358            public void setAuthUser( final String user ) {
359                    authUser = nval( user, authUser );
360            }
361    
362            /**
363             * メール送信認証パスワードをセãƒ?ƒˆしますã?
364             * 初期値は、シスãƒ?ƒ 定数のMAIL_SEND_AUTH_PASSWORD を使用しますã?
365             *
366             * (初期値:シスãƒ?ƒ 定数のMAIL_SEND_AUTH_PASSWORD[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH_PASSWORD}])ã€?
367             * 
368             * @og.rev 5.6.6.0 (2013/07/05)
369             * 
370             * @param  pass 認証パスワーãƒ?
371             */
372            public void setAuthPass( final String pass ) {
373                    authPass = nval( pass, authPass );
374            }
375    
376            /**
377             * メール送信è€?‚¢ドレスを返しますã?
378             *
379             * @return      送信è€?‚¢ドレス
380             */
381            public String getFromAddr() {
382                    return fromAddr;
383            }
384    
385            /**
386             * メールタイトルを返しますã?
387             *
388             * @return      メールタイトル
389             */
390            public String getTitle() {
391                    return mailTitle;
392            }
393    
394            /**
395             * メール本æ–?‚’返しますã?
396             *
397             * @return      メール本æ–?
398             */
399            public String getContent() {
400                    return mailContent;
401            }
402    
403            /**
404             * 送信結果を履歴ãƒ??ブル(GE32)と宛å?ãƒ??ブル(GE34)に登録しますã?
405             * 登録時に、桁数オーバã?にならなã�?‚ˆã�?�«、テーブル定義の桁数を上限としてã€?
406             * 登録前にå�??目の桁数整ç�?‚’行いますã?
407             *
408             * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対ç­?
409             */
410            protected void commitMailDB(){
411                    // 履歴ãƒ??ブルの追åŠ?
412                    String[] insGE32Args = new String[15];
413                    String ykno = getYkno();
414                    insGE32Args[GE32_YKNO]          = ykno;
415                    insGE32Args[GE32_PARAKEY]       = initParamMap.get( "PARAKEY" );
416                    insGE32Args[GE32_PTN_ID]        = trim( initParamMap.get( "PTN_ID" ), 20 );
417                    insGE32Args[GE32_FROM_ADDR] = trim( fromAddr, 100);
418                    insGE32Args[GE32_TITLE]         = trim( mailTitle, 300);
419                    insGE32Args[GE32_CONTENTS]      = trim( mailContent,4000);              // 5.0.3.0 (2009/11/04) CONTENT �CONTENTS
420                    insGE32Args[GE32_ATTACH1]       = "";
421                    insGE32Args[GE32_ATTACH2]       = "";
422                    insGE32Args[GE32_ATTACH3]       = "";
423                    insGE32Args[GE32_ATTACH4]       = "";
424                    insGE32Args[GE32_ATTACH5]       = "";
425                    if ( attachFiles != null ) {
426                            int attSize = attachFiles.length;
427                            for( int i = 0; i < attSize; i++ ) {
428                                    insGE32Args[6 + i] = trim( attachFiles[i], 256);
429                            }
430                    }
431                    insGE32Args[GE32_DYSET]  = HybsSystem.getDate( "yyyyMMddHHmmss" );
432                    insGE32Args[GE32_USRSET] = initParamMap.get( "LOGIN_USERID" );
433                    insGE32Args[GE32_PGUPD] = initParamMap.get( "PGID" );
434                    insGE32Args[GE32_SYSTEM_ID] = initParamMap.get( "SYSTEM_ID" );
435    //              DBUtil.dbExecute( insGE32, insGE32Args, appInfo );
436                    DBUtil.dbExecute( insGE32, insGE32Args, appInfo, DBID );        // 5.5.5.1 (2012/08/07)
437    
438                    // 宛å?ãƒ??ブル追åŠ?
439                    String[] insGE34Args = new String[10];
440                    insGE34Args[GE34_YKNO]= ykno;
441                    for( String dstId : mailDstMap.keySet() ) {
442                            insGE34Args[GE34_DST_ID]        = trim( mailDstMap.get( dstId )[MailPattern.IDX_DST_ID]  , 10 );
443                            insGE34Args[GE34_GROUP_ID]      = trim( mailDstMap.get( dstId )[MailPattern.IDX_GROUP_ID], 20 );
444                            insGE34Args[GE34_DST_NAME]      = trim( mailDstMap.get( dstId )[MailPattern.IDX_DST_NAME], 20 );
445                            insGE34Args[GE34_DST_ADDR]      = trim( mailDstMap.get( dstId )[MailPattern.IDX_DST_ADDR], 100 );
446                            insGE34Args[GE34_DST_KBN]       = mailDstMap.get( dstId )[MailPattern.IDX_DST_KBN];
447                            insGE34Args[GE34_FGJ]           = mailDstMap.get( dstId )[MailPattern.IDX_FGJ];
448                            insGE34Args[GE34_DYSET]         = HybsSystem.getDate( "yyyyMMddHHmmss" );
449                            insGE34Args[GE34_USRSET]        = initParamMap.get( "LOGIN_USERID" );
450                            insGE34Args[GE34_PGUPD]         = initParamMap.get( "PGID" );
451    //                      DBUtil.dbExecute( insGE34, insGE34Args, appInfo );
452                            DBUtil.dbExecute( insGE34, insGE34Args, appInfo, DBID );                // 5.5.5.1 (2012/08/07)
453                    }
454            }
455    
456            /**
457             * パラメータマップをセãƒ?ƒˆしますã?
458             *
459             * @param       params  パラメータのマッãƒ?
460             */
461            protected void setInitParams( final Map<String, String> params ) {
462                    initParamMap = params;
463            }
464    
465            /**
466             * 添付ファイル配å?をセãƒ?ƒˆしますã?
467             *
468             * @param       attach1 添付ファイルå�?
469             * @param       attach2 添付ファイルå�?
470             * @param       attach3 添付ファイルå�?
471             * @param       attach4 添付ファイルå�?
472             * @param       attach5 添付ファイルå�?
473             */
474            protected void setAttachFiles( final String attach1
475                                                                    , final String attach2
476                                                                    , final String attach3
477                                                                    , final String attach4
478                                                                    , final String attach5 ) {
479                    List<String> fileList = new ArrayList<String>();
480                    if( attach1 != null && attach1.length() != 0 ) { fileList.add( attach1 ); }
481                    if( attach2 != null && attach2.length() != 0 ) { fileList.add( attach2 ); }
482                    if( attach3 != null && attach3.length() != 0 ) { fileList.add( attach3 ); }
483                    if( attach4 != null && attach4.length() != 0 ) { fileList.add( attach4 ); }
484                    if( attach5 != null && attach5.length() != 0 ) { fileList.add( attach5 ); }
485                    attachFiles = fileList.toArray( new String[fileList.size()] );
486            }
487    
488            /**
489             * メール宛å?マップをセãƒ?ƒˆしますã?
490             *
491             * @param   mailDst     メール宛å?マッãƒ?
492             */
493            protected void setMailDstMap( final Map<String, String[]> mailDst ) {
494                    mailDstMap = mailDst;
495            }
496    
497            /**
498             * メール宛å?マップをセãƒ?ƒˆしますã?
499             *
500             * @return      メール宛å?マッãƒ?
501             */
502            protected Map<String, String[]> getMailDstMap() {
503                    return mailDstMap;
504            }
505    
506            /**
507             * æŒ?®šã?長さ以å†??æ–?­—å?を返しますã?
508             *
509             * @param       src             オリジナルのæ–?­—å?
510             * @param       maxLen  æŒ?®šã?長ã�?
511             *
512             * @return      æŒ?®šã?長さに短縮された文字å?
513             */
514            protected String trim( final String src, final int maxLen ) {
515                    String rtn = src;
516                    if( src != null && src.length() > maxLen ) {
517                            rtn = src.substring( 0, maxLen );
518                    }
519                    return rtn;
520            }
521    
522            /**
523             * アドレスチェãƒ?‚¯のエラーリストを返しますã?
524             *
525             * @return      エラーリスãƒ?
526             */
527            protected List<String> getErrList(){
528                    return errAddrList;
529            }
530    
531            /**
532             * 宛å?マップをå…?�«ã€??信オブジェクトに宛å?をセãƒ?ƒˆしますã?
533             * セãƒ?ƒˆする際に、アカウントエラーとなってã�?‚‹アドレスを除外しますã?
534             * 宛å?が存在しなã�??合ã?例外を投げますã?
535             *
536             * @og.rev 4.3.7.5 (2009/07/08) 送信先名称が設定されてã�?�ªã�??合ã?、アドレスã‚?>で囲わなã�?
537             *
538             * @param invalidAddr 宛å?のリスãƒ?
539             */
540            private void setMailDst( final List<String> invalidAddr ){
541                    ArrayList<String> toList = new ArrayList<String>();
542                    ArrayList<String> ccList = new ArrayList<String>();
543                    ArrayList<String> bccList = new ArrayList<String>();
544    
545                    Map<Integer, ArrayList<String>> tempMap = new HashMap<Integer, ArrayList<String>>();
546                    tempMap.put( Integer.valueOf( MailPattern.KBN_TO ),  toList );
547                    tempMap.put( Integer.valueOf( MailPattern.KBN_CC ),  ccList );
548                    tempMap.put( Integer.valueOf( MailPattern.KBN_BCC ), bccList );
549    
550                    for( String dstId : mailDstMap.keySet() ) {
551                            String[] dstInfo = mailDstMap.get( dstId );
552                            Integer kbn = Integer.valueOf( dstInfo[MailPattern.IDX_DST_KBN] );
553                            if( !invalidAddr.contains( dstInfo[MailPattern.IDX_DST_ADDR] )
554                                            && !FGJ_ADDR_ERR.equals( dstInfo[MailPattern.IDX_FGJ] )){
555                                    dstInfo[MailPattern.IDX_FGJ] = FGJ_SEND_OVER;
556    
557                                    // 4.3.7.5 (2009/07/08)
558                                    String name = dstInfo[MailPattern.IDX_DST_NAME];
559                                    if( name != null && name.length() > 0 ) {
560                                            tempMap.get( kbn ).add( dstInfo[MailPattern.IDX_DST_NAME] +  "<"+ dstInfo[MailPattern.IDX_DST_ADDR] + ">" );
561                                    }
562                                    else {
563                                            tempMap.get( kbn ).add( dstInfo[MailPattern.IDX_DST_ADDR] );
564                                    }
565                            }
566                            else {
567                                    if( FGJ_SEND_OVER.equals( dstInfo[MailPattern.IDX_FGJ] ) ) {
568                                            dstInfo[MailPattern.IDX_FGJ] = FGJ_ACNT_ERR;
569                                    }
570                            }
571                    }
572    
573                    mail.clearTo();         // 宛å?(TO)をクリア
574                    mail.clearCc();         // 宛å?(CC)をクリア
575                    mail.clearBcc();        // 宛å?(BCC)をクリア
576                    boolean haveValidAddr = false ;
577    //              if( toList.size() > 0 ) {    // toのセãƒ?ƒˆ
578                    if( ! toList.isEmpty() ) {      // toのセãƒ?ƒˆ
579                            haveValidAddr = true;
580                            String[] to = toList.toArray( new String[toList.size()] );
581                            mail.setTo( to );
582                    }
583    //              if( ccList.size() > 0 ) {    // ??½??セãƒ?ƒˆ
584                    if( ! ccList.isEmpty() ) {      // ??½??セãƒ?ƒˆ
585                            haveValidAddr = true;
586                            String[] cc = ccList.toArray( new String[ccList.size()] );
587                            mail.setCc( cc );
588                    }
589    //              if( bccList.size() > 0 ) {   // bccのセãƒ?ƒˆ
590                    if( ! bccList.isEmpty() ) {     // bccのセãƒ?ƒˆ
591                            haveValidAddr = true;
592                            String[] bcc = bccList.toArray( new String[bccList.size()] );
593                            mail.setBcc( bcc );
594                    }
595                    if( !haveValidAddr ){           // 宛å?全部無効の場合ã?例外を投げますã?
596                            String errMsg = "宛å?のメールアドレスが有効ではありませんã€?
597                                                    + "TO , CC , BCC のã�?�¥れにもアドレスが設定されてã�?�¾せんã€?; // 5.1.8.0 (2010/07/01) errMsg 修正
598                            throw new RuntimeException( errMsg );
599                    }
600            }
601    
602            /**
603             * 要æ±?Oを採番しますã?
604             * こã?要æ±?Oで履歴ãƒ??ブル(GE32)と宛å?ãƒ??ブル(GE30)の関連付けを持たせますã?
605             *
606             * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対ç­?
607             *
608             * @return      要æ±?O
609             */
610            private String getYkno() {
611    //              String[][] tmp = DBUtil.dbExecute( selYkno, new String[0], appInfo );
612                    String[][] tmp = DBUtil.dbExecute( selYkno, new String[0], appInfo, DBID );             // 5.5.5.1 (2012/08/07)
613                    if( tmp == null || tmp.length == 0 ) {
614                            String errMsg = "要æ±?O採番エラー"
615                                                    + " SQL=" + selYkno ;           // 5.1.8.0 (2010/07/01) errMsg 修正
616                            throw new RuntimeException( errMsg );
617                    }
618                    return tmp[0][0];
619            }
620    
621            /**
622             * メールアドレスのリストよりユーザーIDをé?引きしますã?
623             *
624             * @param       addressList     メールアドレスのリスãƒ?
625             *
626             * @return      ユーザーID
627             */
628            private String getUserIds( final List<String> addressList ){
629                    StringBuilder idBuf = new StringBuilder();
630                    Map<String,String>  addressMap = new HashMap<String, String>();
631                    for( String userId : mailDstMap.keySet() ) {
632                            String[] dstInfo = mailDstMap.get( userId );
633                            addressMap.put( dstInfo[MailPattern.IDX_DST_ADDR], userId );
634                    }
635                    for(int i=0; i < addressList.size(); i++){
636                            idBuf.append( ',' ).append( addressMap.get( addressList.get( i ) ) );
637                    }
638                    String rtn = "";
639                    if ( idBuf.length() > 0 ) {
640                            rtn = idBuf.toString().substring( 1 );
641                    }
642                    return rtn;
643            }
644    }