    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.mail;
    017
    018import java.util.ArrayList;
    019import java.util.HashMap;
    020import java.util.List;
    021import java.util.Map;
    022import java.util.Arrays;
    023
    024import org.opengion.fukurou.db.DBUtil;
    025import org.opengion.fukurou.mail.MailTX;
    026import org.opengion.fukurou.util.LogWriter;
    027import org.opengion.fukurou.util.StringUtil;
    028import org.opengion.hayabusa.common.HybsSystem;
    029
    030/**
    031 * パッチによるメール送信の実装クラスです。
    032 * 送信デーモンはパラメータテーブル(GE30)を監視して、新規のデータが登録されたら、
    033 * そのデータをパラメータとしてメール合成処理メソッドに渡して合成を行って送信します。
    034 * 最後に、処理結果を受取って、パラメータテーブルの状況フラグを送信済/送信エラーに更新します。
    035 * エラーが発生した場合、エラーテーブルにエラーメッセージを書き込みます。
    036 *
    037 * @og.group メールモジュール
    038 *
    039 * @version  4.0
    040 * @author   Sen.Li
    041 * @since    JDK1.6
    042 */
    043public class MailManager_DB extends AbstractMailManager {
    044        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    045        private static final String H_TXT = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "HEADER" : "H_TXT";
    046        private static final String F_TXT = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "FOOTER" : "F_TXT";
    047
    048        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    049//      private static final String     selGE30 = "SELECT  UNIQ,PTN_ID,FROM_ID,TO_ID,CC_ID,BCC_ID,H_TXT,F_TXT"          // 5.0.3.0 (2009/11/04)
    050        private static final String     selGE30 = "SELECT  UNIQ,PTN_ID,FROM_ID,TO_ID,CC_ID,BCC_ID,"+H_TXT+","+F_TXT
    051                                                                                +",PARAM0,PARAM1,PARAM2,PARAM3,PARAM4,PARAM5,PARAM6,PARAM7,PARAM8,PARAM9"
    052                                                                                +",ATTACH1,ATTACH2,ATTACH3,ATTACH4,ATTACH5"
    053                                                                                + " FROM GE30"
    054                                                                                + " WHERE SYSTEM_ID =? AND FGJ='1'";
    055        private static final String     insGE36 = "INSERT INTO GE36(PARA_KEY,ERRMSG,DYSET,USRSET,PGUPD,SYSTEM_ID,FGJ)"
    056                                                                                + " VALUES(?,?,?,?,?,?,'1')";
    057        private static final String     updGE30 = "UPDATE GE30 SET FGJ= ? WHERE UNIQ = ? ";
    058        private static final String     SNED_OK = "2";
    059        private static final String     SNED_NG = "8";
    060        private static final int GE30_UNIQ              = 0 ;
    061        private static final int GE30_PTN_ID    = 1 ;
    062        private static final int GE30_FROM_ID   = 2 ;
    063        private static final int GE30_TO_ID             = 3 ;
    064        private static final int GE30_CC_ID             = 4 ;
    065        private static final int GE30_BCC_ID    = 5 ;
    066        private static final int GE30_H_TXT             = 6 ;           // 5.0.3.0 (2009/11/04) HEADER ⇒ H_TXT
    067        private static final int GE30_F_TXT             = 7 ;           // 5.0.3.0 (2009/11/04) FOOTER ⇒ F_TXT
    068        private static final int GE30_PARAM0    = 8 ;
    069        private static final int GE30_PARAM1    = 9 ;
    070        private static final int GE30_PARAM2    = 10 ;
    071        private static final int GE30_PARAM3    = 11 ;
    072        private static final int GE30_PARAM4    = 12 ;
    073        private static final int GE30_PARAM5    = 13 ;
    074        private static final int GE30_PARAM6    = 14 ;
    075        private static final int GE30_PARAM7    = 15 ;
    076        private static final int GE30_PARAM8    = 16 ;
    077        private static final int GE30_PARAM9    = 17 ;
    078        private static final int GE30_ATTACH1   = 18 ;
    079        private static final int GE30_ATTACH2   = 19 ;
    080        private static final int GE30_ATTACH3   = 20 ;
    081        private static final int GE30_ATTACH4   = 21 ;
    082        private static final int GE30_ATTACH5   = 22 ;
    083        private static final int GE36_PARA_KEY  = 0 ;
    084        private static final int GE36_ERRMSG    = 1 ;
    085        private static final int GE36_DYSET             = 2 ;
    086        private static final int GE36_USRSET    = 3 ;
    087        private static final int GE36_PGUPD     = 4 ;
    088        private static final int GE36_SYSTEM_ID = 5 ;
    089        private final List<String>         errMsgList     = new ArrayList<String>();
    090
    091        /**
    092         * バッチより呼出のメインメソッドです。
    093         * パラメータテーブル(GE30)を監視します。
    094         * 新規のデータが登録されたら、メール文を合成して送信を行います。
    095         * エラーが発生した場合、エラーテーブルにエラーメッセージを書き込みます。
    096         *
    097         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    098         *
    099         * @param systemId システムID
    100         */
    101        public void sendDBMail( final String systemId ){
    102                // パラメータテーブルよりバッチでセットしたデータを取得します。
    103//              String[][] ge30datas = DBUtil.dbExecute( selGE30, new String[]{ systemId }, appInfo );
    104                String[][] ge30datas = DBUtil.dbExecute( selGE30, new String[]{ systemId }, appInfo, DBID );            // 5.5.5.1 (2012/08/07)
    105
    106                int ge30Len = ge30datas.length;
    107                for( int i=0; i < ge30Len; i++ ) {
    108                        String fgj = SNED_OK;
    109                        try {
    110                                Map<String, String> initParam = makeParamMap( systemId, ge30datas[i] );
    111                                create( initParam );
    112                                send();                                                         // 合成されたメール文書、宛先で送信処理を行います。
    113                                errMsgList.addAll( getErrList() );
    114                        }
    115                        catch( RuntimeException rex ) {
    116                                fgj = SNED_NG;
    117                                errMsgList.add( "メール送信失敗しました。パラメータキー：" + ge30datas[i][GE30_UNIQ] + " " + rex.getMessage() );
    118                        }
    119                        finally {
    120                                commitParamTable( ge30datas[i][GE30_UNIQ], fgj );
    121//                              if ( errMsgList.size() > 0 ) {
    122                                if ( ! errMsgList.isEmpty() ) {
    123                                        writeErrorTable( ge30datas[i][GE30_UNIQ], systemId, errMsgList );
    124                                        errMsgList.clear();
    125                                }
    126                        }
    127                }
    128        }
    129
    130        /**
    131         * パラメータテーブルに登録したデータをパラメータマップにセットします。
    132         *
    133         * @param       systemId        システムID
    134         * @param       ge30Data        パラメータテーブルのデータ配列
    135         *
    136         * @return      データをセットしたマップ
    137         */
    138        private Map<String, String> makeParamMap( final String systemId, final String[] ge30Data ){
    139                Map<String,String>   paramMap = null;
    140                if( ( ge30Data != null ) && ( ge30Data.length > 0 ) ) {
    141                        paramMap = new HashMap<String,String>();
    142                        paramMap.put( "SYSTEM_ID", systemId    );
    143                        paramMap.put( "PARAKEY", ge30Data[GE30_UNIQ]    );
    144                        paramMap.put( "PTN_ID" , ge30Data[GE30_PTN_ID]  );
    145                        paramMap.put( "FROM"   , ge30Data[GE30_FROM_ID] );
    146                        paramMap.put( "TO"     , ge30Data[GE30_TO_ID]   );
    147                        paramMap.put( "CC"     , ge30Data[GE30_CC_ID]   );
    148                        paramMap.put( "BCC"    , ge30Data[GE30_BCC_ID]  );
    149                        paramMap.put( "H_TXT"  , ge30Data[GE30_H_TXT]   );                      // 5.0.3.0 (2009/11/04) HEADER ⇒ H_TXT
    150                        paramMap.put( "F_TXT"  , ge30Data[GE30_F_TXT]   );                      // 5.0.3.0 (2009/11/04) FOOTER ⇒ F_TXT
    151                        paramMap.put( "PARAM0" , ge30Data[GE30_PARAM0]  );
    152                        paramMap.put( "PARAM1" , ge30Data[GE30_PARAM1]  );
    153                        paramMap.put( "PARAM2" , ge30Data[GE30_PARAM2]  );
    154                        paramMap.put( "PARAM3" , ge30Data[GE30_PARAM3]  );
    155                        paramMap.put( "PARAM4" , ge30Data[GE30_PARAM4]  );
    156                        paramMap.put( "PARAM5" , ge30Data[GE30_PARAM5]  );
    157                        paramMap.put( "PARAM6" , ge30Data[GE30_PARAM6]  );
    158                        paramMap.put( "PARAM7" , ge30Data[GE30_PARAM7]  );
    159                        paramMap.put( "PARAM8" , ge30Data[GE30_PARAM8]  );
    160                        paramMap.put( "PARAM9" , ge30Data[GE30_PARAM9]  );
    161                        paramMap.put( "ATTACH1", ge30Data[GE30_ATTACH1] );
    162                        paramMap.put( "ATTACH2", ge30Data[GE30_ATTACH2] );
    163                        paramMap.put( "ATTACH3", ge30Data[GE30_ATTACH3] );
    164                        paramMap.put( "ATTACH4", ge30Data[GE30_ATTACH4] );
    165                        paramMap.put( "ATTACH5", ge30Data[GE30_ATTACH5] );
    166                        paramMap.put( "DATE", HybsSystem.getDate("yyyy/MM/dd") );
    167                        paramMap.put( "TIME", HybsSystem.getDate("HH:mm:ss") );
    168                        paramMap.put( "LOGIN_USERID", "DAEMON" );
    169                        paramMap.put( "LOGIN_USERNAME", "DAEMON" );
    170                        paramMap.put( "PGID", "DAEMON" );
    171                }
    172                return paramMap;
    173        }
    174
    175        /**
    176         * 送信後、パラメータテーブルの状況フラグを更新します。
    177         * 送信エラーなしの場合はフラグを’送信済(2)’、エラーの場合’送信エラー(8)’に更新します。
    178         *
    179         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    180         *
    181         * @param       uniq    ユニークキー
    182         * @param       fgj             状況フラグ[2:送信済/8:エラー]
    183         */
    184        private void commitParamTable( final String uniq, final String fgj ){
    185                String[] updGE30Args = { fgj, uniq };
    186//              DBUtil.dbExecute( updGE30, updGE30Args, appInfo );
    187                DBUtil.dbExecute( updGE30, updGE30Args, appInfo, DBID );                // 5.5.5.1 (2012/08/07)
    188        }
    189
    190        /**
    191         * エラーテーブルにエラーメッセージを登録します。
    192         *
    193         * @og.rev 4.4.0.1 (2009/08/08) メール送信追加
    194         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    195         *
    196         * @param       paraKey         パラメータキー(GE36.PARA_KEY)
    197         * @param       systemId        システムID
    198         * @param       emList          エラーメッセージリスト
    199         *
    200         */
    201//      private void writeErrorTable( final String paraKey, final String systemId, final List<String> errMsgList ){
    202        private void writeErrorTable( final String paraKey, final String systemId, final List<String> emList ){
    203                String[] insGE36Args = new String[6];
    204                insGE36Args[GE36_PARA_KEY]      = paraKey;
    205                insGE36Args[GE36_DYSET]         = HybsSystem.getDate( "yyyyMMddHHmmss" );
    206                insGE36Args[GE36_USRSET]        = "DAEMON";
    207                insGE36Args[GE36_PGUPD]         = "DAEMON";
    208                insGE36Args[GE36_SYSTEM_ID] = systemId;
    209                for( int i=0; i< emList.size(); i++ ){
    210                        insGE36Args[GE36_ERRMSG] = trim( emList.get( i ), 4000);
    211//                      DBUtil.dbExecute( insGE36, insGE36Args,appInfo );
    212                        DBUtil.dbExecute( insGE36, insGE36Args, appInfo, DBID );                // 5.5.5.1 (2012/08/07)
    213                }
    214
    215                sendMail( paraKey, systemId, emList ); // 4.4.0.1 (2009/08/08)
    216        }
    217
    218        /**
    219         * エラー情報のメール送信を行います。
    220         * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
    221         * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
    222         * がすべて設定されている場合に、送信されます。
    223         *
    224         * @og.rev 4.4.0.1 (2009/08/08) 追加
    225         * @og.rev 5.4.3.2 (2012/01/06) 認証対応
    226         *
    227         * @param       paraKey         メールキー
    228         * @param       systemId        システムID
    229         * @param       emList          エラーメッセージリスト
    230         */
    231//      private void sendMail( final String paraKey, final String systemId, final List<String> errMsgList ) {
    232        private void sendMail( final String paraKey, final String systemId, final List<String> emList ) {
    233
    234                String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
    235                String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
    236                String   charset                = HybsSystem.sys( "MAIL_DEFAULT_CHARSET" );
    237                String   smtpPort               = HybsSystem.sys( "SMTP_PORT" );                                // 5.4.3.2 (2012/01/06)
    238                String   auth                   = HybsSystem.sys( "MAIL_SEND_AUTH" );                   // 5.4.3.2 (2012/01/06)
    239                String   authPort               = HybsSystem.sys( "MAIL_SEND_AUTH_PORT" );              // 5.8.1.1 (2014/11/14)
    240                String   authUser               = HybsSystem.sys( "MAIL_SEND_AUTH_USER" );              // 5.4.3.2 (2012/01/06)
    241                String   authPass               = HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" );  // 5.4.3.2 (2012/01/06)
    242
    243                String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
    244                if( host != null && from != null && to.length > 0 ) {
    245                        String subject = "SYSTEM_ID=[" + systemId + "] , PARA_KEY=[" + paraKey + "] , "
    246                                                   + "DMN_HOST=[" + HybsSystem.HOST_NAME + "]" ;
    247                        StringBuilder inErrMsg = new StringBuilder();
    248                        inErrMsg.append( emList.size() + "件のエラーがありました。" );
    249                        inErrMsg.append( HybsSystem.CR );
    250                        for( int i=0; i< emList.size(); i++ ){
    251                                inErrMsg.append( i+1 );
    252                                inErrMsg.append( "-----" );
    253                                inErrMsg.append( HybsSystem.CR );
    254                                inErrMsg.append( emList.get( i ) );
    255                                inErrMsg.append( HybsSystem.CR );
    256                        }
    257                        try {
    258                                //MailTX tx = new MailTX( host );
    259                                MailTX tx = new MailTX( host, charset, smtpPort, auth, authPort, authUser, authPass ); // 5.4.3.2
    260                                tx.setFrom( from );
    261                                tx.setTo( to );
    262                                tx.setSubject( "メールモジュール送信エラー：" + subject );
    263                                tx.setMessage( inErrMsg.toString() );
    264                                tx.sendmail();
    265                        }
    266                        catch( Throwable ex ) {
    267                                String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR
    268                                                        + " SUBJECT:" + subject                                 + HybsSystem.CR
    269                                                        + " HOST:" + host                                               + HybsSystem.CR
    270                                                        + " FROM:" + from                                               + HybsSystem.CR
    271                                                        + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
    272                                                        + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
    273                                LogWriter.log( errMsg );
    274                                LogWriter.log( ex );
    275                        }
    276                }
    277        }
    278}