1 49 50 package smtphandler; 51 52 import java.util.logging.*; 53 54 import java.util.Date ; 55 import java.util.Properties ; 56 57 import javax.mail.Authenticator ; 58 import javax.mail.Message ; 59 import javax.mail.Multipart ; 60 import javax.mail.Session ; 61 import javax.mail.Transport ; 62 import javax.mail.internet.AddressException ; 63 import javax.mail.internet.InternetAddress ; 64 import javax.mail.internet.MimeBodyPart ; 65 import javax.mail.internet.MimeMessage ; 66 import javax.mail.internet.MimeMultipart ; 67 68 94 public class SMTPHandler extends java.util.logging.Handler  95 { 96 static private final int DEFAULT_ERROR_CODE = 1; 97 static private final Formatter DEFAULT_FORMATTER = new SimpleFormatter(); 98 static private final Level DEFAULT_LEVEL = Level.WARNING; 99 static private final int DEFAULT_BUFFER_SIZE = 512; 100 static private final String name = SMTPHandler.class.getName(); 101 private String to; 102 private String from; 103 private String subject; 104 private String smtpHost; 105 private String smtpUsername; 106 private String smtpPassword; 107 private int bufferSize = DEFAULT_BUFFER_SIZE; 108 protected CyclicBuffer cb = new CyclicBuffer(bufferSize); 109 protected TriggeringRecordEvaluator evaluator; 110 111 public SMTPHandler() 112 { 113 final String prefix = SMTPHandler.class.getName(); 114 115 LogManager manager = LogManager.getLogManager(); 116 117 String strLevel = manager.getProperty(prefix + ".level"); 118 Level lev; 119 if (strLevel == null) 120 { 121 lev = DEFAULT_LEVEL; 122 } 123 try 124 { 125 lev = Level.parse(strLevel); 126 } 127 catch (Exception ex) 128 { 129 lev = DEFAULT_LEVEL; 130 } 131 setLevel(lev); 132 133 String strFormatterClassName = manager.getProperty(prefix + ".formatter"); 134 Formatter f = (Formatter) instantiateByClassName(strFormatterClassName, 135 DEFAULT_FORMATTER); 136 this.setFormatter(f); 137 138 139 setTo(manager.getProperty(prefix + ".to")); 140 setFrom(manager.getProperty(prefix + ".from")); 141 setSmtpHost(manager.getProperty(prefix + ".smtpHost")); 142 setSmtpUsername(manager.getProperty(prefix + ".smtpUsername")); 143 setSmtpPassword(manager.getProperty(prefix + ".smtpPassword")); 144 setSubject(manager.getProperty(prefix + ".subject")); 145 146 String strEvaluatorClassName = manager.getProperty(prefix + ".evaluatorClass"); 147 this.setEvaluatorClass(strEvaluatorClassName); 148 149 try 150 { 151 String strBufSize = manager.getProperty(prefix + ".bufferSize"); 152 setBufferSize(Integer.parseInt(strBufSize)); 153 } 154 catch (Exception ex) 155 { 156 setBufferSize(DEFAULT_BUFFER_SIZE); 157 } 158 159 } 160 161 162 166 public synchronized void publish(LogRecord record) 167 { 168 if (record == null) 169 { 170 return; 171 } 172 else if ( ! isLoggable(record)) 173 { 174 return; 175 } 176 else if (!checkEntryConditions()) 177 { 178 return; 179 } 180 181 cb.add(record); 182 183 if (evaluator.isTriggeringRecord(record)) 184 { 185 sendBuffer(); 186 } 187 } 188 189 195 protected boolean checkEntryConditions() 196 { 197 if (this.evaluator == null) 198 { 199 reportError( 200 "No TriggeringRecordEvaluator is set for handler [" 201 + name 202 + "].", 203 null, 204 DEFAULT_ERROR_CODE); 205 206 return false; 207 } 208 209 if (getTo() == null) 210 { 211 reportError( 212 "No 'To' email address set for handler [" 213 + name 214 + "].", 215 null, 216 DEFAULT_ERROR_CODE); 217 return false; 218 219 } 220 221 return true; 222 } 223 224 public synchronized void close() 225 { 226 } 228 229 protected InternetAddress getAddress(String addressStr) 230 { 231 try 232 { 233 return new InternetAddress (addressStr); 234 } 235 catch (AddressException e) 236 { 237 reportError("Could not parse address [" + addressStr + "].", 238 e, 239 DEFAULT_ERROR_CODE); 240 241 return null; 242 } 243 } 244 245 protected InternetAddress [] parseAddress(String addressStr) 246 { 247 try 248 { 249 return InternetAddress.parse(addressStr, true); 250 } 251 catch (AddressException e) 252 { 253 reportError("Could not parse address [" + addressStr + "].", 254 e, 255 DEFAULT_ERROR_CODE); 256 257 return new InternetAddress [0]; 258 } 259 } 260 261 264 public String getTo() 265 { 266 return to; 267 } 268 269 272 protected void sendBuffer() 273 { 274 277 Properties props = new Properties (System.getProperties()); 278 279 if (smtpHost != null) 280 { 281 props.put("mail.smtp.host", smtpHost); 282 } 283 284 Authenticator auth = null; 285 286 if (this.getSmtpUsername() != null) 287 { 288 auth = new UsernamePasswordAuthenticator( 289 this.getSmtpUsername(), 290 this.getSmtpPassword()); 291 props.put("mail.smtp.user", this.getSmtpUsername()); 292 props.put("mail.smtp.auth", "true"); 293 } 294 295 Session session = Session.getInstance(props, auth); 296 297 session.setDebug(true); 298 299 MimeMessage msg = new MimeMessage (session); 300 301 try 302 { 303 if (from != null) 304 { 305 msg.setFrom(getAddress(from)); 306 } 307 else 308 { 309 msg.setFrom(); 310 } 311 312 msg.setRecipients(Message.RecipientType.TO, parseAddress(to)); 313 314 if (subject != null) 315 { 316 msg.setSubject(subject); 317 } 318 319 MimeBodyPart part = new MimeBodyPart (); 320 321 StringBuffer sbuf = new StringBuffer (); 322 323 Formatter f = getFormatter(); 324 325 String head = f.getHead(this); 326 327 if (head != null) 328 { 329 sbuf.append(head); 330 } 331 332 int len = cb.length(); 333 334 for (int i = 0; i < len; i++) 335 { 336 LogRecord record = cb.get(); 337 sbuf.append(getFormatter().format(record)); 338 } 339 340 String tail = getFormatter().getTail(this); 341 342 if (tail != null) 343 { 344 sbuf.append(tail); 345 } 346 347 part.setContent(sbuf.toString(), getEmailContentType()); 348 349 Multipart mp = new MimeMultipart (); 350 mp.addBodyPart(part); 351 msg.setContent(mp); 352 353 msg.setSentDate(new Date ()); 354 355 Transport.send(msg); 356 } 357 catch (Exception ex) 358 { 359 this.reportError("sendBuffer", 360 ex, 361 DEFAULT_ERROR_CODE); 362 } 363 } 364 365 protected String getEmailContentType() 366 { 367 return "text/plain"; 368 } 369 370 373 public String getEvaluatorClass() 374 { 375 return (evaluator == null) ? null : evaluator.getClass().getName(); 376 } 377 378 381 public String getFrom() 382 { 383 return from; 384 } 385 386 389 public String getSubject() 390 { 391 return subject; 392 } 393 394 397 public String getSmtpHost() 398 { 399 return smtpHost; 400 } 401 402 public void flush() 403 { 404 } 406 407 410 public int getBufferSize() 411 { 412 return bufferSize; 413 } 414 415 419 public void setFrom(String from) 420 { 421 this.from = from; 422 } 423 424 428 public void setTo(String to) 429 { 430 this.to = to; 431 } 432 433 437 public void setSubject(String subject) 438 { 439 this.subject = subject; 440 } 441 442 449 public void setBufferSize(int bufferSize) 450 { 451 this.bufferSize = bufferSize; 452 cb.resize(bufferSize); 453 } 454 455 459 public void setSmtpHost(String smtpHost) 460 { 461 this.smtpHost = smtpHost; 462 } 463 464 471 public void setEvaluatorClass(String value) 472 { 473 evaluator = 474 (TriggeringRecordEvaluator) instantiateByClassName(value, new DefaultEvaluator()); 475 } 476 477 static Object instantiateByClassName(String strClassName, Object defaultObj) 478 { 479 Object result; 480 481 try 482 { 483 ClassLoader loader = Thread.currentThread().getContextClassLoader(); 484 Class clazz = loader.loadClass(strClassName); 485 result = clazz.newInstance(); 486 } 487 catch (Exception ex) 488 { 489 result = defaultObj; 490 } 491 return result; 492 493 } 494 public String toString() 495 { 496 StringBuffer sb = new StringBuffer (); 497 sb.append("SmtpHost="); 498 sb.append(String.valueOf(this.getSmtpHost())); 499 sb.append("\nFrom="); 500 sb.append(String.valueOf(this.getFrom())); 501 sb.append("\nTo="); 502 sb.append(String.valueOf(this.getTo())); 503 sb.append("\nSubject="); 504 sb.append(String.valueOf(this.getSubject())); 505 sb.append("\nFormatter="); 506 sb.append(String.valueOf(this.getFormatter())); 507 sb.append("\nLevel="); 508 sb.append(String.valueOf(this.getLevel())); 509 sb.append("\nBufferSize="); 510 sb.append(String.valueOf(this.getBufferSize())); 511 return sb.toString(); 512 } 513 514 515 public String getSmtpPassword() 516 { 517 return smtpPassword; 518 } 519 520 521 public void setSmtpPassword(String value) 522 { 523 this.smtpPassword = value; 524 } 525 526 527 public String getSmtpUsername() 528 { 529 return smtpUsername; 530 } 531 532 533 public void setSmtpUsername(String value) 534 { 535 this.smtpUsername = value; 536 } 537 538 } 539 540 class DefaultEvaluator implements TriggeringRecordEvaluator 541 { 542 552 public boolean isTriggeringRecord(final LogRecord record) 553 { 554 boolean result = false; 555 556 if (record == null) 557 { 558 result = false; 559 } 560 else if (record.getLevel() == null) 561 { 562 result = false; 563 } 564 else 565 { 566 result = record.getLevel().intValue() >= java.util.logging.Level.WARNING.intValue(); 567 } 568 569 return result; 570 } 571 572 573 } 574
| Popular Tags
|