Spring Boot 2.x(十八):邮件服务一文打尽

2019-07-22 15:41:26 浏览数 (1)

前景介绍

在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。

大致思路

我们要做的其实就是把Java程序作为一个客户端,然后通过配置SMTP协议去连接我们所使用的发送邮箱(from)对应的SMTP服务器,然后通过SMTP协议,将邮件转投到目标邮箱(to)对应的SMTP服务器,最后将该邮件分发到目标邮箱

Spring Boot给我们集成了邮件的相关服务,并给出了对应的starter,这里我们来实战学习一下邮件服务是怎么玩的。

引入POM

万年不变的第一步:引入所需要的starter依赖,这里我采用的是和我的Spring Boot对应的版本2.1.4,其余版本的话应该是相差不大,可以同样作为借鉴

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>

配置文件

这里由于国内有几大邮箱运营商,所以分为四种不同的情况来说明

QQ邮箱

QQ邮箱是比较麻烦的一种,需要登录到邮箱中找到对应的配置,并验证密码后开启STMP服务

点击这里可以去获取对应的授权码,后面的配置中我们会用到~

个人QQ邮箱的SMTP服务器的host是:smtp.qq.com

  • 163邮箱 对应的授权码就是我们邮箱的密码~ SMTP服务器的host是:smtp.163.com
  • 腾讯企业邮箱 对应的授权码也是我们邮箱的密码 企业的和个人的host略有不同:smtp.exmail.qq.com
  • 阿里企业邮箱 对应的授权码也是我们邮箱的密码 阿里的企业邮箱host是: smtp.mxhichina.com

得到对应的信息之后,我们就可以去完善我们的配置信息了 ~

代码语言:javascript复制
# 这里的host对应是上面的几大运营商的STMP服务器的host
spring.mail.host=smtp.163.com
spring.mail.username=****@163.com
# 这里的password对应的就是上面的授权码
spring.mail.password=*** 
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8

编写邮件的实体类

代码语言:javascript复制
/**
 * 邮件实体类
 * @author vi
 * @since 2019/07/17
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mail {

    /**
     * 邮件发送人
     */
    private String from;

    /**
     * 邮件接收人
     */
    private String to;

    /**
     * 邮件主题
     */
    private String subject;

    /**
     * 邮件内容
     */
    private String content;

    /**
     * 邮件主题
     */
    private String type;

    /**
     * 发送邮件模板时的模板文件名
     */
    private String templateName;

    /**
     * 模板参数
     */
    private Map<String,Object> variables;

    /**
     * 附件地址
     */
    private String attachPath;

}

编写发送邮件的方法

在这里,我将发送邮件分为了两种情况:

  • 发送普通邮件
代码语言:javascript复制
     /**
       * 发送普通邮件
       * @param email 邮件对象
       */
      private static void sendSimpleMail(Mail email) {
          SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  //        邮件发送人
          simpleMailMessage.setFrom(email.getFrom());
  //        邮件接收人
          simpleMailMessage.setTo(email.getTo());
  //        邮件主题
          simpleMailMessage.setSubject(email.getSubject());
  //        邮件内容
          simpleMailMessage.setText(email.getContent());
  //        发送邮件
          javaMailSender.send(simpleMailMessage);
      }
  • 发送MIME类型邮件(比如模板,附件,HTML都属于该类型的邮件)
代码语言:javascript复制
     /**
       * 发送MIME类型的邮件
       * @param email 邮件对象
       */
      private static void sendMimeMail(Mail email) {
  //        生成邮件字符串
          String content = email.getContent();
          if (email.getVariables() != null) {
              content = generate(email);
          }
  //        基于这个对象可以发送HTML,或者携带附件的二进制邮件
          MimeMessage message= javaMailSender.createMimeMessage();
          try {
  //            构建发送模板邮件的对象
              MimeMessageHelper helper = new MimeMessageHelper(message,true);
  //            设置发送邮箱
              helper.setFrom(email.getFrom());
  //            设置接收邮箱
              helper.setTo(email.getTo());
  //            设置邮件名(主题)
              helper.setSubject(email.getSubject());
  //            设置邮件内容
              helper.setText(content,true);
  //            这里可以发送带有附件的邮件,如果没有附件可以省略,就不在多做描述
              if (!StringUtils.isNullOrEmpty(email.getAttachPath())) {
                  FileSystemResource file = new FileSystemResource(new File(email.getAttachPath()));
                  helper.addAttachment(file.getFilename(), file);
              }
  //            发送邮件
              javaMailSender.send(message);
          } catch (MessagingException e) {

          }
      }


     /**
       * 生成模板字符串
       * @param email 邮件对象
       * @return
       */
      private static String generate(Mail email) {
          Context context = new Context();
  //        设置模板参数
          context.setVariables(email.getVariables());
  //        加载模板后的内容字符串
          return templateEngine.process(email.getTemplateName(), context);
      }

最后可以把这两个方法统一接口,通过Mail类中的类型来判断调用哪一个方法即可~

代码语言:javascript复制
    /**
     * 对外开放的统一发送邮件方法
     * @param mail
     */
    public static void sendEmail(Mail mail) {
        String  type = mail.getType();
        switch (type) {
            case "1":
                sendSimpleMail(mail);
            case "2":
                sendMimeMail(mail);
        }
    }

关于模板的一些补充

如果我们需要发送模板邮件的话,需要使用到模板引擎freemaker或thymeleaf,这里我拿thymeleaf来说一下~

第一步,可以引入pom文件

代码语言:javascript复制
<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

第二步,需要在配置文件中进行配置

代码语言:javascript复制
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8

第三步,通过我们获取到的模板参数对Mail类进行set方法

代码语言:javascript复制
mail.setVariables(email.getVariables());

第四步,我们需要在模板中去使用参数

代码语言:javascript复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>
<body>
<h3 style="color: red;" th:text="${username}"></h3>
</body>
</html>

注意,这里的thymeleaf的用法,使用标签th:text来赋值,更多的模板用法,可以去查阅thymeleaf的用法~

后记

邮件在这里就告一段落了,下篇预告:JVM系列(一):JVM简介,敬请期待,谢谢大家一直以来的支持!戳原文查看源码!

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知!

0 人点赞