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