zoukankan      html  css  js  c++  java
  • Spring Boot 2.x (十八):邮件服务一文打尽

    前景介绍

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

    大致思路

    我们要做的其实就是把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的用法~

    公众号

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

  • 相关阅读:
    url中特殊字符被转义成编码后如何处理
    解决:扰人的报错 Input length must be multiple of 8 when decrypting with padded cipher
    使用fastjson 进行jsonObject转实体类对象
    Mybatis之foreach遍历Map
    Map对象中的keyset()、entryset()和Map.Entry
    jdk的keytool生成jks和获取jks的信息,公匙
    postgres如何不插入重复的值
    docker查看日志记录
    Git Bash输错账号密码如何重新输入
    IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
  • 原文地址:https://www.cnblogs.com/viyoung/p/11205018.html
Copyright © 2011-2022 走看看