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.mail; 017 018import static org.opengion.fukurou.util.StringUtil.csv2ArrayOnly; 019 020import java.util.ArrayList; 021import java.util.List; 022import java.util.Map; 023import java.util.TreeMap; 024 025import javax.mail.internet.AddressException; 026import javax.mail.internet.InternetAddress; 027 028import org.opengion.fukurou.db.DBUtil; 029import org.opengion.hayabusa.common.HybsSystem; 030 031/** 032 * メール定型文及びそれも基づいて各項目の合成を行うクラスです。 033 * コンストラクタには定型文ID及びシステムIDで定型文マスタよりメールの定型文を取得します。 034 * メール各項目のゲッターでは、定型文の内容を元にパラメータ値とマージして各項目を合成します。 035 * 宛先について、セットした社員ID、グループIDと定型文の宛先設定に基づき、社員マスタと 036 * グループマスタよりメールアドレス情報を取得して宛先マップを作成します。 037 * 038 * 039 * @og.rev 5.6.6.0 (2013/07/05) host指定対応。GE37必須です。 040 * 041 * @og.group メールモジュール 042 * 043 * @version 4.0 044 * @author Sen.Li 045 * @since JDK1.6 046 */ 047public class MailPattern { 048 049 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 050 private static final String CONTENTS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "CONTENT" : "CONTENTS"; 051 private static final String ADDRESS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "MEMBER" : "ADDRESS"; 052 private static final String NAME_JA = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "NAME" : "NAME_JA"; 053 private static final String KBNAME = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "NM_KBN" : "KBNAME"; 054 055 // 5.1.0.0 (2009/11/04) CONTENT ⇒ CONTENTS 056 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 057 private static final String selGE31 = "SELECT PTN_ID,FROM_ID,TO_ID,CC_ID,BCC_ID,TITLE,"+CONTENTS 058 + " ,JOKEN" // 5.6.6.0 (2013/07/05) 059 + " FROM GE31" 060 + " WHERE SYSTEM_ID =? AND PTN_ID=? AND FGJ='1'"; 061 // 5.1.0.0 (2009/11/04) MEMBER ⇒ ADDRESS , NM_KBN ⇒ KBNAME , NAME ⇒ NAME_JA 062 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 063 private static final String selGE33 = "SELECT A."+ADDRESS+",A."+NAME_JA+",B."+NAME_JA 064 + " FROM GE33 A,GE33 B" 065 + " WHERE A.FGJ='1' AND B.FGJ(+)='1' AND A.GROUP_ID=B.GROUP_ID(+)" 066 + " AND A."+KBNAME+"='1' AND B."+KBNAME+"(+)='0' AND A.SYSTEM_ID=B.SYSTEM_ID(+)" 067 + " AND A.SYSTEM_ID =? " 068 + " AND A.GROUP_ID =?"; 069 070 /** 071 * GE35のメールアドレス検索文 072 */ 073 public static final String selGE35 = "SELECT "+NAME_JA+",MAIL" 074 + " FROM GE35" 075 + " WHERE USERID=?"; 076 077 // 5.6.6.0 (2013/07/05) 振り分け条件 078 private static final String selGE37 = "SELECT HOST,PORT,AUTH,AUTHUSER,AUTHPASS" 079 + " FROM GE37" 080 + " WHERE SYSTEM_ID = ?" 081 + " AND JOKEN = ?" 082 + " AND FGJ ='1'"; 083 084 // 内部データのカラム番号(定型文マスタテーブル) 085 // 5.1.9.0 (2010/09/01) public ⇒ private へ変更 086 // private static final int GE31_PTN_ID = 0 ; // 未使用 087 private static final int GE31_FROM_ID = 1 ; 088 private static final int GE31_TO_ID = 2 ; 089 private static final int GE31_CC_ID = 3 ; 090 private static final int GE31_BCC_ID = 4 ; 091 private static final int GE31_TITLE = 5 ; 092 private static final int GE31_CONTENTS = 6 ; // 5.1.0.0 (2009/11/04) CONTENT ⇒ CONTENTS 093 private static final int GE31_JOKEN = 7 ; // 5.6.6.0 (2013/07/05) 094 095 // 内部データのカラム番号(グループマスタ) 096 private static final int GE33_ADDRESS = 0 ; // 5.1.0.0 (2009/11/04) MEMBER ⇒ ADDRESS 097 private static final int GE33_MNAME = 1 ; 098 private static final int GE33_GNAME = 2 ; 099 100 /** 101 * GE35のユーザ名称 102 */ 103 public static final int GE35_NAME = 0 ; 104 /** 105 * GE35のメールアドレス 106 */ 107 public static final int GE35_MAIL = 1 ; 108 109 // 内部データのカラム番号(送信ホストマスタ) 110 private static final int GE37_HOST = 0 ; 111 private static final int GE37_PORT = 1 ; 112 private static final int GE37_AUTH = 2 ; 113 private static final int GE37_AUTHUSER = 3 ; 114 private static final int GE37_AUTHPASS = 4 ; 115 116 // 内部データのカラム番号(宛先テーブル) 117 /** カラム番号(宛先テーブル) {@value} */ 118 public static final int IDX_DST_ID = 0 ; 119 /** カラム番号(宛先テーブル) {@value} */ 120 public static final int IDX_GROUP_ID = 1 ; 121 /** カラム番号(宛先テーブル) {@value} */ 122 public static final int IDX_GROUP_NAME = 2 ; 123 /** カラム番号(宛先テーブル) {@value} */ 124 public static final int IDX_DST_NAME = 3 ; 125 /** カラム番号(宛先テーブル) {@value} */ 126 public static final int IDX_DST_ADDR = 4 ; 127 /** カラム番号(宛先テーブル) {@value} */ 128 public static final int IDX_DST_KBN = 5 ; 129 /** カラム番号(宛先テーブル) {@value} */ 130 public static final int IDX_FGJ = 6 ; 131 132 /** メール送信区分 {@value} */ 133 public static final int KBN_TO = 0 ; // メール送信区分(TO) 134 /** メール送信区分 {@value} */ 135 public static final int KBN_CC = 1 ; // メール送信区分(CC) 136 /** メール送信区分 {@value} */ 137 public static final int KBN_BCC = 2 ; // メール送信区分(BCC) 138 139 private static final String PreFixGroup = "GP."; 140 private final List<String> errAddrList = new ArrayList<String>(); 141 private final Map<String, String> paramMap ; 142 private String fromId = null; 143 private final String toId ; 144 private final String ccId ; 145 private final String bccId ; 146 private String[][] title = null; 147 private String[][] content = null; 148 private Map<String, String[]> mailDstMap; 149 150 // 5.6.6.0 (2013/07/05) 151 private String host = HybsSystem.sys( "COMMON_MAIL_SERVER" ); 152 private String smtpPort = HybsSystem.sys( "SMTP_PORT" ); 153 private String auth = HybsSystem.sys( "MAIL_SEND_AUTH" ); 154 private String authUser = HybsSystem.sys( "MAIL_SEND_AUTH_USER" ); 155 private String authPass = HybsSystem.sys( "MAIL_SEND_AUTH_PASSWORD" ); 156 157 158 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 159 160 /** 161 * メール定型文オブジェクトを作成するコンストラクタです。 162 * 定型文マスタより取得したデータを各フィルードにセットします。 163 * 164 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 165 * @og.rev 5.6.6.0 (2013/07/05) 振り分け対応 166 * 167 * @param params パラメータのマップ 168 */ 169 public MailPattern( final Map<String, String> params ){ 170 paramMap = params; 171 String sysId = params.get( "SYSTEM_ID" ); 172 String pid = params.get( "PTN_ID" ); 173 String[] selGE30Args = { sysId,pid }; 174 String[][] ptn = DBUtil.dbExecute( selGE31, selGE30Args, AbstractMailManager.appInfo, DBID ); // 5.5.5.1 (2012/08/07) 175 if( ptn == null || ptn.length <=0 ) { 176 String errMsg = "定型文取得できません。システムID:" + sysId + "定型文ID:" + pid ; 177 throw new RuntimeException( errMsg ); 178 } 179 fromId = ptn[0][GE31_FROM_ID]; 180 toId = ptn[0][GE31_TO_ID]; 181 ccId = ptn[0][GE31_CC_ID]; 182 bccId = ptn[0][GE31_BCC_ID]; 183 String tit = ptn[0][GE31_TITLE]; 184 if( tit != null && tit.length() > 0 ) { 185 title = splitParam( tit ); 186 } 187 String con = ptn[0][GE31_CONTENTS]; // 5.1.0.0 (2009/11/04) CONTENT ⇒ CONTENTS 188 if( con != null && con.length() > 0 ) { 189 content = splitParam( con ); 190 } 191 // 5.6.6.0 (2013/07/05) 振り分け対応 192 String joken = ptn[0][GE31_JOKEN]; 193 if( joken != null && joken.length() > 0 ) { 194 String[] selGE37Args = { sysId,joken }; 195 String[][] jkn = DBUtil.dbExecute( selGE37, selGE37Args, AbstractMailManager.appInfo, DBID ); 196 if( ptn == null || ptn.length <=0 ) { 197 String errMsg = "メールホストの振分先が取得できません。システムID:" + sysId + "振分条件:" + joken ; 198 throw new RuntimeException( errMsg ); 199 } 200 host = jkn[0][GE37_HOST]; 201 smtpPort = jkn[0][GE37_PORT]; 202 auth = jkn[0][GE37_AUTH]; 203 authUser = jkn[0][GE37_AUTHUSER]; 204 authPass = jkn[0][GE37_AUTHPASS]; 205 } 206 } 207 208 /** 209 * 定型文の送信者ID欄の設定値とパラメータ{@FROM}を元に送信者アドレスを取得します。 210 * 定型文には{@FROM}とセットされている場合は、パラメータ{@FROM}の値を元に、社員IDをセット 211 * されている場合、直接そのIDを元に社員マスタから送信者アドレスを取得します。 212 * 送信者アドレス取得できなければ例外を投げます。 213 * 214 * @og.rev 4.3.7.5 (2009/07/08) 送信元名称が設定されていない場合は、アドレスを<>で囲わない 215 * 216 * @return 送信者アドレス 217 */ 218 public String getFromAddr(){ 219 // 定型文に{@FROM}⇒ユーザーよりセットしたデータで置換える、ユーザーIDの場合はそのまま 220 if( "{@FROM}".equals( fromId ) ) { 221 fromId = paramMap.get( "FROM" ); 222 } 223 paramMap.put( "FROM_ID" , fromId ); // 送信者ID 224 225 String[] userInf = getUserInfo( fromId ); 226 String fromAddr = null; 227 if( userInf != null && checkAddr ( fromId, userInf[1] ) ){ // 送信者メールアドレスチェック 228 paramMap.put( "FROM_NAME", userInf[0] ); // 送信者名前 229 // 4.3.7.5 (2009/07/08) 230 if( userInf[0] != null && userInf[0].length() > 0 ) { 231 fromAddr = userInf[0] + "<" + userInf[1] + ">" ; 232 } 233 else { 234 fromAddr = userInf[1]; 235 } 236 paramMap.put( "FROM_ADDR", fromAddr ); // 送信者メールアドレス 237 } 238 else { 239 String errMsg = "送信者ユーザー情報エラー。ユーザーID:" + fromId; 240 throw new RuntimeException( errMsg ); 241 } 242 243 return fromAddr; 244 } 245 246 /** 247 * マージ済のメールタイトルを返します。 248 * 249 * @return メールタイトル 250 * 251 */ 252 public String getTitle(){ 253 return marge( title ); 254 } 255 256 /** 257 * マージ済のメール本文を返します。 258 * 259 * @og.rev 5.1.0.0 (2009/11/04) HEADER ⇒ H_TXT , FOOTER ⇒ F_TXT カラム名変更 260 * 261 * @return メール本文 262 */ 263 public String getContent(){ 264 String header = paramMap.get( "HEADER" ); // 5.1.0.0 (2009/11/04) HEADER ⇒ H_TXT 265 StringBuilder contentBuf = new StringBuilder(); 266 if ( header != null ) { 267 contentBuf.append( header ).append( '\n' ); 268 } 269 contentBuf.append( marge( content ) ).append( '\n' ); 270 String fooder = paramMap.get( "FOOTER" ); // 5.1.0.0 (2009/11/04) FOOTER ⇒ F_TXT 271 if ( fooder != null ) { 272 contentBuf.append( fooder ); 273 } 274 275 return contentBuf.toString(); 276 } 277 278 /** 279 * 引数の文字列により、定数文字列の部分とパラメータの部分を分解します。 280 * 例:"A{@PARAM1}B"⇒rtn[0][0]="A",rtn[0][1]="B",rtn[1][0]="PARAM1" 281 * 282 * @param src 分解対象の文字列 283 * 284 * @return 定数文字列の部分とパラメータの部分を分解した配列 285 */ 286 private String[][] splitParam( final String src ) { 287 String[][] rtn = new String[2][]; 288 if( src == null ) { return new String[2][0]; } 289 290 ArrayList<String> listCons = new ArrayList<String>() ; 291 ArrayList<String> listPara = new ArrayList<String>() ; 292 293 int start = 0; 294 int index = src.indexOf( "{@" ); 295 while( index >= 0 ) { 296 listCons.add( src.substring( start, index ) ); 297 int end = src.indexOf( '}',index ); 298 if( end < 0 ) { 299 String errMsg = "{@ と } との対応関係がずれています。" 300 + "src=[" + src + "] : index=" + index ; 301 throw new RuntimeException( errMsg ); 302 } 303 listPara.add( src.substring( index + 2, end )); 304 305 start = end+1 ; 306 index = src.indexOf( "{@",start ); 307 } 308 listCons.add ( src.substring( start ) ); 309 310 rtn[0] = listCons.toArray( new String[listCons.size()] ); 311 rtn[1] = listPara.toArray( new String[listPara.size()] ); 312 313 return rtn; 314 } 315 316 /** 317 * 送信先のアドレスをセットします。 318 * 定型文に定義されている宛先(TO、CC、BCC)を引数として渡します。引数には{@TO}、{@CC}、{@BCC}が含まれています。 319 * {@TO}、{@CC}、{@BCC}を初期設定の値で置換えて、実のメールアドレスマップを作成します。 320 * 321 * @return 宛先のマップ 322 */ 323 public Map<String, String[]> getDstMap(){ 324 String[] toBuf = getDstArray( toId ); 325 String[] ccBuf = getDstArray( ccId ); 326 String[] bccBuf = getDstArray( bccId ); 327 328 // 送信先(TO、CC、BCC)のマップを作成します。 329 mailDstMap = (TreeMap<String, String[]>)getDstAddrMap( bccBuf, KBN_BCC ); 330 mailDstMap.putAll( (TreeMap<String, String[]>) getDstAddrMap( ccBuf, KBN_CC ) ); 331 mailDstMap.putAll( (TreeMap<String, String[]>) getDstAddrMap( toBuf, KBN_TO ) ); 332 setDstWord(); 333 334 return mailDstMap; 335 } 336 337 /** 338 * アドレスエラーのメッセージリストを返します。 339 * 340 * @return メッセージリスト 341 */ 342 public List<String> getErrList(){ 343 return errAddrList; 344 } 345 346 /** 347 * 送信先のアドレスをcsv形式から配列にセットします。 348 * 引数は定型文マスタにセットしたものです。例:{@TO},C12345,GP.IT 349 * {@TO}、{@CC}、{@BCC}はパラメータテーブルにセットしたもので置き換えます。 350 * 分解後の配列には、ユーザーID及びグループIDが混在します。 351 * 352 * @param csvId csv形式のアドレス 353 * 354 * @return 送信先のアドレスの配列 355 */ 356 private String[] getDstArray( final String csvId ){ 357 String[] csvArr = csv2ArrayOnly( csvId ); 358 ArrayList<String> list = new ArrayList<String>(); 359 360 String[] tmp; 361 int size = csvArr.length; 362 for( int i = 0; i < size; i++ ){ 363 if( csvArr[i].startsWith( "{@" )){ 364 tmp = csv2ArrayOnly( paramMap.get( csvArr[i].substring( 2, csvArr[i].length() - 1 ) ) ); 365 int len = tmp.length; 366 for(int j=0;j<len;j++){ 367 list.add( tmp[j] ); 368 } 369 } 370 else{ 371 list.add( csvArr[i]); 372 } 373 } 374 return list.toArray( new String[list.size()] ); 375 } 376 377 /** 378 * 送信先のアドレス・マップを作成します。 379 * 引数 dstBuf にはユーザーIDとグループID混在する配列です。 380 * ユーザーIDの場合、社員マスタのビューから名前及びメールアドレスを取得してマップにセットします。 381 * グループIDの場合、グループマスタより、名前及びメールアドレスを取得してマップにセットします。 382 * 重複のユーザーが存在する場合、最後にセットした方が採用されます。 383 * 384 * @og.rev 5.1.0.0 (2009/11/04) MEMBER ⇒ ADDRESS カラム名変更 385 * 386 * @param dstBuf ユーザーIDとグループID混在する配列 387 * @param kbn 送信区分[0:TO/1:CC/2:BCC] 388 * 389 * @return 送信先のアドレス・マップ 390 */ 391 private Map<String, String[]> getDstAddrMap( final String[] dstBuf, final int kbn ){ 392 Map<String,String[]> dstMap= new TreeMap<String,String[]>(); 393 // IDX_DST_ID ,IDX_GROUP_ID, IDX_GROUP_NAME ,IDX_DST_NAME ,IDX_DST_ADDR ,IDX_DST_KBN ,IDX_FGJ 394 String[] dstInit = { "", "", "", "", "", Integer.toString( kbn ), "7" }; 395 396 int len = dstBuf.length; 397 for( int i=0; i < len; i++ ){ 398 if( dstBuf[i].startsWith( PreFixGroup ) ) { // グループIDの場合、グループマスタより、メンバーを取得します。 399 String[][] groupUsers = getGroupUsers( dstBuf[i].substring( PreFixGroup.length() ) ); 400 if( groupUsers.length > 0 ) { 401 int memberCnt = groupUsers.length; 402 for( int j = 0; j < memberCnt; j++ ) { // グループメンバーの処理 403 String[] grpMember = dstInit.clone(); 404 grpMember[IDX_GROUP_ID] = dstBuf[i].substring( PreFixGroup.length() ); // グループID 405 grpMember[IDX_GROUP_NAME] = groupUsers[j][GE33_GNAME]; // グループ名 406 grpMember[IDX_DST_ID] = groupUsers[j][GE33_ADDRESS]; // 宛先ID 407 grpMember[IDX_DST_NAME] = groupUsers[j][GE33_MNAME]; // 宛先名 408 if( groupUsers[j][GE33_ADDRESS].contains( "@" ) ) { // メールアドレスがセットされる場合 409 grpMember[IDX_DST_ADDR] = groupUsers[j][GE33_ADDRESS]; // メールアドレス 410 } 411 else { // 社員IDがセットされた場合 412 String[] userAddr = getUserInfo( groupUsers[j][GE33_ADDRESS] ); 413 if ( userAddr != null && userAddr.length > 0 ){ 414 grpMember[IDX_DST_ADDR] = userAddr[GE35_MAIL]; // メールアドレス 415 } 416 } 417 if ( checkAddr( grpMember[IDX_DST_ID], grpMember[IDX_DST_ADDR] ) ){ // アドレス構文チェック 418 grpMember[IDX_FGJ] = AbstractMailManager.FGJ_SEND_WAIT; // 送信待 419 } 420 else { 421 grpMember[IDX_FGJ] = AbstractMailManager.FGJ_ADDR_ERR; // アドレス取得エラー 422 errAddrList.add( "アドレス取得エラー。ユーザーID:" + grpMember[IDX_DST_ID] + " アドレス:" + grpMember[IDX_DST_ADDR] ); 423 } 424 dstMap.put( groupUsers[j][GE33_ADDRESS], grpMember ); 425 } 426 } 427 else { // グループマスタよりメンバー取得できない場合 428 String[] emptyGp = dstInit.clone(); 429 emptyGp[IDX_GROUP_ID] = dstBuf[i]; // グループID 430 emptyGp[IDX_GROUP_NAME] = "*"; // グループID 431 emptyGp[IDX_DST_ID] = "NO-MEMBER"; // 宛先ID 432 dstMap.put( dstBuf[i], emptyGp ); 433 } 434 } 435 else { // ユーザーIDの場合 436 String[] indMember = dstInit.clone(); 437 indMember[IDX_DST_ID] = dstBuf[i]; // 宛先ID 438 indMember[IDX_GROUP_ID] = "*"; // グループID 439 indMember[IDX_GROUP_NAME] = "*"; // グループID 440 String[] userAddr = getUserInfo( dstBuf[i] ); 441 if ( userAddr != null && userAddr.length > 0 ){ 442 indMember[IDX_DST_NAME] = userAddr[GE35_NAME]; // 宛先名 443 indMember[IDX_DST_ADDR] = userAddr[GE35_MAIL]; // メールアドレス 444 if ( checkAddr( indMember[IDX_DST_ID], userAddr[1] ) ) { 445 indMember[IDX_FGJ] = AbstractMailManager.FGJ_SEND_WAIT; 446 } 447 else { 448 indMember[IDX_FGJ] = AbstractMailManager.FGJ_ADDR_ERR; 449 errAddrList.add( "アドレス取得エラー。ユーザーID:" + indMember[IDX_DST_ID] + " アドレス:" + indMember[IDX_DST_ADDR] ); 450 } 451 452 } 453 else { 454 indMember[IDX_FGJ] = AbstractMailManager.FGJ_ADDR_ERR; // 状況コード 455 } 456 dstMap.put( dstBuf[i], indMember ); 457 } 458 } 459 return dstMap; 460 } 461 462 /** 463 * グループマスタより、ユーザー情報を取得します。 464 * 戻り値の配列には、ユーザーIDまたはメールアドレス、ユーザー名、グループ名が格納されています。 465 * 466 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 467 * 468 * @param groupId グループID 469 * 470 * @return ユーザー情報 471 */ 472 private String[][] getGroupUsers( final String groupId ){ 473 String sysId = paramMap.get( "SYSTEM_ID" ); 474 String[] ge33SelArgs = { sysId,groupId }; 475 String[][] ge33Datas = DBUtil.dbExecute( selGE33,ge33SelArgs,AbstractMailManager.appInfo, DBID ); // 5.5.5.1 (2012/08/07) 476 477 if ( ge33Datas.length == 0 ) { 478 String errMsg = "グループ情報取得できません。グループID:" + groupId ; 479 if( "true".equals( paramMap.get( "ADDR_CHECK" ) ) ){ 480 throw new RuntimeException( errMsg ); 481 } 482 else { 483 errAddrList.add( errMsg ); 484 } 485 } 486 return ge33Datas; 487 } 488 489 /** 490 * メール送信ホストを返します。 491 * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの HOST を取得します。 492 * 振り分け条件が未設定の場合は、システム定数のCOMMON_MAIL_SERVER を使用します。 493 * 494 * (初期値:システム定数のCOMMON_MAIL_SERVER[={@og.value org.opengion.hayabusa.common.SystemData#COMMON_MAIL_SERVER}])。 495 * 496 * @og.rev 5.6.6.0 (2013/07/05) 497 * 498 * @return メール送信ホスト 499 */ 500 public String getHost(){ 501 return host; 502 } 503 504 /** 505 * メール送信ポート番号を返します 506 * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの PORT を取得します。 507 * 振り分け条件が未設定の場合は、システム定数のSMTP_PORT を使用します。 508 * 509 * (初期値:システム定数のSMTP_PORT[={@og.value org.opengion.hayabusa.common.SystemData#SMTP_PORT}])。 510 * 511 * @og.rev 5.6.6.0 (2013/07/05) 512 * 513 * @return メール送信ポート番号 514 */ 515 public String getSmtpPort(){ 516 return smtpPort; 517 } 518 519 /** 520 * メール送信時認証有無を返します 521 * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの AUTH を取得します。 522 * 振り分け条件が未設定の場合は、システム定数のMAIL_SEND_AUTH を使用します。 523 * 524 * (初期値:システム定数のMAIL_SEND_AUTH[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH}])。 525 * 526 * @og.rev 5.6.6.0 (2013/07/05) 527 * 528 * @return メール送信時認証有無 529 */ 530 public String getAuth(){ 531 return auth; 532 } 533 534 /** 535 * メール送信認証ユーザを返します 536 * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの AUTHUSER を取得します。 537 * 振り分け条件が未設定の場合は、システム定数のMAIL_SEND_AUTH_USER を使用します。 538 * 539 * (初期値:システム定数のMAIL_SEND_AUTH_USER[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH_USER}])。 540 * 541 * @og.rev 5.6.6.0 (2013/07/05) 542 * 543 * @return メール送信認証ユーザ 544 */ 545 public String getAuthUser(){ 546 return authUser; 547 } 548 549 /** 550 * メール送信認証パスワードを返します 551 * GE31のJOKEN(振り分け条件)を元に、GE37テーブルの AUTHPASS を取得します。 552 * 振り分け条件が未設定の場合は、システム定数のMAIL_SEND_AUTH_PASSWORD を使用します。 553 * 554 * (初期値:システム定数のMAIL_SEND_AUTH_PASSWORD[={@og.value org.opengion.hayabusa.common.SystemData#MAIL_SEND_AUTH_PASSWORD}])。 555 * 556 * @og.rev 5.6.6.0 (2013/07/05) 557 * 558 * @return メール送信認証パスワード 559 */ 560 public String getAuthPass(){ 561 return authPass; 562 } 563 564 /** 565 * アドレスの構文チェックを行います、合法の場合は'true'(取得できた)、違法の場合は'false'(有効アドレス取得できず)を返します。 566 * 567 * @param userId ユーザーID 568 * @param address アドレス 569 * 570 * @return アドレスの構文チェック結果(true:取得/false:取得できず) 571 */ 572 private boolean checkAddr( final String userId, final String address ) { 573 boolean rtn = true; 574 try { 575 new InternetAddress( address ); 576 } 577 catch ( AddressException aep ) { 578 if ( "true".equals( paramMap.get( "ADDR_CHECK" ) ) ) { 579 String errMsg = "ユーザーメールアドレスエラー。ユーザーID:" + userId + " アドレス:" + address; 580 throw new RuntimeException( errMsg,aep ); 581 } 582 rtn = false; 583 } 584 return rtn; 585 } 586 587 /** 588 * 引数の配列から文書を合成します。 589 * src[0]に配列には定数文字列、src[1]にはパラメータ 590 * 591 * @param src 引数の配列 592 * 593 * @return 合成された文章 594 */ 595 private String marge( final String[][] src ){ 596 StringBuilder rtnBuf = new StringBuilder(); 597 String rtn; 598 if ( src != null ){ 599 int len = src[1].length; 600 for(int i=0; i< len; i++) { 601 rtnBuf.append( src[0][i] ); 602 rtnBuf.append( paramMap.get( src[1][i] ) ); 603 } 604 rtnBuf.append( src[0][len] ); 605 rtn = rtnBuf.toString(); 606 } 607 else { 608 rtn = null; 609 } 610 611 return rtn; 612 } 613 614 /** 615 * 宛先(TO、CC、BCC)のID、名前、メールアドレスをパラメータマップにセットします。 616 * 617 */ 618 private void setDstWord() { 619 StringBuilder to_id = new StringBuilder(); 620 StringBuilder to_name = new StringBuilder(); 621 StringBuilder to_addr = new StringBuilder(); 622 StringBuilder cc_id = new StringBuilder(); 623 StringBuilder cc_name = new StringBuilder(); 624 StringBuilder cc_addr = new StringBuilder(); 625 StringBuilder bcc_id = new StringBuilder(); 626 StringBuilder bcc_name = new StringBuilder(); 627 StringBuilder bcc_addr = new StringBuilder(); 628 int kbn; 629 for( String dstId : mailDstMap.keySet() ) { 630 kbn = Integer.parseInt( mailDstMap.get( dstId )[IDX_DST_KBN]); 631 switch( kbn ) { 632 case KBN_TO: 633 to_id.append( ',' ).append( dstId ); 634 to_name.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] ); 635 to_addr.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] ); 636 to_addr.append( '<' ).append( mailDstMap.get( dstId )[IDX_DST_ADDR] ).append( ">" ); 637 break; 638 case KBN_CC: 639 cc_id.append( ',' ).append( dstId ); 640 cc_name.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] ); 641 cc_addr.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] ); 642 cc_addr.append( '<' ).append( mailDstMap.get( dstId )[IDX_DST_ADDR] ).append( ">" ); 643 break; 644 case KBN_BCC: 645 bcc_id.append( ',' ).append( dstId ); 646 bcc_name.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] ); 647 bcc_addr.append( ',' ).append( mailDstMap.get( dstId )[IDX_DST_NAME] ); 648 bcc_addr.append( '<' ).append( mailDstMap.get( dstId )[IDX_DST_ADDR] ).append( ">" ); 649 break; 650 default: 651 String errMsg = "このアドレス区分がサポートされません。区分:" + kbn; 652 throw new RuntimeException( errMsg ); 653 } 654 } 655 // 予約語マップに追加します。 656 paramMap.put( "TO_ID" , ( to_id.length() > 0 ) ? to_id.toString().substring( 1 ) :"" ); 657 paramMap.put( "TO_NAME" , ( to_name.length() > 0 ) ? to_name.toString().substring( 1 ) :"" ); 658 paramMap.put( "TO_ADDR" , ( to_addr.length() > 0 ) ? to_addr.toString().substring( 1 ) :"" ); 659 paramMap.put( "CC_ID" , ( cc_id.length() > 0 ) ? cc_id.toString().substring( 1 ) :"" ); 660 paramMap.put( "CC_NAME" , ( cc_name.length() > 0 ) ? cc_name.toString().substring( 1 ) :"" ); 661 paramMap.put( "CC_ADDR" , ( cc_addr.length() > 0 ) ? cc_addr.toString().substring( 1 ) :"" ); 662 paramMap.put( "BCC_ID" , ( bcc_id.length() > 0 ) ? bcc_id.toString().substring( 1 ) :"" ); 663 paramMap.put( "BCC_NAME", ( bcc_name.length() > 0 ) ? bcc_name.toString().substring( 1 ):"" ); 664 paramMap.put( "BCC_ADDR", ( bcc_addr.length() > 0 ) ? bcc_addr.toString().substring( 1 ):"" ); 665 } 666 667 /** 668 * 社員マスタより名前、メールアドレスを取得します。 669 * 戻り値 rtn[0]:ユーザー名、 rtn[1]:ユーザーメールアドレス 670 * 671 * @og.rev 4.3.6.6 (2009/05/15) メールアドレスが直接指定された場合に対応 672 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 673 * 674 * @param userId ユーザーID 675 * 676 * @return 配列文字列(rtn[0]:ユーザー名、 rtn[1]:ユーザーメールアドレス) 677 */ 678 private String[] getUserInfo( final String userId ){ 679 String[] rtn = null; 680 681 if ( userId.contains( "@" ) ) { 682 rtn = new String[2]; 683 rtn[0] = ""; 684 rtn[1] = userId; 685 } 686 else { 687 String[] ge35SelArgs = { userId }; 688 String[][] ge35Datas = DBUtil.dbExecute( selGE35,ge35SelArgs,AbstractMailManager.appInfo, DBID ); // 5.5.5.1 (2012/08/07) 689 if ( ge35Datas.length > 0) { 690 rtn = ge35Datas[0]; 691 } 692 else { 693 String errMsg = "ユーザー情報取得できません。ユーザーID:" + userId ; 694 if( "true".equals( paramMap.get( "ADDR_CHECK" ) ) ){ 695 throw new RuntimeException( errMsg ); 696 } 697 else { 698 errAddrList.add( errMsg ); 699 } 700 } 701 } 702 return rtn; 703 } 704}