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