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 * ●形式:<og:mailSender from="…" to="…" subject="・・・"/>
041 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
042 *
043 * ●Tag定義:
044 *   <og:mailSender
045 *       subject            【TAG】タイトルを指定します
046 *       from               【TAG】送信元(FROM)アドレスを指定します
047 *       to                 【TAG】送信先(TO)アドレスをCSV形式で指定します
048 *       cc                 【TAG】送信先(CC)アドレスをCSV形式で指定します
049 *       bcc                【TAG】送信先(BCC)アドレスを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 *   >   ... Body ...
065 *   </og:mailSender>
066 *
067 * ●使用例
068 *     <og:mailSender from="C00000" to="C99999" subject="{@SUBJECT}" >
069 *          メール内容
070 *     </og:mailSender >
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検索時の属性名。ひとつならアドレス。2つなら名前とアドレス
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)は、『"名称" <メールアドレス>』形式が
094 * 指定できます。< と > で囲まれた範囲がメールアドレスになります。
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 ) {    // 検索値が2つの場合でない
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】送信元(FROM)アドレスを指定します。
344         *
345         * @og.tag 送信元(FROM)アドレスを指定します。
346         *
347         * @param   fromAdrs 送信元(FROM)アドレス
348         */
349        public void setFrom( final String fromAdrs ) {
350                from = nval( getRequestParameter( fromAdrs ), from );
351        }
352
353        /**
354         * 【TAG】送信先(TO)アドレスを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 送信先(TO)アドレス(CSV形式)
363         */
364        public void setTo( final String toAdrs ) {
365                to = StringUtil.csv2ArrayOnly( getRequestParameter( toAdrs ) );
366        }
367
368        /**
369         * 【TAG】送信先(CC)アドレスを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 送信先(CC)アドレス(CSV形式)
378         */
379        public void setCc( final String ccAdrs ) {
380                cc = StringUtil.csv2ArrayOnly( getRequestParameter( ccAdrs ) );
381        }
382
383        /**
384         * 【TAG】送信先(BCC)アドレスを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 送信先(BCC)アドレス(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) または、2文字目が、
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         * ひとつならアドレス。2つなら名前とアドレスの順で指定されたと認識します。
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}