    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.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.hayabusa.resource.LDAPSearch;
    021import org.opengion.hayabusa.mail.MailPattern;
    022import org.opengion.fukurou.db.DBUtil;
    023import org.opengion.fukurou.mail.MailTX;
    024import org.opengion.fukurou.util.StringUtil;
    025import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    026
    027import static org.opengion.fukurou.util.StringUtil.nval ;
    028
    029import org.opengion.hayabusa.mail.MailModuleUtil;                               // 5.9.2.3 (2015/11/27)
    030
    031import java.util.List;
    032
    033/**
    034 * メールを送信するための簡易タグです。
    035 *
    036 * Body 部に、メッセージを記述します。
    037 *
    038 * @og.formSample
    039 * ●形式:&lt;og:mailSender from="…" to="…" subject="･･･"/&gt;
    040 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    041 *
    042 * ●Tag定義:
    043 *   &lt;og:mailSender
    044 *       subject            【TAG】タイトルを指定します
    045 *       from               【TAG】送信元(ＦＲＯＭ)アドレスを指定します
    046 *       to                 【TAG】送信先(ＴＯ)アドレスをCSV形式で指定します
    047 *       cc                 【TAG】送信先(ＣＣ)アドレスをCSV形式で指定します
    048 *       bcc                【TAG】送信先(ＢＣＣ)アドレスをCSV形式で指定します
    049 *       replyTo            【TAG】返信先(replyTo)アドレスをCSV形式で指定します
    050 *       host               【TAG】メールサーバーを指定します (初期値:COMMON_MAIL_SERVER[=])
    051 *       smtpPort           【TAG】SMTPポートをCSV形式で指定します(初期値:SMTP_PORT)     // 5.8.1.1 (2014/11/14)
    052 *       authType           【TAG】認証方式            初期値:MAIL_SEND_AUTH                     // 5.8.1.1 (2014/11/14)
    053 *       authPort           【TAG】認証ポート          初期値:MAIL_SEND_AUTH_PORT         // 5.8.1.1 (2014/11/14)
    054 *       authUser           【TAG】認証ユーザー        初期値:MAIL_SEND_AUTH_USER          // 5.8.1.1 (2014/11/14)
    055 *       authPass           【TAG】認証パスワード      初期値:MAIL_SEND_AUTH_PASSWORD       // 5.8.1.1 (2014/11/14)
    056 *       useSSL             【TAG】SSL接続[false/true] 初期値:MAIL_SEND_USE_SSL                        // 6.3.8.0 (2015/09/11)
    057 *       charset            【TAG】文字エンコーディングを指定します (初期値:MAIL_DEFAULT_CHARSET[=ISO-2022-JP])
    058 *       fileURL            【TAG】添付ファイルのセーブディレクトリを指定します (初期値:FILE_URL[=filetemp/])
    059 *       filename           【TAG】添付ファイル名をCSV形式で指定します
    060 *       useLDAP            【TAG】メールアドレスをLDAPを利用して取得するかどうか[true/false]を指定します(初期値:false)
    061 *       ldapKey            【TAG】アドレスを検索するキーを指定します(初期値:LDAP_MAILSEND_KEY[=uid] C社員番号)
    062 *       ldapVals           【TAG】LDAP検索時の属性名を指定します(初期値:LDAP_MAILSEND_VALS[=cn,mail])
    063 *       useDB              【TAG】メールアドレスをDB(GE35)を利用して取得するかどうか[true/false]を指定します(初期値:false)
    064 *       useHistory         【TAG】GE32,34に送信履歴を保存するかどうか[true/false]を指定します(初期値:USE_MAILSENDER_HISTORY)
    065 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    066 *   &gt;   ... Body ...
    067 *   &lt;/og:mailSender&gt;
    068 *
    069 * ●使用例
    070 *     &lt;og:mailSender from=&quot;C00000&quot; to=&quot;C99999&quot; subject=&quot;{&#064;SUBJECT}&quot; &gt;
    071 *          メール内容
    072 *     &lt;/og:mailSender &gt;
    073 *
    074 *        charset   = キャラクタセット  (例:Windows-31J , ISO-2022-JP)
    075 *        from      = From       送信元
    076 *        to        = To         送信先(複数登録可能)
    077 *        cc        = Cc         送信先(複数登録可能)
    078 *        bcc       = Bcc        送信先(複数登録可能)
    079 *        replyTo   = ReplyTo    返信先先(複数登録可能)
    080 *        useLDAP   = false/true メールアドレスをLDAPを利用して取得するかどうか
    081 *        ldapKey   = "uid"      アドレスを検索するキー(初期値:システムリソース C社員番号)
    082 *        ldapVals  = "cn,mail"  LDAP検索時の属性名。ひとつならアドレス。２つなら名前とアドレス
    083 *        host      = SMTPサーバー名
    084 *        smtpPort  = SMTPポート          初期値:SMTP_PORT                                    // 5.8.1.1 (2014/11/14)
    085 *        authType  = 認証方式            初期値:MAIL_SEND_AUTH                                // 5.8.1.1 (2014/11/14)
    086 *        authPort  = 認証ポート          初期値:MAIL_SEND_AUTH_PORT            // 5.8.1.1 (2014/11/14)
    087 *        authUser  = 認証ユーザー        初期値:MAIL_SEND_AUTH_USER             // 5.8.1.1 (2014/11/14)
    088 *        authPass  = 認証パスワード      初期値:MAIL_SEND_AUTH_PASSWORD  // 5.8.1.1 (2014/11/14)
    089 *        useSSL    = SSL接続[false/true] 初期値:MAIL_SEND_USE_SSL                   // 6.3.8.0 (2015/09/11)
    090 *        subject   = タイトル
    091 *        fileURL   = 添付ファイルのセーブディレクトリ
    092 *        filename  = 添付ファイル名(ローカルにセーブされたファイル名)(複数登録可能)
    093 *        debug     = true/false;
    094 *
    095 * 複数登録可能な個所は、CSV形式で、複数登録できます。
    096 * アドレス(from,to,cc,bcc,replyTo)は、『"名称" &lt;メールアドレス&gt;』形式が
    097 * 指定できます。&lt; と &gt; で囲まれた範囲がメールアドレスになります。
    098 * 名称には、漢字が使用できます。
    099 *
    100 * host は、システムパラメータ の COMMON_MAIL_SERVER 属性が初期値で設定されます。
    101 * charset は、システムパラメータ の MAIL_DEFAULT_CHARSET 属性が初期値で設定されます。
    102 *
    103 * @og.group その他出力
    104 *
    105 * @version  4.0
    106 * @author   Kazuhiko Hasegawa
    107 * @since    JDK5.0,
    108 */
    109public class MailSenderTag extends CommonTagSupport {
    110        /** このプログラムのVERSION文字列を設定します。   {@value} */
    111        private static final String VERSION = "6.4.2.1 (2016/02/05)" ;
    112        private static final long serialVersionUID = 642120160205L ;
    113
    114        private transient MailTX mail ;
    115        private String          host    = HybsSystem.sys( "COMMON_MAIL_SERVER" );
    116        private String          charset = HybsSystem.sys( "MAIL_DEFAULT_CHARSET" );     // 3.5.6.6 (2004/08/23)
    117        private String          from    ;
    118        private String[]        to              ;
    119        private String[]        cc              ;
    120        private String[]        bcc             ;
    121        private String[]        replyTo ;
    122        private String          subject ;
    123        private String[]        filename;
    124        private String          fileURL = HybsSystem.sys( "FILE_URL" );
    125
    126        private String          smtpPort= HybsSystem.sys( "SMTP_PORT" );                                        // 5.8.1.1 (2014/11/14)
    127        private String          authType= HybsSystem.sys( "MAIL_SEND_AUTH" );                           // 5.8.1.1 (2014/11/14)
    128        private String          authPort= HybsSystem.sys( "MAIL_SEND_AUTH_PORT" );                      // 5.8.1.1 (2014/11/14)
    129        private String          authUser= HybsSystem.sys( "MAIL_SEND_AUTH_USER" );                      // 5.8.1.1 (2014/11/14)
    130        private String          authPass= HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" );          // 5.8.1.1 (2014/11/14)
    131        private boolean         useSSL  = HybsSystem.sysBool( "MAIL_SEND_USE_SSL" );            // 6.3.8.0 (2015/09/11)
    132        private boolean         useTLS  = HybsSystem.sysBool( "MAIL_SEND_USE_STARTTLS" );       // 5.9.29.2 (2018/02/16) STARTTLS対応(ｷｰﾜｰﾄﾞをVer5 にあわせます)
    133
    134        private boolean         useLDAP ;                               // 3.7.1.0 (2005/04/15)
    135        // uid C社員番号 、employeeNumber 社員番号
    136        private String          ldapKey = HybsSystem.sys( "LDAP_MAILSEND_KEY" );                // 5.6.7.0 (2013/07/27)
    137        private String          ldapVals= HybsSystem.sys( "LDAP_MAILSEND_VALS" );               // 5.6.7.0 (2013/07/27)
    138
    139        private boolean         useDB   ;                               // 5.6.9.3 (2013/10/25) GE35からメールアドレスを取得
    140        private final String DBID       = HybsSystem.sys( "RESOURCE_DBID" );
    141
    142        // 5.9.2.3 (2015/11/27) ログを残す設定
    143        private boolean         useHistory      = HybsSystem.sysBool( "USE_MAILSENDER_HISTORY" );
    144        private String          message;
    145
    146        /**
    147         * デフォルトコンストラクター
    148         *
    149         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    150         */
    151        public MailSenderTag() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    152
    153        /**
    154         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    155         *
    156         * @og.rev 6.3.8.0 (2015/09/11) SSL接続するかどうかを指定するパラメータを追加します。
    157         * @og.rev 5.9.29.2 (2018/02/16) STARTTLS対応(ｷｰﾜｰﾄﾞをVer5 にあわせます)
    158         *
    159         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    160         */
    161        @Override
    162        public int doStartTag() {
    163//              mail = new MailTX( host,charset,smtpPort,authType,authPort,authUser,authPass,useSSL );                  // 6.3.8.0 (2015/09/11)
    164                mail = new MailTX( host,charset,smtpPort,authType,authPort,authUser,authPass,useTLS,useSSL );   // 5.9.29.2 (2014/11/14)
    165                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
    166        }
    167
    168        /**
    169         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    170         *
    171         * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。
    172         * @og.rev 5.9.2.3 (2015/11/27) messageをインスタンス変数に変更。
    173         *
    174         * @return      後続処理の指示(SKIP_BODY)
    175         */
    176        @Override
    177        public int doAfterBody() {
    178                message = getBodyString();                              // 5.9.2.3
    179
    180                mail.setMessage( message );
    181
    182                return SKIP_BODY ;
    183        }
    184
    185        /**
    186         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    187         *
    188         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    189         * @og.rev 3.7.1.0 (2005/04/15) LDAP検索 新規追加
    190         * @og.rev 5.6.9.3 (2013/10/25) 送信後に履歴を残す(history追加)。mailSender2同様、ここがエラーでもメール送信は完了しているので注意。
    191         * @og.rev 5.9.3.0 (2015/12/04) useHistory対応
    192         *
    193         * @return      後続処理の指示
    194         */
    195        @Override
    196        public int doEndTag() {
    197                debugPrint();           // 4.0.0 (2005/02/28)
    198
    199                // 3.7.1.0 (2005/04/15) LDAP検索 新規追加
    200                if( useLDAP ) {
    201                        final String[] vals = StringUtil.csv2Array( ldapVals );
    202
    203                        final LDAPSearch serch = new LDAPSearch();
    204                        serch.setAttributes( vals );
    205                        serch.init();
    206
    207                        from    = setLDAPAddress( serch,from    );
    208                        to              = setLDAPAddress( serch,to              );
    209                        cc              = setLDAPAddress( serch,cc              );
    210                        bcc             = setLDAPAddress( serch,bcc             );
    211                        replyTo = setLDAPAddress( serch,replyTo );
    212                }
    213                else if( useDB ){ // 5.6.9.3 (2013/10/25) GE35からメールアドレスを取得
    214                        final String[] from_array = {from};
    215                        from    = getAddressArray( from_array )[0];
    216                        to              = getAddressArray( to           );
    217                        cc              = getAddressArray( cc           );
    218                        bcc             = getAddressArray( bcc          );
    219                        replyTo = getAddressArray( replyTo      );
    220                }
    221
    222                mail.setFrom( from );
    223                mail.setTo( to );
    224                mail.setCc( cc );
    225                mail.setBcc( bcc );
    226                mail.setReplyTo( replyTo );
    227                mail.setSubject( subject );
    228                mail.setDebug( isDebug() );
    229
    230                String[] temp = null;
    231                if( filename != null && filename.length > 0 ) {
    232                        temp = new String[filename.length];
    233                        final String directory = HybsSystem.url2dir( fileURL );
    234                        for( int i=0; i<temp.length; i++ ) {
    235                                temp[i] = StringUtil.urlAppend( directory, filename[i] );
    236                        }
    237                        mail.setFilename( temp );
    238                }
    239
    240                mail.sendmail() ;
    241
    242                // 5.9.2.3 (2015/11/27) 送信後に履歴を残す(history追加)。mailSender2同様、ここがエラーでもメール送信は完了しているので注意。
    243                if( useHistory ){
    244                        final MailModuleUtil mmu = new MailModuleUtil();
    245                        mmu.setInitParams( sys("SYSTEM_ID"), from, to, cc, bcc, message, subject, getUserInfo("ID"), getGUIInfoAttri("KEY") ,temp ); // 5.9.3.0
    246                        mmu.commitMailDB();
    247                }
    248
    249                return EVAL_PAGE ;
    250        }
    251
    252        /**
    253         * タグリブオブジェクトをリリースします。
    254         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    255         *
    256         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    257         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    258         * @og.rev 3.7.1.0 (2005/04/15) LDAP検索 useLDAP,ldapKey,ldapVals 属性追加
    259         * @og.rev 5.6.7.0 (2013/07/27) ldapKey,ldapValsの取得をリソースに変更
    260         * @og.rev 5.6.9.3 (2013/10/25) useDB追加
    261         * @og.rev 5.8.1.1 (2014/11/14) メール送信時認証追加。smtpPort,authPort,authType,authUser,authPass
    262         * @og.rev 6.3.8.0 (2015/09/11) SSL接続するかどうかを指定するパラメータを追加します。
    263         * @og.rev 5.6.9.3 (2013/10/25) 送信後に履歴を残す(history追加)。
    264         * @og.rev 5.9.29.2 (2018/02/16) STARTTLS対応(ｷｰﾜｰﾄﾞをVer5 にあわせます)
    265         */
    266        @Override
    267        protected void release2() {
    268                super.release2();
    269                mail            = null;
    270                host            = HybsSystem.sys( "COMMON_MAIL_SERVER" );
    271                charset         = HybsSystem.sys( "MAIL_DEFAULT_CHARSET" );                     // 3.5.6.6 (2004/08/23)
    272                from            = null;
    273                to                      = null;
    274                cc                      = null;
    275                bcc             = null;
    276                replyTo         = null;
    277                subject         = null;
    278                fileURL         = HybsSystem.sys( "FILE_URL" );
    279                filename        = null;
    280                useLDAP         = false;                                                                                        // 3.7.1.0 (2005/04/15)
    281                ldapKey         = HybsSystem.sys( "LDAP_MAILSEND_KEY" );                        // 5.6.7.0 (2013/07/27)
    282                ldapVals        = HybsSystem.sys( "LDAP_MAILSEND_VALS" );                       // 5.6.7.0 (2013/07/27)
    283                useDB           = false;                                // 5.6.9.3 (2013/10/25) GE35からメールアドレスを取得
    284                smtpPort        = HybsSystem.sys( "SMTP_PORT" );                                        // 5.8.1.1 (2014/11/14)
    285                authType        = HybsSystem.sys( "MAIL_SEND_AUTH" );                           // 5.8.1.1 (2014/11/14)
    286                authPort        = HybsSystem.sys( "MAIL_SEND_AUTH_PORT" );                      // 5.8.1.1 (2014/11/14)
    287                authUser        = HybsSystem.sys( "MAIL_SEND_AUTH_USER" );                      // 5.8.1.1 (2014/11/14)
    288                authPass        = HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" );          // 5.8.1.1 (2014/11/14)
    289                useHistory      = HybsSystem.sysBool( "USE_MAILSENDER_HISTORY" );       // 5.9.2.3 (2015/11/27)
    290                useTLS          = HybsSystem.sysBool( "MAIL_SEND_USE_STARTTLS" );       // 5.9.29.2 (2018/02/16)
    291                useSSL          = HybsSystem.sysBool( "MAIL_SEND_USE_SSL" );            // 6.3.8.0 (2015/09/11)
    292                message         = null;                                                                                         // 5.9.2.3 (2015/11/27)
    293        }
    294
    295        /**
    296         * LDAP を利用したメールアドレスを設定し直します。
    297         *
    298         * LDAPより、ldapKeyをキーに、ldapVals を設定値として、読み込みます。
    299         * 初期値は、ldapKeyは、uid(ユニークID) ldapValsは、cn,mail(名前、メールアドレス)となっています。
    300         * from,to,cc,bcc,replyTo の設定値を、target にセットして、検索します。
    301         * 通常、このメソッドは、useLDAP=true の場合に呼び出すように設定します。
    302         * target が null か、ゼロ文字列か メールアドレス(ここでは、&#064; 文字を含むかどうかで判定)の場合、
    303         * そのまま target を返します。
    304         *
    305         * @og.rev 3.7.1.0 (2005/04/15) LDAP検索 新規追加
    306         *
    307         * @param       serch   LDAPSearchオブジェクト
    308         * @param       target  ldapKeyキーに対する設定値
    309         *
    310         * @return      メールアドレス
    311         * @see   #setLDAPAddress( LDAPSearch serch, String[] targets )
    312         */
    313        private String setLDAPAddress( final LDAPSearch serch, final String target ) {
    314                final String rtnAdrs ;
    315
    316                if( target != null && target.indexOf( '@' ) < 0 ) {
    317                        final List<String[]> list = serch.search( ldapKey + "=" + target );
    318                        if( list.size() == 1 ) {
    319                                final String[] vals = list.get(0);
    320                                if( ldapVals.indexOf(',') < 0 ) {       // 検索値が２つの場合でない
    321                                        rtnAdrs = vals[0] ;             // メールアドレスのみ
    322                                }
    323                                else {
    324                                        rtnAdrs = vals[0] + "<" + vals[1] + ">" ;       // "名前<aaaa@bbbb>" 形式
    325                                }
    326                        }
    327                        else {
    328                                final String errMsg = "LDAP検索の結果、メールアドレスが見つかりませんでした。"
    329                                                        + "設定値=[" + target + "] , 検索キー=[" + ldapKey + "] , 検索属性=["
    330                                                        + ldapVals + "]" ;
    331                                throw new HybsSystemException( errMsg );
    332                        }
    333                }
    334                else {
    335                        rtnAdrs = target;
    336                }
    337
    338                return rtnAdrs ;
    339        }
    340
    341        /**
    342         * LDAP を利用した複数のメールアドレスを取得します。
    343         *
    344         * LDAPより、ldapKeyをキーに、ldapVals を設定値として、読み込みます。
    345         * 初期値は、ldapKeyは、uid(ユニークID) ldapValsは、cn,mail(名前、メールアドレス)となっています。
    346         * from,to,cc,bcc,replyTo の設定値を、target にセットして、検索します。
    347         * 通常、このメソッドは、useLDAP=true の場合に呼び出すように設定します。
    348         * target がメールアドレスの場合、(ここでは、&#064; 文字を含むかどうかで判定)そのまま返します。
    349         *
    350         * @og.rev 3.7.1.0 (2005/04/26) LDAP検索 新規追加
    351         *
    352         * @param       serch   LDAPSearchオブジェクト
    353         * @param       targets ldapKeyキーに対する設定値の配列
    354         *
    355         * @return      複数のメールアドレス配列
    356         * @og.rtnNotNull
    357         * @see   #setLDAPAddress( LDAPSearch serch, String target )
    358         */
    359        private String[] setLDAPAddress( final LDAPSearch serch, final String[] targets ) {
    360                // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    361                if( targets == null || targets.length == 0 ) { return targets; }
    362
    363                String[] rtn = new String[targets.length];
    364
    365                for( int i=0; i<targets.length; i++ ) {
    366                        rtn[i] = setLDAPAddress( serch,targets[i] );
    367                }
    368                return rtn ;
    369        }
    370
    371        /**
    372         * 【TAG】送信元(ＦＲＯＭ)アドレスを指定します。
    373         *
    374         * @og.tag 送信元(ＦＲＯＭ)アドレスを指定します。
    375         *
    376         * @param   fromAdrs 送信元(ＦＲＯＭ)アドレス
    377         */
    378        public void setFrom( final String fromAdrs ) {
    379                from = nval( getRequestParameter( fromAdrs ), from );
    380        }
    381
    382        /**
    383         * 【TAG】送信先(ＴＯ)アドレスをCSV形式で指定します。
    384         *
    385         * @og.tag
    386         * 複数アドレスをCSV形式でセットできます。
    387         *
    388         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
    389         * @og.rev 3.5.6.4 (2004/07/16) 先にリクエスト変数の値を取得してから配列に分解
    390         *
    391         * @param   toAdrs 送信先(ＴＯ)アドレス(CSV形式)
    392         */
    393        public void setTo( final String toAdrs ) {
    394                to = StringUtil.csv2ArrayOnly( getRequestParameter( toAdrs ) );
    395        }
    396
    397        /**
    398         * 【TAG】送信先(ＣＣ)アドレスをCSV形式で指定します。
    399         *
    400         * @og.tag
    401         * 複数アドレスをCSV形式でセットできます。
    402         *
    403         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
    404         * @og.rev 3.5.6.4 (2004/07/16) 先にリクエスト変数の値を取得してから配列に分解
    405         *
    406         * @param   ccAdrs 送信先(ＣＣ)アドレス(CSV形式)
    407         */
    408        public void setCc( final String ccAdrs ) {
    409                cc = StringUtil.csv2ArrayOnly( getRequestParameter( ccAdrs ) );
    410        }
    411
    412        /**
    413         * 【TAG】送信先(ＢＣＣ)アドレスをCSV形式で指定します。
    414         *
    415         * @og.tag
    416         * 複数アドレスをCSV形式でセットできます。
    417         *
    418         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
    419         * @og.rev 3.5.6.4 (2004/07/16) 先にリクエスト変数の値を取得してから配列に分解
    420         *
    421         * @param   bccAdrs 送信先(ＢＣＣ)アドレス(CSV形式)
    422         */
    423        public void setBcc( final String bccAdrs ) {
    424                bcc = StringUtil.csv2ArrayOnly( getRequestParameter( bccAdrs ) );
    425        }
    426
    427        /**
    428         * 【TAG】返信先(replyTo)アドレスをCSV形式で指定します。
    429         *
    430         * @og.tag
    431         * 複数アドレスをCSV形式でセットできます。
    432         *
    433         * @og.rev 3.5.6.6 (2004/08/23) 新規追加
    434         *
    435         * @param   replyToAdrs 返信先(replyTo)アドレス(CSV形式)
    436         */
    437        public void setReplyTo( final String replyToAdrs ) {
    438                replyTo = StringUtil.csv2ArrayOnly( getRequestParameter( replyToAdrs ) );
    439        }
    440
    441        /**
    442         * 【TAG】メールサーバーを指定します
    443         *              (初期値:COMMON_MAIL_SERVER[={@og.value SystemData#COMMON_MAIL_SERVER}])。
    444         *
    445         * @og.tag メールサーバーを指定します。
    446         * (初期値:システム定数のCOMMON_MAIL_SERVER[={@og.value SystemData#COMMON_MAIL_SERVER}])。
    447         *
    448         * @og.rev 3.5.6.6 (2004/08/23) 初期値を考慮するように変更。
    449         *
    450         * @param   hst メールサーバー
    451         * @see         org.opengion.hayabusa.common.SystemData#COMMON_MAIL_SERVER
    452         */
    453        public void setHost( final String hst ) {
    454                host = nval( getRequestParameter( hst ),host );
    455        }
    456
    457        /**
    458         * 【TAG】タイトルを指定します。
    459         *
    460         * @og.tag タイトルを指定します。
    461         *
    462         * @param   subjct タイトル
    463         */
    464        public void setSubject( final String subjct ) {
    465                this.subject = getRequestParameter( subjct );
    466        }
    467
    468        /**
    469         * 【TAG】添付ファイル名をCSV形式で指定します。
    470         *
    471         * @og.tag
    472         * 複数ファイルをセットできます。
    473         * 設定方法は、カンマで区切って並べ複数指定できます。
    474         *
    475         * @og.rev 3.5.6.6 (2004/08/23) 複数ファイル指定方法を、重複リクエストからCSV形式に変更
    476         *
    477         * @param   fname 添付ファイル名(CSV形式)
    478         */
    479        public void setFilename( final String fname ) {
    480                filename = StringUtil.csv2ArrayOnly( getRequestParameter( fname ) );
    481        }
    482
    483        /**
    484         * 【TAG】文字エンコーディングを指定します
    485         *              (初期値:MAIL_DEFAULT_CHARSET[={@og.value SystemData#MAIL_DEFAULT_CHARSET}])。
    486         *
    487         * @og.tag
    488         * 文字エンコーディングは、メール本文に対するエンコーディング指定です。
    489         * これは、Windows-31J 、MS932、Shift_JIS のどれかが指定された場合、
    490         * 『指定の文字コード + 8bit 送信』します。
    491         * それ以外の指定は、『ISO-2022-JP に独自変換 + 7bit 送信』になります。
    492         * (初期値:システム定数のMAIL_DEFAULT_CHARSET[={@og.value SystemData#MAIL_DEFAULT_CHARSET}])。
    493         *
    494         * @param   chset 文字エンコーディング
    495         * @see         org.opengion.hayabusa.common.SystemData#MAIL_DEFAULT_CHARSET
    496         */
    497        public void setCharset( final String chset ) {
    498                charset = nval( getRequestParameter( chset ),charset );
    499        }
    500
    501        /**
    502         * 【TAG】添付ファイルのセーブディレクトリを指定します
    503         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
    504         *
    505         * @og.tag
    506         * この属性で指定されるディレクトリに、添付ファイルが存在すると仮定します。
    507         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    508         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    509         * fileURL = "{&#064;USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
    510         * さらに、各個人ID別のフォルダを作成して、そこを使用します。
    511         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
    512         *
    513         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
    514         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
    515         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
    516         *
    517         * @param       url 添付ファイルのセーブディレクトリ
    518         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
    519         */
    520        public void setFileURL( final String url ) {
    521                final String furl = nval( getRequestParameter( url ),null );
    522                if( furl != null ) {
    523                        fileURL = StringUtil.urlAppend( fileURL,furl );
    524                }
    525        }
    526
    527        /**
    528         * 【TAG】メールアドレスをLDAPを利用して取得するかどうか[true/false]を指定します(初期値:false)。
    529         *
    530         * @og.tag
    531         * LDAP のメールアドレスを取得する場合は、true をセットします。false の場合は、
    532         * from,to,cc,bcc,replyTo の設定値がそのまま使用されます。
    533         * 上記アドレスに、&#064; を含む場合は、LDAP を検索せず、メールアドレスとして
    534         * そのまま使用します。LDAP の検索結果が存在しない場合は、不正なアドレスとして、
    535         * エラーとします。
    536         * 初期値は、false です。
    537         *
    538         * @og.rev 3.7.1.0 (2005/04/15) LDAP検索 新規追加
    539         *
    540         * @param   useLDAP メールアドレスのLDAP利用 [true:利用する/false:利用しない]
    541         */
    542        public void setUseLDAP( final String useLDAP ) {
    543                this.useLDAP = nval( getRequestParameter( useLDAP ),this.useLDAP );
    544        }
    545
    546        /**
    547         * 【TAG】アドレスを検索するキーを指定します(初期値:uid C社員番号)。
    548         *
    549         * @og.tag
    550         * LDAP のメールアドレスを取得する場合の、検索するキーを指定します。
    551         * from,to,cc,bcc,replyTo の設定値を、このキーにセットして、検索します。
    552         * uid C社員番号 、employeeNumber 社員番号 などが考えられます。
    553         * 初期値は、uid(C社員番号)です。
    554         * このキーで複数の検索結果が得られた場合は、エラーとします。
    555         *
    556         * @og.rev 3.7.1.0 (2005/04/15) LDAP検索 新規追加
    557         *
    558         * @param   ldapKey アドレスを検索するキー
    559         */
    560        public void setLdapKey( final String ldapKey ) {
    561                this.ldapKey = nval( getRequestParameter( ldapKey ),this.ldapKey );
    562        }
    563
    564        /**
    565         * 【TAG】LDAP検索時の属性名を指定します(初期値:cn,mail)。
    566         *
    567         * @og.tag
    568         * LDAPを検索する場合、"担当者名"&lt;メールアドレス&gt;形式のメールアドレスを作成する
    569         * 場合、検索する属性値を指定します。
    570         * ひとつならアドレス。２つなら名前とアドレスの順で指定されたと認識します。
    571         *
    572         * @og.rev 3.7.1.0 (2005/04/15) LDAP検索 新規追加
    573         *
    574         * @param   ldapVals LDAP検索時の属性名
    575         */
    576        public void setLdapVals( final String ldapVals ) {
    577                this.ldapVals = nval( getRequestParameter( ldapVals ),this.ldapVals );
    578        }
    579
    580        /**
    581         * 【TAG】メールアドレスをGE35を利用して取得するかどうか[true/false]を指定します(初期値:false)。
    582         *
    583         * @og.tag
    584         * GE35からメールアドレスを取得する場合は、true をセットします。false の場合は、
    585         * from,to,cc,bcc,replyTo の設定値がそのまま使用されます。
    586         * 上記アドレスに、&#064; を含む場合は、DB を検索せず、メールアドレスとして
    587         * そのまま使用します。DB の検索結果が存在しない場合は、不正なアドレスとして、
    588         * エラーとします。
    589         * useLDAPと同時に設定されている場合は、LDAP設定が優先されます。
    590         * 初期値は、false です。
    591         *
    592         * @og.rev 5.6.9.3 (2013/10/25) 新規追加
    593         *
    594         * @param   flag メールアドレスのGE35利用 [true:利用する/false:利用しない]
    595         */
    596        public void setUseDB( final String flag ) {
    597                useDB = nval( getRequestParameter( flag ),useDB );
    598        }
    599
    600        /**
    601         * 【TAG】メール送信ポート番号をセットします
    602         *              (初期値:システム定数のSMTP_PORT[={@og.value SystemData#SMTP_PORT}])。
    603         *
    604         * @og.tag
    605         * 初期値は、システム定数のSMTP_PORT を使用します。
    606         *
    607         * (初期値:システム定数のSMTP_PORT[={@og.value SystemData#SMTP_PORT}])。
    608         *
    609         * @og.rev 5.8.1.1 (2014/11/14) メール送信時認証「POP_BEFORE_SMTP」追加
    610         *
    611         * @param  port SMTPポート
    612         */
    613        public void setSmtpPort( final String port ) {
    614                smtpPort = nval( getRequestParameter(port), smtpPort );
    615        }
    616
    617        /**
    618         * 【TAG】メール送信時認証方式をセットします
    619         *               (初期値:システム定数のMAIL_SEND_AUTH[={@og.value SystemData#MAIL_SEND_AUTH}])。
    620         *
    621         * @og.tag
    622         * 認証を行う場合は「POP_BEFORE_SMTP」または、「SMTP_AUTH」が指定できます。
    623         * 認証時には認証ユーザと認証パスワードを設定する必要があります。
    624         * 初期値は、システム定数のMAIL_SEND_AUTH を使用します。
    625         *
    626         * (初期値:システム定数のMAIL_SEND_AUTH[={@og.value SystemData#MAIL_SEND_AUTH}])。
    627         *
    628         * @og.rev 5.8.1.1 (2014/11/14) メール送信時認証「POP_BEFORE_SMTP」追加
    629         * @og.rev 6.2.4.1 (2015/05/22) SMTP_AUTH 対応。「SMTP_AUTH」追加(コメントのみ修正)
    630         *
    631         * @param  type 認証方式
    632         */
    633        public void setAuthType( final String type ) {
    634                authType = nval( getRequestParameter(type), authType );
    635        }
    636
    637        /**
    638         * 【TAG】メール送信時認証ポートをセットします
    639         *              (初期値:システム定数のMAIL_SEND_AUTH_PORT[={@og.value SystemData#MAIL_SEND_AUTH_PORT}])。
    640         *
    641         * @og.tag
    642         * 「POP_BEFORE_SMTP」認証を行う場合に、POPサーバーに接続するポート番号を指定します。
    643         * 指定しない場合は、POP3デフォルトポートを使用します。
    644         * 初期値は、システム定数のMAIL_SEND_AUTH_PORT を使用します。
    645         *
    646         * (初期値:システム定数のMAIL_SEND_AUTH_PORT[={@og.value SystemData#MAIL_SEND_AUTH_PORT}])。
    647         *
    648         * @og.rev 5.8.1.1 (2014/11/14) メール送信時認証「POP_BEFORE_SMTP」追加
    649         *
    650         * @param  port 認証ポート
    651         */
    652        public void setAuthPort( final String port ) {
    653                authPort = nval( getRequestParameter(port), authPort );
    654        }
    655
    656        /**
    657         * 【TAG】メール送信認証ユーザをセットします
    658         *              (初期値:システム定数のMAIL_SEND_AUTH_USER[={@og.value SystemData#MAIL_SEND_AUTH_USER}])。
    659         *
    660         * @og.tag
    661         * 初期値は、システム定数のMAIL_SEND_AUTH_USER を使用します。
    662         *
    663         * (初期値:システム定数のMAIL_SEND_AUTH_USER[={@og.value SystemData#MAIL_SEND_AUTH_USER}])。
    664         *
    665         * @og.rev 5.8.1.1 (2014/11/14) メール送信時認証「POP_BEFORE_SMTP」追加
    666         *
    667         * @param  user 認証ユーザ
    668         */
    669        public void setAuthUser( final String user ) {
    670                authUser = nval( getRequestParameter(user), authUser );
    671        }
    672
    673        /**
    674         * 【TAG】メール送信認証パスワードをセットします
    675         *              (初期値:システム定数のMAIL_SEND_AUTH_PASSWORD[={@og.value SystemData#MAIL_SEND_AUTH_PASSWORD}])。
    676         *
    677         * @og.tag
    678         * 初期値は、システム定数のMAIL_SEND_AUTH_PASSWORD を使用します。
    679         *
    680         * (初期値:システム定数のMAIL_SEND_AUTH_PASSWORD[={@og.value SystemData#MAIL_SEND_AUTH_PASSWORD}])。
    681         *
    682         * @og.rev 5.8.1.1 (2014/11/14) メール送信時認証「POP_BEFORE_SMTP」追加
    683         *
    684         * @param  pass 認証パスワード
    685         */
    686        public void setAuthPass( final String pass ) {
    687                authPass = nval( getRequestParameter(pass), authPass );
    688        }
    689
    690        /**
    691         * 【TAG】メール送信時のSTARTTLS利用の設定。
    692         *
    693         * @og.tag
    694         * 初期値は、システム定数のMAIL_SEND_USE_STARTTLSを使用します。
    695         *
    696         * (初期値:システム定数のMAIL_SEND_AUTH_USER[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_USE_STARTTLS}])。
    697         *
    698         * @og.rev 5.9.29.2 (2018/02/16) STARTTLS対応(ｷｰﾜｰﾄﾞをVer5 にあわせます)
    699         *
    700         * @param  flag TLS利用有無
    701         */
    702        public void setUseTLS( final String flag ) {
    703                useTLS =nval( getRequestParameter( flag ),useTLS);
    704        }
    705
    706        /**
    707         * 【TAG】SSL接続するかどうかをセットします
    708         *              (初期値:システム定数のMAIL_SEND_USE_SSL[={@og.value SystemData#MAIL_SEND_USE_SSL}])。
    709         *
    710         * @og.tag
    711         * SSL接続する場合は、true を設定します。
    712         * (初期値:システム定数のMAIL_SEND_USE_SSL[={@og.value SystemData#MAIL_SEND_USE_SSL}])。
    713         *
    714         * @og.rev 6.3.8.0 (2015/09/11) SSL接続するかどうか
    715         *
    716         * @param  isSSL SSL接続するかどうか [true:する/false:しない]
    717         */
    718        public void setUseSSL( final String isSSL ) {
    719                useSSL = nval( getRequestParameter(isSSL), useSSL );
    720        }
    721
    722        /**
    723         * 【TAG】履歴に残すかどうかをセットします
    724         *              (初期値:システム定数のUSE_MAILSENDER_HISTORY[={@og.value SystemData#USE_MAILSENDER_HISTORY}])。
    725         *
    726         * @og.tag
    727         * 初期値は、システム定数のUSE_MAILSENDER_HISTORY を使用します。
    728         * trueを設定した場合、システムID、送信元アドレス、送信先アドレス、タイトル、本文について
    729         * GE32,34に履歴として保存されます。
    730         *
    731         * (初期値:システム定数のUSE_MAILSENDER_HISTORY[={@og.value SystemData#USE_MAILSENDER_HISTORY}])。
    732         *
    733         * @og.rev 5.9.2.3 (2015/11/27) 追加
    734         *
    735         * @param  flag 履歴に残すかどうか [true:残す/false:残さない]
    736         */
    737        public void setUseHistory( final String flag ) {
    738                useHistory = nval( getRequestParameter( flag ), useHistory );
    739        }
    740
    741        /**
    742         * 引数のアドレス配列を社員マスタ（GE35)で変換して返します。
    743         * グループIDは利用しません。
    744         *
    745         * @og.rev 5.6.9.3 (2013/10/25) 新規追加
    746         *
    747         * @param       src     引数配列(可変長引数)
    748         *
    749         * @return      変換後アドレス配列
    750         * @og.rtnNotNull
    751         */
    752        public String[] getAddressArray( final String... src ){
    753                if( src == null || src.length == 0 ) { return src; }            // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    754
    755                String[] rtn= src.clone();
    756
    757                for( int i=0; i<src.length; i++ ){
    758                        String addr = src[i];                                                   // 宛先ID
    759                        final String[] userAddr = getUserAddr( addr );
    760                        if( userAddr != null && userAddr.length > 0 ){
    761                                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    762                                addr = userAddr[MailPattern.GE35_NAME] == null
    763                                                        ? userAddr[MailPattern.GE35_MAIL]
    764                                                        : userAddr[MailPattern.GE35_NAME] + "<" + userAddr[MailPattern.GE35_MAIL] + ">";
    765
    766                                rtn[i] = addr;
    767                        }
    768                }
    769
    770                return rtn;
    771        }
    772
    773        /**
    774         * 社員マスタより名前、メールアドレスを取得します。
    775         * 戻り値 rtn[0]:ユーザー名、 rtn[1]:ユーザーメールアドレス
    776         *
    777         * @og.rev 5.6.9.3 (2013/10/25) mailSenderでもGE35を扱う。
    778         * @og.rev 6.4.1.1 (2016/01/16) selGE35 → SEL_GE35 refactoring
    779         *
    780         * @param   userId  ユーザーID
    781         *
    782         * @return      配列文字列(rtn[0]:ユーザー名、 rtn[1]:ユーザーメールアドレス)
    783         */
    784        private String[] getUserAddr( final String userId ){
    785                String[] rtn = null;
    786
    787                if( userId.contains( "@" ) ) {
    788                        rtn = new String[2];
    789                        rtn[0] = "";
    790                        rtn[1] = userId;
    791                }
    792                else {
    793                        final String[] ge35SelArgs = { userId };
    794                        final String[][] ge35Datas = DBUtil.dbExecute( MailPattern.SEL_GE35,ge35SelArgs,getApplicationInfo(), DBID );                   // 6.4.1.1 (2016/01/16) selGE35 → SEL_GE35 refactoring
    795                        if( ge35Datas.length > 0) {
    796                                rtn = ge35Datas[0];
    797                        }
    798                        else {
    799                                final String errMsg = "ユーザー情報取得できません。ユーザーID:" + userId ;
    800                                throw new HybsSystemException( errMsg );
    801                        }
    802                }
    803                return rtn;
    804        }
    805
    806        /**
    807         * このオブジェクトの文字列表現を返します。
    808         * 基本的にデバッグ目的に使用します。
    809         *
    810         * @og.rev 5.6.9.3 (2013/10/25) useDBの対応
    811         *
    812         * @return このクラスの文字列表現
    813         * @og.rtnNotNull
    814         */
    815        @Override
    816        public String toString() {
    817                return ToString.title( this.getClass().getName() )
    818                                .println( "VERSION"             ,VERSION        )
    819                                .println( "host"                ,host           )
    820                                .println( "charset"             ,charset        )
    821                                .println( "from"                ,from           )
    822                                .println( "to"                  ,to                     )
    823                                .println( "cc"                  ,cc                     )
    824                                .println( "bcc"                 ,bcc            )
    825                                .println( "replyTo"             ,replyTo        )
    826                                .println( "subject"             ,subject        )
    827                                .println( "filename"    ,filename       )
    828                                .println( "fileURL"     ,fileURL        )
    829                                .println( "useLDAP"             ,useLDAP        )
    830                                .println( "ldapKey"             ,ldapKey        )
    831                                .println( "ldapVals"    ,ldapVals       )
    832                                .println( "useDB"               ,useDB          ) // 5.6.9.3 (2013/10/25)
    833                                .println( "useHistory"  ,useHistory     ) // 5.9.2.3 (2015/11/27)
    834                                .println( "Other..."    ,getAttributes().getAttribute() )
    835                                .fixForm().toString() ;
    836        }
    837}