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 * ●形式:<og:mailSender from="…" to="…" subject="・・・"/>
040 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
041 *
042 * ●Tag定義:
043 *   <og:mailSender
044 *       subject            【TAG】タイトルを指定します
045 *       from               【TAG】送信元(FROM)アドレスを指定します
046 *       to                 【TAG】送信先(TO)アドレスをCSV形式で指定します
047 *       cc                 【TAG】送信先(CC)アドレスをCSV形式で指定します
048 *       bcc                【TAG】送信先(BCC)アドレスを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 *   >   ... Body ...
059 *   </og:mailSender>
060 *
061 * ●使用例
062 *     <og:mailSender from="C00000" to="C99999" subject="{@SUBJECT}" >
063 *          メール内容
064 *     </og:mailSender >
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検索時の属性名。ひとつならアドレス。2つなら名前とアドレス
075 *        host      = SMTPサーバー名
076 *        subject   = タイトル
077 *        fileURL   = 添付ファイルのセーブディレクトリ
078 *        filename  = 添付ファイル名(ローカルにセーブされたファイル名)(複数登録可能)
079 *        debug     = true/false;
080 *
081 * 複数登録可能な個所は、カンマ区切りで、複数登録できます。
082 * アドレス(from,to,cc,bcc,replyTo)は、『"名称" <メールアドレス>』形式が
083 * 指定できます。< と > で囲まれた範囲がメールアドレスになります。
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 ) {       // 検索値が2つの場合でない
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】送信元(FROM)アドレスを指定します。
313         *
314         * @og.tag 送信元(FROM)アドレスを指定します。
315         *
316         * @param   fromAdrs 送信元(FROM)アドレス
317         */
318        public void setFrom( final String fromAdrs ) {
319                from = nval( getRequestParameter( fromAdrs ), from );
320        }
321
322        /**
323         * 【TAG】送信先(TO)アドレスを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 送信先(TO)アドレス(CSV形式)
332         */
333        public void setTo( final String toAdrs ) {
334                to = StringUtil.csv2ArrayOnly( getRequestParameter( toAdrs ) );
335        }
336
337        /**
338         * 【TAG】送信先(CC)アドレスを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 送信先(CC)アドレス(CSV形式)
347         */
348        public void setCc( final String ccAdrs ) {
349                cc = StringUtil.csv2ArrayOnly( getRequestParameter( ccAdrs ) );
350        }
351
352        /**
353         * 【TAG】送信先(BCC)アドレスを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 送信先(BCC)アドレス(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) または、2文字目が、
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         * ひとつならアドレス。2つなら名前とアドレスの順で指定されたと認識します。
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}