Spring-Boot-2x-十八邮件服务一文打尽

45次阅读

共计 3961 个字符,预计需要花费 10 分钟才能阅读完成。

前景介绍

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

大致思路

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

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

引入 POM

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

<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

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

# 这里的 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

编写邮件的实体类

/**
 * 邮件实体类
 * @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;

}

编写发送邮件的方法

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

  • 发送普通邮件
   
     /**
       * 发送普通邮件
       * @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 都属于该类型的邮件)

       /**
       * 发送 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 类中的类型来判断调用哪一个方法即可~

    /**
     * 对外开放的统一发送邮件方法
     * @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 文件

<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

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

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 方法

mail.setVariables(email.getVariables());

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

<!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