java 使用JavaMail 做异常邮件报警 ,支持163邮箱、outlook邮箱
2018-03-01 14:41
1171 查看
需求
想要使用邮件来监控服务器上的异常信息,当程序抛出指定自定义异常的时候将异常信息以邮件的形式发送到监控的邮箱。要求
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 4652、发送给别的邮箱可能会被当成垃圾邮件退信,请不要包含敏感字符
3、具体邮件的内容请自己修改美化
相关文章推荐
- Java-使用JavaMail发送一封邮件给用户邮箱功能实现
- Android使用UncaughtExceptionHandler捕获全局异常 android获取手机信息大全Java追加文件内容使用JavaMail发送邮件OkHttp获取系统时间
- 使用javaMail发送复杂邮件,支持附件发送
- java使用javamail读取邮箱(收件箱为例)
- 在红帽子下配置javamail服务器,使用外面的邮箱地址发送邮件失败
- 使用javaMail发送复杂邮件,支持附件发送
- 使用javaMail收邮件 支持附件下载
- 使用javaMail收邮件 支持附件下载
- [JAVA100例]047、使用JavaMail发送邮件
- Outlook异常之:无法使用邮件答录机(自动回复)功能
- 使用javamail出现java.net.SocketException: Network is unreachable: connect异常 解决方法
- [JAVA100例]048、使用JavaMail接收邮件
- Java与邮件系统交互之使用Socket验证邮箱是否存在
- 使用javamail出现java.net.SocketException: Network is unreachable: connect异常 解决方法
- 在Domino中使用Java系列实例1--在Lotus Domino中使用JavaMail实现高效外发邮件
- 使用JavaMail 代发邮件(测试邮箱:gmail)
- [JAVA100例]048、使用JavaMail接收邮件
- [JAVA100例]048、使用JavaMail接收邮件(java100例)
- java中使用自己的邮箱进行多人邮件发送
- 手把手教你设置foxmail客户端支持收发outlook.com邮箱里的邮件