需求
想要使用邮件来监控服务器上的异常信息,当程序抛出指定自定义异常的时候将异常信息以邮件的形式发送到监控的邮箱。
要求
1、发生异常时捕获异常信息
2、时实发送信息邮件到目标邮箱
解决方案
1、自定义一个基本的异常,其他的使用异常继承改异常
2、该异常的构造方法接收信息参数和具体异常实体,然后生成邮件信息,发送邮件
3、具体的程序发生异常时捕获抛出的异常,然后抛出一个自定义的基本异常的子类或他本身
自定义异常
用于异常信息采集和邮件发送
package exception;
import tool.MailTo;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* Created by yuyu on 2018/2/23.
* 基本的自定义异常,所有接下来的自定义异常继承这个类
*/
public class BaseException extends RuntimeException {
public BaseException(String message) {
super(message);
}
public BaseException(String message, Throwable cause) {
super(message, cause);
//将异常信息发送出去
String title="DOBEONE发生异常!";
ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream();
cause.printStackTrace(new java.io.PrintWriter(buf, true));
//设置发送信息
String body = "<h1>"+title+"</h1>"
+"<p>异常信息:"+message+"</p>"
+"<p>"+buf.toString()+"</p>";
try {
buf.close();
} catch (IOException e1) {
e1.printStackTrace();
}
//按实际需要选择
MailTo.sendMail163(title,body);//163邮箱
MailTo.sendMailOutLook(title,body);//outlook邮箱
}
}
邮件发送工具
支持163邮箱、outlook邮箱
package tool;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
/**
* 发送邮件工具类
* Created by yuyu on 2018/2/23.
*/
public class MailTo {
/**
* 发送邮件到自己的163邮箱
* @param title 需要传输的标题
* @param body 需要传输的内容
* @return
*/
public static boolean sendMail163(String title, String body) {
//设置参数
Properties props = new Properties();
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", 465);
//自定义信息
props.put("username", "xxxx@163.com");//你的邮箱
props.put("password", "xxxx");//你的密码
props.put("to", "xxxx@163.com");//接收的邮箱
return MailTo.send(props,title,body);
}
/**
* 发送邮件到gmail
* 国内网络无法访问(因为众所周知的原因)
* @param title 标题
* @param body 内容
* @return
*/
public static boolean sendMailGmail(String title, String body){
//设置参数
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//自定义信息
props.put("username", "xxxx@gmail.com");//你的邮箱
props.put("password", "xxxx");//你的密码
props.put("to", "xxxx@gmail.com");//接收的邮箱
return MailTo.send(props,title,body);
}
/**
* 发送邮件到outlook
* @param title 标题
* @param body 内容
* @return
*/
public static boolean sendMailOutLook(String title, String body){
//设置参数
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.outlook.com");
props.put("mail.smtp.port", "587");
//自定义信息
props.put("username", "xxxx@outlook.com");//你的邮箱
props.put("password", "xxxx");//你的密码
props.put("to", "xxxx@outlook.com");//接收的邮箱
return MailTo.send(props,title,body);
}
/**
* 获取系统当前的时间
* 以传入时间格式返回,传空返回默认格式
* @param format 时间格式
* @return
*/
private static String getTitleTimeFormat(String format){
if (format==null){
format="yyyy-MM-dd HH:mm:ss/SSS";
}
SimpleDateFormat df = new SimpleDateFormat(format);//设置日期格式
return df.format(new Date());// new Date()为获取当前系统时间
}
/**
* 发送邮件,获取参数,和标题还有内容
* @param props 参数
* @param title 标题
* @param body 内容
* @return
*/
private static Boolean send(Properties props, String title, String body){
//发送邮件地址
final String username=props.getProperty("username");
//发送邮件名称
final String password=props.getProperty("password");
//接收邮件地址
String to=props.getProperty("to");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(username));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(title+"("+MailTo.getTitleTimeFormat(null)+")");
message.setContent(body,"text/html;charset=utf-8");
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
System.out.println("发送完毕!");
return true;
}
}
测试
测试代码
package tool;
import exception.BaseException;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* Created by yuyu on 2018/2/23.
* 用于测试异常邮件发送
*/
public class MailToTest {
@Test
public void testCatch(){
try{
throw new BaseException("测试",new Exception());
}catch (Exception e){
e.printStackTrace();
}
}
}
测试截图
163邮件截图
outlook邮件截图
总结
1、虽然工具类中给出了gmail的方法,但是因为众所周知的原因无法访问的,请使用telnet命令检查您与服务器的连接,使用:telnet smtp.gmail.com 465
2、发送给别的邮箱可能会被当成垃圾邮件退信,请不要包含敏感字符
3、具体邮件的内容请自己修改美化