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