package com.baidu.dsp.common.utils.email;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baidu.disconf.web.config.ApplicationPropertyConfig;
import com.baidu.disconf.web.service.user.dto.Visitor;
import com.baidu.ub.common.commons.ThreadContext;
/**
* @author liaoqiqi
* @version 2014-4-8
*/
@Service
public class LogMailBean {
protected static final Logger LOG = LoggerFactory.getLogger(LogMailBean.class);
/**
* 发送报警邮件中标题的最大长度,255
*/
public static final int ALARM_MAIL_TITLE_LENGTH = 255;
/**
* 发送报警邮件中邮件标题信息
*/
public static final String ALARM_MAIL_TITLE = "fatal message mail ";
@Autowired
private ApplicationPropertyConfig emailProperties;
@Autowired
private MailBean mailBean;
/**
* 得到系统当前的运行时间,并格式化
*
* @return
*/
private static String getSystemDate() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss");
return sdf.format(date);
}
/**
*
*/
public void sendLogExceptionEmail(String message, Throwable e) {
StringBuffer titleBuffer = new StringBuffer();
StringBuffer logInfo = new StringBuffer();
StringBuffer mailInfo = new StringBuffer();
//
// 确定 标题
//
Visitor visitor = ThreadContext.getSessionVisitor();
if (null != visitor) {
titleBuffer.append("Current Login UcId: " + visitor.getId());
titleBuffer.append(" ");
}
if (message != null) {
titleBuffer.append(message);
} else if (e != null && e.getMessage() != null) {
titleBuffer.append(e.getMessage());
}
String title = titleBuffer.toString();
String systemDate = getSystemDate();
logInfo.append(systemDate);
logInfo.append("\t");
logInfo.append(title);
mailInfo.append(systemDate);
mailInfo.append("\t");
mailInfo.append(title);
//
// 出错内容
//
if (null != e) {
logInfo.append("\n");
logInfo.append(getExceptionInfo(e, systemDate, "\n", "\t"));
mailInfo.append("<br>");
mailInfo.append(getExceptionInfo(e, systemDate, "<br>", "\t"));
}
sendErrorMail(mailInfo.toString(), title);
}
/**
* 发送HTML邮箱
*
* @return
*/
public boolean sendHtmlEmail(String toEmail, String title, String content) {
LOG.info("send to " + toEmail);
LOG.info("title: " + title);
LOG.info("content" + content);
if (StringUtils.isBlank(toEmail)) {
return false;
}
String localName = "";
Visitor visitor = ThreadContext.getSessionVisitor();
if (visitor != null) {
LOG.info(visitor.toString());
localName += visitor.getLoginUserName() + " ";
}
try {
InetAddress addr = InetAddress.getLocalHost();
localName += addr.getHostName().toString();
} catch (UnknownHostException e) {
LOG.warn("When send alarm mail,we can't get hostname", e);
}
String mailTitle = localName + "/" + getSystemDate();
int len = 0;
int lenLimit = ALARM_MAIL_TITLE_LENGTH;
if (title != null) {
len = title.length();
if (len > lenLimit) {
len = lenLimit;
}
mailTitle += title.substring(0, len);
}
String mailTo = toEmail;
String mailFrom = emailProperties.getFromEmail();
String[] mailToList = mailTo.split(";");
if (content == null) {
return false;
} else {
try {
mailBean.sendHtmlMail(mailFrom, mailToList, mailTitle, content);
} catch (Exception e) {
LOG.error("When send alarm mail,we can't send it", e);
return false;
}
}
return true;
}
/**
* 获取异常信息
*/
private String getExceptionInfo(Throwable e, String systemDate, String newLineToken, String tabToken) {
StringBuffer info = new StringBuffer();
info.append(systemDate);
info.append(tabToken);
info.append("cause by: ");
info.append(e.getClass().getName() + "--");
info.append(e.getMessage());
info.append(newLineToken);
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
info.append(systemDate);
info.append(tabToken);
info.append(stackTraceElement);
info.append(newLineToken);
}
if (null != e.getCause() && e.getCause() instanceof Exception) {
info.append(getExceptionInfo((Exception) e.getCause(), systemDate, newLineToken, tabToken));
}
return info.toString();
}
/**
* 发送报警邮件,邮件名称,发送人,接收人在constants中定义
*
* @param content 邮件内容
*
* @return
*/
private boolean sendErrorMail(String content, String title) {
String localName = "";
try {
InetAddress addr = InetAddress.getLocalHost();
localName = addr.getHostName().toString();
} catch (UnknownHostException e) {
LOG.warn("When send alarm mail,we can't get hostname", e);
}
String mailTitle = localName + " /" + ALARM_MAIL_TITLE + "/" + getSystemDate();
int len = 0;
int lenLimit = ALARM_MAIL_TITLE_LENGTH;
if (title != null) {
len = title.length();
if (len > lenLimit) {
len = lenLimit;
}
mailTitle += title.substring(0, len);
}
String mailTo = emailProperties.getEmailReceiver();
String mailFrom = emailProperties.getFromEmail();
String[] mailToList = mailTo.split(";");
if (content == null) {
return false;
} else {
try {
mailBean.sendHtmlMail(mailFrom, mailToList, mailTitle, content);
} catch (Exception e) {
LOG.warn("When send alarm mail,we can't send it", e);
return false;
}
}
return true;
}
}