java|SpringBoot统一异常处理并发送邮件给对应的开发者

起因

  • 为什么要做这个功能,因为发现开发者平时不看服务器日志出现异常才看还要上服务器查log,后来想起为什么不发送短信告知程序开发者,短信接口是收费的成本太高,于是可以用邮件代替短信这样既省了短信费用也能实时告知开发者你的程序出行了异常可以在生产环境快速定位问题出现的位置
  • 下面贴上实现的代码
setp 1
  • 引入email pom文件
    org.springframework.boot spring-boot-starter-mail

setp 2
  • 自定义注解
    package com.jx.esb.producer.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @ClassName: Developer * @Description: TODO(开发者邮箱) * @author gangyu2 * @date 2019年7月18日 下午5:42:11 * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DeveloperEmail { String email() default ""; }

setp 3
  • 实现一个拦截器
    package com.jx.esb.producer.handle; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import com.jx.esb.producer.annotation.DeveloperEmail; /** * @ClassName: TokenHandlerInterceptor * @Description: TODO(token验证) * @author gangyu2 * @date 2019年5月13日 下午4:29:25 */ @Component public class EmailHandlerInterceptor implements HandlerInterceptor{ Logger logger=LoggerFactory.getLogger(TokenHandlerInterceptor.class); public static EMAIL="email"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { DeveloperEmail email = ((HandlerMethod) handler).getMethodAnnotation(DeveloperEmail.class); if (handler.getClass().isAssignableFrom(HandlerMethod.class)) { if(email != null) { request.setAttribute(EMAIL, email.email()); } return true; } else { return true; } } }

setp 4
  • application-dev.properties 配置邮箱
    ##############################[邮箱 配置]################################################### spring.mail.host=smtp.qq.com spring.mail.username=597205393@qq.com spring.mail.password=你的授权码 spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=false spring.mail.properties.mail.smtp.starttls.required=false ##############################[邮箱 配置]###################################################

  • 实现邮箱服务
    package com.jx.esb.producer.impl; import java.io.File; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; @Service public class MailUtil { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private JavaMailSender sender; @Value("${spring.mail.username:''}") private String from; /** * 发送纯文本的简单邮件 * @param to * @param subject * @param content */ public void sendSimpleMail(String to, String subject, String content){ SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from); message.setTo(new String[] {to,from}); //默认抄送给自己主邮箱就是我自己的号 message.setSubject(subject); message.setText(content); try { sender.send(message); logger.info("简单邮件已经发送。"); } catch (Exception e) { logger.error("发送简单邮件时发生异常!", e); } } /** * 发送html格式的邮件 * @param to * @param subject * @param content */ 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); logger.info("html邮件已经发送。"); } catch (MessagingException e) { logger.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); logger.info("带附件的邮件已经发送。"); } catch (MessagingException e) { logger.error("发送带附件的邮件时发生异常!", e); } } /** * 发送嵌入静态资源(一般是图片)的邮件 * @param to * @param subject * @param content 邮件内容,需要包括一个静态资源的id,比如:java|SpringBoot统一异常处理并发送邮件给对应的开发者
    文章图片

    在也不用担心服务报错找不人处理了

    推荐阅读