最近在做小程序项目,自行创建的springboot框架,完成以后决定加入一个发生异常自动发送邮件的功能,遂百度中查阅,谁知坑很深,很简单的配置几番尝试最终才搞定.现将自己整理的超简单方法分享,希望能够帮助到正在研究此项功能的同行.
1.由于springboot自带了logback等jar包 所以基于springboot框架想实现此功能只需要导入一个mail依赖即可,过多引入反而会各种冲突,(我被坑惨了)其他框架如mvc等还需正常导入相关的几个依赖,具体百度logback配置异常邮件即可参考,除了jar依赖部分,剩下的都是通用的
pom依赖加入:
        <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <version>1.4.7</version>
        </dependency>
2.建立logback文件 ,我的项目配置文件放在resources 然后在springboot的yml配置文件中配置相关 引入logback的配置文件
我的yml配置:
logging:
  config: classpath:logback.xml  #这里引入logbacxk配置文件 已经配置过logback的忽略
  level:
    root: info
debug: true
然后建立logback的xml的配置文件
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 默认的一些设置 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <!-- 日志文件变量 -->
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <!-- 控台配置 -->
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <!-- 文件配置 -->
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <!-- 邮件配置 -->
    <include resource="appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="MAIL"/>
    </root>
      <!-- 打印sql语句用 -->
<!--    <logger name="com.yzf.golf.mapper" level="DEBUG"/> -->
</configuration>
在同目录建立一个email的配置文件 不喜欢多弄个文件的 可以把两个配置文件合并写在一起这里我使用的是qq邮箱发送邮件 需要将相应的邮箱smtp服务开启 并且生成授权码 填到password处smtpHost smtp服务地址 smtpPort smtp服务端口 mailFrom username 填你用来发送邮件的邮箱账号 最好保持一致mailTo 要发送给的邮箱 多个用逗号隔开 password 填邮箱服务的授权码
特别注意password 不是密码 是授权码 from 和 username 要一致 不然会出现发送无效的情况
同时如果各项设置都正常就是无法发送邮件可以尝试修改端口号 我的qq邮箱就是 改成了587端口才能正常发送
appender.xml
<?xml version="1.0" encoding="UTF-8"?>
<included>

    <!--邮件设置-->
    <property name="smtpHost" value="smtp.qq.com"/>
    <property name="smtpPort" value="587"/>
    <property name="mailFrom" value="xxxx@qq.com"/>
    <property name="username" value="xxxx@qq.com"/>
    <property name="mailTo" value="xxx@xx.com,xxx@xx.com"/>
    <property name="password" value="pqijwowwqqvwbgcd"/>
    <property name="SSL" value="false"/>
    <property name="mailSubject" value="高尔夫小程序异常信息"/>
    <appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>${smtpHost}</smtpHost>
        <smtpPort>${smtpPort}</smtpPort>
        <username>${username}</username>
        <password>${password}</password>
        <SSL>${SSL}</SSL>
        <asynchronousSending>false</asynchronousSending>
        <to>${mailTo}</to>
        <from>${mailFrom}</from>
        <subject>${mailSubject}</subject>
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
        <!-- 这里配置的是邮件表格的形式 跟截图的邮件格式是一样 其实不加这一块也是样式也是一样的  但是可以自己研究自定义样式-->
        <Pattern>%date%level%thread%logger{0}%line%message</Pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

</included>
以上配置完成后启动一下项目 如果配置文件没有问题是可以正常启动项目的 如果报logback配置错误无法其中之类的 请仔细排查配置文件是否写错 或引入错误
现在我们就具备了发送异常邮件的功能 但是还缺少一个至关重要的环节 就是发生异常后如何触发并发送邮件
这里我的思路是新建一个全局异常捕获类 用来捕捉异常 然后发送邮件 里面有一段是用来从quest中抓取客户端ip的方法 各位可以忽略 重点是 logger.error(e.getMessage(), e); 从Exception 中获取异常内容 并发送html格式的邮件
/**
 * 
 */
package com.yzf.golf.controller;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.yzf.golf.util.IpAddrUtil;

/**
 * @ClassName: MyExceptionHandler 
 * @author 于占峰
 * @Description: TODO(全局异常捕捉并发送邮件通知) 
 * @date 2019年8月30日 上午9:48:32
 */
@ControllerAdvice
public class MyExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);
    public static final String ERROR_VIEW = "error";
    @ExceptionHandler(value = Exception.class)
    public void errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
        e.printStackTrace();
        String ip = IpAddrUtil.getRequestIpAddr(request);
//      ip = IpAddrUtil.GetIpAddr(ip);
        System.out.println("开始发送异常邮件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        System.out.println(e.getMessage());
        logger.error("ip:"+ ip +e.getMessage(), e);
        System.out.println("发送完成+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    }
}
完成以上步骤我们就大功告成了
当项目发生异常时会被异常捕捉类捕获 然后获取详细信息并发送邮件
具体深层实现方法并未了解 如有比较理解的道友还请多多交流
现在可以尝试手动触发异常看看是否发送邮件
贴一个我的异常邮件效果
在这里插入图片描述
这里贴一个自主触发的控制层 可以通过地址栏请求触发异常,在其他网友的帖子内找到的 再次感谢无私的网友们~!!!
package com.yzf.golf.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RequestMapping("/app")
@RestController
public class appController {
    private Logger logger = LoggerFactory.getLogger(appController.class);

    @RequestMapping
    public String selectList() {
        boolean flag = new Random().nextBoolean();
        if (flag) {
            throw new RuntimeException("测试报错");
        } else {
            return "正常返回 当前时间:" + System.currentTimeMillis();
        }
    }

//    @ExceptionHandler
//    @ResponseBody
//    public String exceptionHandler(Exception e) {
//        System.out.println("开始发送异常邮件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
//        System.out.println(e.getMessage());
//        logger.error(e.getMessage(), e);
//        System.out.println("发送完成");
//        return e.getMessage();
//     }
}