网站首页 文章专栏 spring boot接入QQ邮箱,程序异常,用户留言邮箱通知
spring boot接入QQ邮箱,程序异常,用户留言邮箱通知


 摘要:日志对于开发者来说相当重要了,及时的邮件通知能避免很多损失,邮件通知可以有其他方式实现,比如通过LogBack日志框架来进行邮件通知,这种方式只能发错误日志信息,不够通用,本博客使用一个通用邮件工具类,还可以给其他模块使用,spring boot接入邮箱发送特别简单,相对其他框架真心省去不少步骤。

一,准备工作

1,进入qq邮箱的 设置 > 账户 里面,打开 IMAP/SMTP服务,开启后才能在别的客户端使用该qq邮箱发邮件

mail.png

2,获取授权码,并记录。

二,引入maven依赖,设置账号密码

1,在pom.xml里面引入以下

        
	    org.springframework.boot
	    spring-boot-starter-mail	

2,到application.yml里面配置mail

spring:
    mail:
      host: smtp.qq.com
      username: 你的邮箱
      password: 授权码
      properties:
        mail:
          smtp:
            auth: true
            starttls:
              enable: true
              required: true

注意:

    username就是未来发信时的邮箱地址。

    password项并不是填写qq邮箱密码,而是我们上面生成的授权码。

三,发送邮件代码

@Service
@Slf4j
public class MailService {

    @Autowired
    private JavaMailSender sender;

    @Value("${spring.mail.username}")
    private String from;

    /**
     * 发送纯文本的简单邮件
     * 
     */
    public void sendSimpleMail(String to, String subject, String content){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);

        try {
            sender.send(message);
            log.info("简单邮件已经发送。");
        } catch (Exception e) {
            log.error("发送简单邮件时发生异常!", e);
        }
    }

    /**
     * 发送html格式的邮件
     */
    public void sendHtmlMail(String to, String subject, String content){
        MimeMessage message = sender.createMimeMessage();

        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            sender.send(message);
            log.info("html邮件已经发送。");
        } catch (MessagingException e) {
            log.error("发送html邮件时发生异常!", e);
        }
    }

    /**
     * 发送带附件的邮件
     * @param to
     * @param subject
     * @param content
     * @param filePath
     */
    public void sendAttachmentsMail(String to, String subject, String content, String filePath){
        MimeMessage message = sender.createMimeMessage();

        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);

            sender.send(message);
            log.info("带附件的邮件已经发送。");
        } catch (MessagingException e) {
            log.error("发送带附件的邮件时发生异常!", e);
        }
    }

    /**
     * 发送嵌入静态资源(一般是图片)的邮件
     * @param to
     * @param subject
     * @param content 邮件内容,需要包括一个静态资源的id,比如:     * @param rscPath 静态资源路径和文件名
     * @param rscId 静态资源id
     */
    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
        MimeMessage message = sender.createMimeMessage();

        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);

            sender.send(message);
            log.info("嵌入静态资源的邮件已经发送。");
        } catch (MessagingException e) {
            log.error("发送嵌入静态资源的邮件时发生异常!", e);
        }
    }
}

然后测试一下:

test.png

re.png

邮件已经发送成功了。

四,全局异常处理并发送邮件

1,新建一个异常处理类

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    
    @Autowired
    private MailService mailService;
    private static final String sendTo = "112xxxxxxxxx@qq.com";

    
    // 这里我捕捉的是自定义的异常,也可以直接捕捉Exception
    @ExceptionHandler(value = ServiceException.class)
    @ResponseBody
    public Map errorHandler(HttpServletRequest request, Exception e){
        Map map = new HashMap();
        map.put("code", 0);
        map.put("msg", e.getMessage());
        String errorStr = log(e, request);

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        //发送邮件
        mailService.sendSimpleMail(sendTo, "【星尘阁】程序异常,请检查服务器",errorStr + "\r\n" + sw.toString());

        return map;
    }

    private String log(Exception ex, HttpServletRequest request) {
        String errorStr = "";

        errorStr += "请求地址:" + request.getRequestURL() + "\n";

        errorStr += "请求ip:" + IpUtil.getIpAddr(request) + "\n";

        errorStr += "浏览器信息:" + IpUtil.getOsAndBrowserInfo(request) + "\n";

        Enumeration enumeration = request.getParameterNames();
        errorStr += "请求参数:" + "\n";
        while (enumeration.hasMoreElements()) {
            String name = enumeration.nextElement().toString();
            errorStr += name + ":" + request.getParameter(name) + "\n";
        }
        log.error(errorStr);
        return errorStr;
    }
}

附录一个获取用户浏览器信息工具类:

public static String getOsAndBrowserInfo(HttpServletRequest request){
    String browserDetails = request.getHeader("User-Agent");
    String userAgent = browserDetails;
    String user = userAgent.toLowerCase();

    String os = "";
    String browser = "";

    //=================OS Info=======================
    if (userAgent.toLowerCase().indexOf("windows") >= 0 )
    {
        os = "Windows";
    } else if(userAgent.toLowerCase().indexOf("mac") >= 0)
    {
        os = "Mac";
    } else if(userAgent.toLowerCase().indexOf("x11") >= 0)
    {
        os = "Unix";
    } else if(userAgent.toLowerCase().indexOf("android") >= 0)
    {
        os = "Android";
    } else if(userAgent.toLowerCase().indexOf("iphone") >= 0)
    {
        os = "IPhone";
    }else{
        os = "UnKnown, More-Info: "+userAgent;
    }
    //===============Browser===========================
    if (user.contains("edge"))
    {
        browser=(userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
    } else if (user.contains("msie"))
    {
        String substring=userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
        browser=substring.split(" ")[0].replace("MSIE", "IE")+"-"+substring.split(" ")[1];
    } else if (user.contains("safari") && user.contains("version"))
    {
        browser=(userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]
                + "-" +(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
    } else if ( user.contains("opr") || user.contains("opera"))
    {
        if(user.contains("opera")){
            browser=(userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]
                    +"-"+(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
        }else if(user.contains("opr")){
            browser=((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
                    .replace("OPR", "Opera");
        }

    } else if (user.contains("chrome"))
    {
        browser=(userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
    } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1)  ||
            (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) ||
            (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1) )
    {
        browser = "Netscape-?";

    } else if (user.contains("firefox"))
    {
        browser=(userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
    } else if(user.contains("rv"))
    {
        String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
        browser="IE" + IEVersion.substring(0,IEVersion.length() - 1);
    } else
    {
        browser = "UnKnown, More-Info: "+userAgent;
    }

    return os +" --- "+ browser ;
}

五,测试,以及注意点

在controller里面随便搞个错误,运行一下,发现邮件已经发送过来了

exc.png



 注意点: 

我在本地跑可以发送邮件,到服务器上就报错了,连接超时,查找信息得知,腾讯云服务器的25端口默认是被封住的,到腾讯云控制台解封下就行了。

25.png





版权声明:本文由星尘阁原创出品,转载请注明出处!

本文链接:http://www.52xingchen.cn/detail/42




赞助本站,网站的发展离不开你们的支持!
来说两句吧
最新评论