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