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;
}
}
闽公网安备 35060202000074号