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.fukurou.mail; 017 018 import org.opengion.fukurou.util.LogWriter; 019 020 import java.io.UnsupportedEncodingException; 021 import java.util.Properties; 022 import java.util.Date; 023 024 import javax.activation.FileDataSource; 025 import javax.activation.DataHandler; 026 import javax.mail.internet.InternetAddress; 027 import javax.mail.internet.AddressException; 028 import javax.mail.internet.MimeMessage; 029 import javax.mail.internet.MimeMultipart; 030 import javax.mail.internet.MimeBodyPart; 031 import javax.mail.internet.MimeUtility; 032 import javax.mail.Authenticator; // 5.8.7.1 (2015/05/22) 033 import javax.mail.PasswordAuthentication; // 5.8.7.1 (2015/05/22) 034 import javax.mail.Store; 035 import javax.mail.Transport; 036 import javax.mail.Session; 037 import javax.mail.Message; 038 import javax.mail.MessagingException; 039 import javax.mail.IllegalWriteException; 040 041 /** 042 * MailTX ã¯ã€?¼³??´?°ãƒ—ãƒãƒˆã‚³ãƒ«ã«ã‚ˆã‚‹ãƒ¡ãƒ¼ãƒ«é€ä¿¡ãƒ—ãƒã‚°ãƒ©ãƒ?§ã™ã? 043 * 044 * E-Mail ã§æ—¥æœ¬èªžã‚’é€ä¿¡ã™ã‚‹å ´åˆã?ISO-2022-JP(JISコーãƒ?化ã—ã¦ã€?bit ã§ 045 * エンコードã—ã¦é€ä¿¡ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ãŒã€Windowsç³»ã®ç‰¹æ®Šæ–‡å—ã‚„ã€unicode㨠046 * æ–?—ã?マッピングãŒç•°ãªã‚‹æ–‡å—ãªã©ãŒã?æ–?—化ã‘ã—ã¾ã™ã? 047 * 対応方法ã¨ã—ã¦ã¯ã€? 048 * ?‘.Windows-31J + 8bit é€ä¿¡ 049 * ?’.ISO-2022-JP ã«ç‹¬è‡ªå¤‰æ› + 7bit é€ä¿¡ 050 * ã®æ–¹æ³•ãŒã‚りã¾ã™ã? 051 * 今回ã€ã“ã®?’ã¤ã®æ–¹æ³•ã«ã¤ã?¦ã€å¯¾å¿œã„ãŸã—ã¾ã—ãŸã€? 052 * 053 * @version 4.0 054 * @author Kazuhiko Hasegawa 055 * @since JDK5.0, 056 */ 057 public class MailTX { 058 private static final String CR = System.getProperty("line.separator"); 059 private static final String AUTH_PBS = "POP_BEFORE_SMTP"; // 5.4.3.2 060 private static final String AUTH_SMTPA = "SMTP_AUTH"; // 5.4.3.2 5.8.7.1復活 061 062 /** メーラーã®åç§° {@value} */ 063 public static final String MAILER = "Hayabusa Mail Ver 4.0"; 064 065 private final String charset ; // Windwos-31J , MS932 , ISO-2022-JP 066 private String[] filename = null; 067 private String message = null; 068 private Session session = null; 069 private MimeMultipart mmPart = null; 070 private MimeMessage mimeMsg = null; 071 private MailCharset mcSet = null; 072 073 /** 074 * メールサーãƒã?ã¨ãƒ?ƒ•ォルト文å—エンコーãƒ?‚£ãƒ³ã‚°ã‚’指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã? 075 * 076 * ãƒ?ƒ•ォルト文å—エンコーãƒ?‚£ãƒ³ã‚°ã¯ã€ISO-2022-JP ã§ã™ã? 077 * 078 * @param host メールサーãƒã? 079 * @throws IllegalArgumentException 引数ã?null ã®å ´åˆã? 080 */ 081 public MailTX( final String host ) { 082 this( host,"ISO-2022-JP" ); 083 } 084 085 /** 086 * メールサーãƒã?ã¨ãƒ?ƒ•ォルト文å—エンコーãƒ?‚£ãƒ³ã‚°ã‚’指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã? 087 * 088 * æ–?—エンコーãƒ?‚£ãƒ³ã‚°ã«ã¯ã€Windwos-31J , MS932 , ISO-2022-JP を指定ã§ãã¾ã™ã? 089 * 090 * @og.rev 5.4.3.2 (2012/01/06) èªè¨¼å¯¾å¿œã?ãŸã‚ 091 * @og.rev 5.8.1.1 (2014/11/14) èªè¨¼ãƒã?ト追åŠ? 092 * 093 * @param host メールサーãƒã? 094 * @param charset æ–?—エンコーãƒ?‚£ãƒ³ã‚° 095 * @throws IllegalArgumentException 引数ã?null ã®å ´åˆã? 096 */ 097 public MailTX( final String host , final String charset ) { 098 // this( host,charset,null,null,null,null ); 099 this( host,charset,null,null,null,null,null ); 100 } 101 102 /** 103 * メールサーãƒã?ã¨æ–?—エンコーãƒ?‚£ãƒ³ã‚°ã‚’指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã? 104 * èªè¨¼ã‚’行ã†å ´åˆã?èªè¨¼æ–¹æ³•ã‚’æŒ?®šã—ã¾ã™ã? 105 * 106 * æ–?—エンコーãƒ?‚£ãƒ³ã‚°ã«ã¯ã€Windwos-31J , MS932 , ISO-2022-JP を指定ã§ãã¾ã™ã? 107 * 108 * @og.rev 5.1.9.0 (2010/08/01) mail.smtp.localhostã®è¨å®šè¿½åŠ? 109 * @og.rev 5.4.3.2 (2012/01/06) èªè¨¼å¯¾å¿?POP Before SMTP)。引数?“ã¤è¿½åŠ?å°?¥çš?«ã¯Authentication対応ï¼? 110 * @og.rev 5.8.1.1 (2014/11/14) èªè¨¼ãƒã?ト追åŠ? 111 * @og.rev 5.8.7.1 (2015/05/22) SMTP Auth対å¿? 112 * 113 * @param host メールサーãƒã? 114 * @param charset æ–?—エンコーãƒ?‚£ãƒ³ã‚° 115 * @param smtpPort SMTPãƒã?ãƒ? 116 * @param authType èªè¨¼æ–¹æ³?5.4.3.2 117 * @param authPort èªè¨¼ãƒã?ãƒ?5.4.3.2 118 * @param authUser èªè¨¼ãƒ¦ãƒ¼ã‚¶ 5.4.3.2 119 * @param authPass èªè¨¼ãƒ‘スワーãƒ?5.4.3.2 120 * @throws IllegalArgumentException 引数ã?null ã®å ´åˆã? 121 */ 122 // public MailTX( final String host , final String charset, final String port 123 // ,final String auth, final String user, final String pass) { 124 public MailTX( final String host , final String charset, final String smtpPort 125 ,final String authType, final String authPort, final String authUser, final String authPass) { 126 if( host == null ) { 127 String errMsg = "host ã« null ã¯ã‚»ãƒ?ƒˆå‡ºæ¥ã¾ã›ã‚“ã€?; 128 throw new IllegalArgumentException( errMsg ); 129 } 130 131 if( charset == null ) { 132 String errMsg = "charset ã« null ã¯ã‚»ãƒ?ƒˆå‡ºæ¥ã¾ã›ã‚“ã€?; 133 throw new IllegalArgumentException( errMsg ); 134 } 135 136 this.charset = charset; 137 138 mcSet = MailCharsetFactory.newInstance( charset ); 139 140 Properties prop = new Properties(); 141 prop.setProperty("mail.mime.charset", charset); 142 prop.setProperty("mail.mime.decodetext.strict", "false"); 143 prop.setProperty("mail.mime.address.strict", "false"); 144 prop.setProperty("mail.smtp.host", host); 145 // 5.1.9.0 (2010/08/01) è¨å®šè¿½åŠ? 146 prop.setProperty("mail.smtp.localhost", host); 147 prop.setProperty("mail.host", host); // MEssage-ID ã®è¨å®šã«åˆ©ç”¨ 148 // 5.4.3.2 ãƒã?ト追åŠ? 149 // if( port != null && port.length() > 0 ){ 150 // prop.setProperty("mail.smtp.port", port); // MEssage-ID ã®è¨å®šã«åˆ©ç”¨ 151 // } 152 if( smtpPort != null && smtpPort.length() > 0 ){ 153 prop.setProperty("mail.smtp.port", smtpPort); // MEssage-ID ã®è¨å®šã«åˆ©ç”¨ 154 } 155 156 // SMTP Auth対å¿?5.8.7.1 (2015/05/22) 157 Authenticator myAuth = null; 158 if( AUTH_SMTPA.equals( authType ) ) { 159 prop.setProperty("mail.smtp.auth", "true" ); 160 myAuth = new Authenticator() { // 5.8.7.1 (2015/05/22) SMTPèªè¨¼ç”¨ã‚¯ãƒ©ã‚¹ 161 @Override 162 protected PasswordAuthentication getPasswordAuthentication() { 163 return new PasswordAuthentication( authUser,authPass ); 164 } 165 }; 166 } 167 session = Session.getInstance( prop, myAuth ); 168 169 // POP before SMTPèªè¨¼å‡¦ç?5.4.3.2 170 // if(AUTH_PBS.equals( auth )){ 171 if(AUTH_PBS.equals( authType )){ 172 try{ 173 // 5.8.1.1 (2014/11/14) èªè¨¼ãƒã?ト追åŠ? 174 int aPort = (authPass == null || authPass.isEmpty()) ? -1 : Integer.parseInt(authPort) ; 175 Store store = session.getStore("pop3"); 176 // store.connect(host,-1,user,pass); // åŒä¸??ストã¨ã™ã‚‹ 177 store.connect(host,aPort,authUser,authPass); // 5.8.1.1 (2014/11/14) èªè¨¼ãƒã?ト追åŠ? 178 store.close(); 179 } 180 catch(MessagingException ex){ 181 // String errMsg = "POP3 Auth Exception: "+ host + "/" + user; 182 String errMsg = "POP3 Auth Exception: "+ host + "/" + authUser; 183 throw new RuntimeException( errMsg,ex ); 184 } 185 } 186 187 mimeMsg = new MimeMessage(session); 188 } 189 190 /** 191 * メールをé?ä¿¡ã—ã¾ã™ã? 192 * 193 */ 194 public void sendmail() { 195 try { 196 mimeMsg.setSentDate( new Date() ); 197 198 if( filename == null || filename.length == 0 ) { 199 mcSet.setTextContent( mimeMsg,message ); 200 } 201 else { 202 mmPart = new MimeMultipart(); 203 mimeMsg.setContent( mmPart ); 204 // ãƒ?‚スト本体ã?登録 205 addMmpText( message ); 206 207 // 添付ファイルã®ç™»éŒ² 208 for( int i=0; i<filename.length; i++ ) { 209 addMmpFile( filename[i] ); 210 } 211 } 212 213 mimeMsg.setHeader("X-Mailer", MAILER ); 214 mimeMsg.setHeader("Content-Transfer-Encoding", mcSet.getBit() ); 215 Transport.send( mimeMsg ); 216 217 } 218 catch( AddressException ex ) { 219 String errMsg = "Address Exception: "; 220 throw new RuntimeException( errMsg,ex ); 221 } 222 catch ( MessagingException mex ) { 223 String errMsg = "MessagingException: "; 224 throw new RuntimeException( errMsg,mex ); 225 } 226 } 227 228 /** 229 * MimeMessageをリセãƒ?ƒˆã—ã¾ã™ã? 230 * 231 * sendmail() ã§ãƒ¡ãƒ¼ãƒ«ã‚’é?信後ã?ã‚»ãƒ?‚·ãƒ§ãƒ³ã‚’é–‰ã˜ãšã«åˆ¥ã®ãƒ¡ãƒ¼ãƒ«ã‚’é?ä¿¡ã™ã‚‹å ´åˆã? 232 * リセãƒ?ƒˆã—ã¦ã‹ã‚‰ã€å„種パラメータをå?è¨å®šã—ã¦ãã ã•ã„ã€? 233 * ãã?å ´åˆã?ã€ã™ã¹ã¦ã®ãƒ‘ラメータãŒå?期化ã•れã¦ã?¾ã™ã?ã§ã€ã‚‚ã?¸?º¦ 234 * è¨å®šã—ãªãŠã™å¿?¦ãŒã‚りã¾ã™ã? 235 * 236 */ 237 public void reset() { 238 mimeMsg = new MimeMessage(session); 239 } 240 241 /** 242 * é€ä¿¡å…??¦?²?¯?)アドレスをセãƒ?ƒˆã—ã¾ã™ã? 243 * 244 * @param from é€ä¿¡å…??¦?²?¯?)アドレス 245 */ 246 public void setFrom( final String from ) { 247 try { 248 if( from != null ) { 249 mimeMsg.setFrom( getAddress( from ) ); 250 } 251 } catch( AddressException ex ) { 252 String errMsg = "Address Exception: "; 253 throw new RuntimeException( errMsg,ex ); 254 } catch ( MessagingException mex ) { 255 String errMsg = "MessagingException: "; 256 throw new RuntimeException( errMsg,mex ); 257 } 258 } 259 260 /** 261 * é€ä¿¡å…??´?¯)アドレスé…å?ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 262 * 263 * @param to é€ä¿¡å…??´?¯)アドレスé…å? 264 */ 265 public void setTo( final String[] to ) { 266 try { 267 if( to != null ) { 268 mimeMsg.setRecipients( Message.RecipientType.TO, getAddress( to ) ); 269 } 270 } catch( AddressException ex ) { 271 String errMsg = "Address Exception: "; 272 throw new RuntimeException( errMsg,ex ); 273 } catch ( MessagingException mex ) { 274 String errMsg = "MessagingException: "; 275 throw new RuntimeException( errMsg,mex ); 276 } 277 } 278 279 /** 280 * é€ä¿¡å…??£?£)アドレスé…å?ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 281 * 282 * @param cc é€ä¿¡å…??£?£)アドレスé…å? 283 */ 284 public void setCc( final String[] cc ) { 285 try { 286 if( cc != null ) { 287 mimeMsg.setRecipients( Message.RecipientType.CC, getAddress( cc ) ); 288 } 289 } catch( AddressException ex ) { 290 String errMsg = "Address Exception: "; 291 throw new RuntimeException( errMsg,ex ); 292 } catch ( MessagingException mex ) { 293 String errMsg = "MessagingException: "; 294 throw new RuntimeException( errMsg,mex ); 295 } 296 } 297 298 /** 299 * é€ä¿¡å…??¢?£?£)アドレスé…å?ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 300 * 301 * @param bcc é€ä¿¡å…??¢?£?£)アドレスé…å? 302 */ 303 public void setBcc( final String[] bcc ) { 304 try { 305 if( bcc != null ) { 306 mimeMsg.setRecipients( Message.RecipientType.BCC, getAddress( bcc ) ); 307 } 308 } catch( AddressException ex ) { 309 String errMsg = "Address Exception: "; 310 throw new RuntimeException( errMsg,ex ); 311 } catch ( MessagingException mex ) { 312 String errMsg = "MessagingException: "; 313 throw new RuntimeException( errMsg,mex ); 314 } 315 } 316 317 /** 318 * é€ä¿¡å…??´?¯)アドレスé…å?をクリアã—ã¾ã™ã? 319 * @og.rev 4.3.6.0 (2009/04/01) æ–°è¦è¿½åŠ? 320 * 321 */ 322 public void clearTo() { 323 try { 324 mimeMsg.setRecipients( Message.RecipientType.TO, (InternetAddress[])null ); 325 } catch( IllegalWriteException ex ) { 326 String errMsg = "Address Exception: "; 327 throw new RuntimeException( errMsg,ex ); 328 } catch( IllegalStateException ex ) { 329 String errMsg = "Address Exception: "; 330 throw new RuntimeException( errMsg,ex ); 331 } catch ( MessagingException mex ) { 332 String errMsg = "MessagingException: "; 333 throw new RuntimeException( errMsg,mex ); 334 } 335 } 336 337 /** 338 * é€ä¿¡å…?CC)アドレスé…å?をクリアã—ã¾ã™ã? 339 * @og.rev 4.3.6.0 (2009/04/01) æ–°è¦è¿½åŠ? 340 * 341 */ 342 public void clearCc() { 343 try { 344 mimeMsg.setRecipients( Message.RecipientType.CC, (InternetAddress[])null ); 345 } catch( IllegalWriteException ex ) { 346 String errMsg = "Address Exception: "; 347 throw new RuntimeException( errMsg,ex ); 348 } catch( IllegalStateException ex ) { 349 String errMsg = "Address Exception: "; 350 throw new RuntimeException( errMsg,ex ); 351 } catch ( MessagingException mex ) { 352 String errMsg = "MessagingException: "; 353 throw new RuntimeException( errMsg,mex ); 354 } 355 } 356 357 /** 358 * é€ä¿¡å…?BCC)アドレスé…å?をクリアã—ã¾ã™ã? 359 * @og.rev 4.3.6.0 (2009/04/01) æ–°è¦è¿½åŠ? 360 * 361 */ 362 public void clearBcc() { 363 try { 364 mimeMsg.setRecipients( Message.RecipientType.BCC, (InternetAddress[])null ); 365 } catch( IllegalWriteException ex ) { 366 String errMsg = "Address Exception: "; 367 throw new RuntimeException( errMsg,ex ); 368 } catch( IllegalStateException ex ) { 369 String errMsg = "Address Exception: "; 370 throw new RuntimeException( errMsg,ex ); 371 } catch ( MessagingException mex ) { 372 String errMsg = "MessagingException: "; 373 throw new RuntimeException( errMsg,mex ); 374 } 375 } 376 377 /** 378 * 返信å…?replyTo)アドレスé…å?ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 379 * 380 * @param replyTo 返信å…?replyTo)アドレスé…å? 381 */ 382 public void setReplyTo( final String[] replyTo ) { 383 try { 384 if( replyTo != null ) { 385 mimeMsg.setReplyTo( getAddress( replyTo ) ); 386 } 387 } catch( AddressException ex ) { 388 String errMsg = "Address Exception: "; 389 throw new RuntimeException( errMsg,ex ); 390 } catch ( MessagingException mex ) { 391 String errMsg = "MessagingException: "; 392 throw new RuntimeException( errMsg,mex ); 393 } 394 } 395 396 /** 397 * タイトルをセãƒ?ƒˆã—ã¾ã™ã? 398 * 399 * @param subject タイトル 400 */ 401 public void setSubject( final String subject ) { 402 // Servlet ã‹ã‚‰ã®èªã¿è¾¼ã¿ã¯ã€iso8859_1 ã§ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•ã‚ŒãŸæ–?—㌠403 // ã‚»ãƒ?ƒˆã•れるã?ã§ã€ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰ã«å¤‰æ›´ã—ã¦ãŠã‹ãªã?¨æ–?—化ã‘ã™ã‚‹ã? 404 // JRun 3.0 ã§ã¯ã€å•題ãªã‹ã£ãŸãŒã€tomcat3.1 ã§ã¯å•題ãŒã‚ã‚‹ã€? 405 try { 406 if( subject != null ) { 407 mimeMsg.setSubject( mcSet.encodeWord( subject ) ); 408 } 409 } catch( AddressException ex ) { 410 String errMsg = "Address Exception: "; 411 throw new RuntimeException( errMsg,ex ); 412 } catch ( MessagingException mex ) { 413 String errMsg = "MessagingException: "; 414 throw new RuntimeException( errMsg,mex ); 415 } 416 } 417 418 /** 419 * 添付ファイルåé?列をセãƒ?ƒˆã—ã¾ã™ã? 420 * 421 * @param fname 添付ファイルåé?åˆ? 422 */ 423 public void setFilename( final String[] fname ) { 424 if( fname != null && fname.length > 0 ) { 425 int size = fname.length; 426 filename = new String[size]; 427 System.arraycopy( fname,0,filename,0,size ); 428 } 429 } 430 431 /** 432 * メãƒ?‚»ãƒ¼ã‚¸(本æ–?ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 433 * 434 * @param msg メãƒ?‚»ãƒ¼ã‚¸(本æ–? 435 */ 436 public void setMessage( final String msg ) { 437 // ãªãœã‹ã€ãƒ¡ãƒ?‚»ãƒ¼ã‚¸ã®æœ?¾Œã?ã€?CR><LF>ã‚’ã‚»ãƒ?ƒˆã—ã¦ãŠãã€? 438 439 if( msg == null ) { message = CR; } 440 else { message = msg + CR; } 441 } 442 443 /** 444 * ãƒ?ƒãƒ?‚°æƒ??ã®è¡¨ç¤ºã‚’行ã†ã‹ã©ã?‹ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 445 * 446 * @param debug 表示有無[true/false] 447 */ 448 public void setDebug( final boolean debug ) { 449 session.setDebug( debug ); 450 } 451 452 /** 453 * æŒ?®šã•れãŸãƒ•ァイルをã?ルãƒãƒ‘ートã«è¿½åŠ?—ã¾ã™ã? 454 * 455 * @param fileStr マルãƒãƒ‘ートã™ã‚‹ãƒ•ァイルå? 456 */ 457 private void addMmpFile( final String fileStr ) { 458 try { 459 MimeBodyPart mbp = new MimeBodyPart(); 460 FileDataSource fds = new FileDataSource(fileStr); 461 mbp.setDataHandler(new DataHandler(fds)); 462 mbp.setFileName(MimeUtility.encodeText(fds.getName(), charset, "B")); 463 mbp.setHeader("Content-Transfer-Encoding", "base64"); 464 mmPart.addBodyPart(mbp); 465 } 466 catch( UnsupportedEncodingException ex ) { 467 String errMsg = "Multipart UnsupportedEncodingException: "; 468 throw new RuntimeException( errMsg,ex ); 469 } 470 catch ( MessagingException mex ) { 471 String errMsg = "MessagingException: "; 472 throw new RuntimeException( errMsg,mex ); 473 } 474 } 475 476 /** 477 * æŒ?®šã•ã‚ŒãŸæ–?—å?ã‚’ã?ルãƒãƒ‘ートã«è¿½åŠ?—ã¾ã™ã? 478 * 479 * @param textStr マルãƒãƒ‘ートã™ã‚‹æ–‡å—å? 480 */ 481 private void addMmpText( final String textStr ) { 482 try { 483 MimeBodyPart mbp = new MimeBodyPart(); 484 mbp.setText(textStr, charset); 485 mbp.setHeader("Content-Transfer-Encoding", mcSet.getBit()); 486 mmPart.addBodyPart(mbp, 0); 487 } 488 catch ( MessagingException mex ) { 489 String errMsg = "MessagingException: "; 490 throw new RuntimeException( errMsg,mex ); 491 } 492 } 493 494 /** 495 * æ–?—エンコードをè€??ã—㟠InternetAddress を作æ?ã—ã¾ã™ã? 496 * 497 * @param adrs オリジナルã®ã‚¢ãƒ‰ãƒ¬ã‚¹æ–?—å? 498 * 499 * @return æ–?—エンコードをè€??ã—㟠InternetAddress 500 */ 501 private InternetAddress getAddress( final String adrs ) { 502 final InternetAddress rtnAdrs ; 503 int sep = adrs.indexOf( '<' ); 504 if( sep >= 0 ) { 505 String address = adrs.substring( sep+1,adrs.indexOf( '>' ) ).trim(); 506 String personal = adrs.substring( 0,sep ).trim(); 507 508 rtnAdrs = mcSet.getAddress( address,personal ); 509 } 510 else { 511 try { 512 rtnAdrs = new InternetAddress( adrs ); 513 } 514 catch( AddressException ex ) { 515 String errMsg = "æŒ?®šã?アドレスをセãƒ?ƒˆã§ãã¾ã›ã‚“ã€? 516 + "adrs=" + adrs ; 517 throw new RuntimeException( errMsg,ex ); 518 } 519 } 520 521 return rtnAdrs ; 522 } 523 524 /** 525 * æ–?—エンコードをè€??ã—㟠InternetAddress を作æ?ã—ã¾ã™ã? 526 * ã“れã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹æ–?—é?列ã‹ã‚‰ã?InternetAddress é…å?を作æ?ã™ã‚‹ã€? 527 * コンビニエンスメソãƒ?ƒ‰ã§ã™ã? 528 * 処ç?ã®ã‚‚ã?ã¯ã€?getAddress( String ) をループã—ã¦ã?‚‹ã?‘ã§ã™ã? 529 * 530 * @param adrs アドレスæ–?—é?åˆ? 531 * 532 * @return æ–?—エンコード後ã?InternetAddressé…å? 533 * @see #getAddress( String ) 534 */ 535 private InternetAddress[] getAddress( final String[] adrs ) { 536 InternetAddress[] rtnAdrs = new InternetAddress[adrs.length]; 537 for( int i=0; i<adrs.length; i++ ) { 538 rtnAdrs[i] = getAddress( adrs[i] ); 539 } 540 541 return rtnAdrs ; 542 } 543 544 /** 545 * コマンドã‹ã‚‰å®Ÿè¡Œã§ãã‚‹ã€ãƒ†ã‚¹ãƒˆç”¨ã® main メソãƒ?ƒ‰ã§ã™ã? 546 * 547 * Usage: java org.opengion.fukurou.mail.MailTX <from> <to> <host> [<file> ....] 548 * ã§ã€è¤?•°ã®æ·»ä»˜ãƒ•ァイルをé?付ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã? 549 * 550 * @param args コマンド引数é…å? 551 * @throws Exception ãªã‚“らã‹ã?エラーãŒç™ºç”Ÿã—ãŸå?åˆã? 552 */ 553 public static void main( final String[] args ) throws Exception { 554 if(args.length < 3) { 555 LogWriter.log("Usage: java org.opengion.fukurou.mail.MailTX <from> <to> <host> [<file> ....]"); 556 return ; 557 } 558 559 String host = args[2] ; 560 String chset = "ISO-2022-JP" ; 561 562 MailTX sender = new MailTX( host,chset ); 563 564 sender.setFrom( args[0] ); 565 String[] to = { args[1] }; 566 sender.setTo( to ); 567 568 if( args.length > 3 ) { 569 String[] filename = new String[ args.length-3 ]; 570 for( int i=0; i<args.length-3; i++ ) { 571 filename[i] = args[i+3]; 572 } 573 sender.setFilename( filename ); 574 } 575 576 sender.setSubject( "メールé€ä¿¡ãƒ?‚¹ãƒ? ); 577 String msg = "ã“れã¯ãƒ?‚¹ãƒˆãƒ¡ãƒ¼ãƒ«ã§ã™ã?" + CR + 578 "ã?¾ãå—ä¿¡ã§ãã¾ã—ãŸã?" + CR; 579 sender.setMessage( msg ); 580 581 sender.sendmail(); 582 } 583 }