火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

自定义SMTPAppender的源码

Posted on 2007-04-14 20:52  剑廿三  阅读(418)  评论(0编辑  收藏  举报
http://blog.csdn.net/Didizyp/archive/2005/08/28/466726.aspx

package piv.zheng.log4j.test;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ErrorCode;
import java.util.Properties;
import java.util.Date;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.Multipart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.AddressException;

public class SMTPAppender extends AppenderSkeleton {
  
private String to; //收件人
  private String from; // 发件人
  private String subject; //邮件标题
  private String smtpHost; //邮件服务器
  private String auth; //身份验证标识
  private String username; //用户
  private String password; //密码
  private boolean locationInfo = false;

  
protected Session ses;
  
protected Message msg;
  
protected Properties props;

  
public SMTPAppender() {}

  
public SMTPAppender(Layout layout) {

    
this.layout = layout;

  }


  
//应用设置
  public void activateOptions() {
    props 
= new Properties(System.getProperties());
    
if (smtpHost != null{
      props.put(
"mail.smtp.host", smtpHost);
    }

    
if (auth != null{
      props.put(
"mail.smtp.auth", auth);
    }

    
if (username != null{
      props.put(
"username", username);
    }

    
if (password != null{
      props.put(
"password", password);
    }

    ses 
= Session.getInstance(props); //创建session
    
    msg 
= new MimeMessage(ses); //创建message
    
    
try {
      
//为message设置发件人
      if (from != null{
        msg.setFrom(getAddress(from));
      }
 else {
        msg.setFrom();
    }

    
    
//为message设置收件人
    if (to != null{
      msg.setRecipients(Message.RecipientType.TO, parseAddress(to));
    }

    
    
//为message设置标题
    if (subject != null{
      msg.setSubject(subject);
    }

    }
 catch (MessagingException e) {
      LogLog.error(
"Could not activate SMTPAppender options.", e);
    }

  }

  
  
//重写执行方法,当执行日志输出时会被调用
  public void append(LoggingEvent event) {
    
//检查message及layout
    if (!checkEntryConditions()) {
      
return;
    }

    
    event.getThreadName();
    event.getNDC();
    
if (locationInfo) {
      event.getLocationInformation();
    }

    
    
//发送邮件
    sendBuffer(event);
  }

  
  
protected boolean checkEntryConditions() {
    
if (this.msg == null{
      errorHandler.error(
"Message object not configured.");
      
return false;
    }

    
    
if (this.layout == null{
      errorHandler.error(
"No layout set for appender named [" + name + "].");
      
return false;
    }

    
return true;
  }

  
  
synchronized public void close() {
    
this.closed = true;
  }

  
  InternetAddress getAddress(String addressStr) 
{
    
try {
      
return new InternetAddress(addressStr);
    }
 catch (AddressException e) {
      errorHandler.error(
"Could not parse address [" + addressStr + "].", e, ErrorCode.ADDRESS_PARSE_FAILURE);
      
return null;
    }

  }

  
  InternetAddress[] parseAddress(String addressStr) 
{
    
try {
      
return InternetAddress.parse(addressStr, true);
    }
 catch (AddressException e) {
      errorHandler.error(
"Could not parse address [" + addressStr + "].", e, ErrorCode.ADDRESS_PARSE_FAILURE);
      
return null;
    }

  }

  
  
public boolean requiresLayout() {
    
return true;
  }

  
  
//发送邮件
  protected void sendBuffer(LoggingEvent event) {
    
try {
      
//将日志信息设置到message中
      MimeBodyPart part = new MimeBodyPart();
      
      StringBuffer sbuf 
= new StringBuffer();
      String t 
= layout.getHeader();
      
if (t != null{
        sbuf.append(t);
      }

      sbuf.append(layout.format(event));
      
if (layout.ignoresThrowable()) {
        String[] s 
= event.getThrowableStrRep();
        
if (s != null{
          
for (int j = 0; j < s.length; j++{
            sbuf.append(s[j]);
          }

        }

      }

      t 
= layout.getFooter();
      
if (t != null{
        sbuf.append(t);
      }

      part.setContent(sbuf.toString(), layout.getContentType());
      
      Multipart mp 
= new MimeMultipart();
      mp.addBodyPart(part);
      
      msg.setContent(mp); 
//为message设置内容,即日志信息
      msg.setSentDate(new Date()); //为message设置发送时间
      
      
//发送邮件
      Transport tr = ses.getTransport("smtp");
      tr.connect(smtpHost, username, password);
      tr.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
      tr.close();
    }
 catch (Exception e) {
      LogLog.error(
"Error occured while sending e-mail notification.", e);
    }

  }

  
  
public void setTo(String to) {
    
this.to = to;
  }

  
  
public String getTo() {
    
return to;
  }

  
  
public void setFrom(String from) {
    
this.from = from;
  }

  
  
public String getFrom() {
    
return from;
  }

  
  
public String getSubject() {
    
return subject;
  }

  
  
public void setSubject(String subject) {
    
this.subject = subject;
  }

  
  
public void setSMTPHost(String smtpHost) {
    
this.smtpHost = smtpHost;
  }

  
  
public String getSMTPHost() {
    
return smtpHost;
  }

  
  
public void setAuth(String auth) {
    
this.auth = auth;
  }

  
  
public String getAuth() {
    
return auth;
  }

  
  
public void setUsername(String username) {
    
this.username = username;
  }

  
  
public String getUsername() {
    
return username;
  }

  
  
public void setPassword(String password) {
    
this.password = password;
  }

  
  
public String getPassword() {
    
return password;
  }

  
  
public void setLocationInfo(boolean locationInfo) {
    
this.locationInfo = locationInfo;
  }

  
  
public boolean getLocationInfo() {
    
return locationInfo;
  }

}