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