资讯专栏INFORMATION COLUMN

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

idealcn / 2083人阅读

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

前景介绍

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

大致思路

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

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

引入POM

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


    org.springframework.boot
    spring-boot-starter-mail
    2.1.4.RELEASE
配置文件

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

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 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文件


         org.springframework.boot
         spring-boot-starter-thymeleaf

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

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());

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




    
    Insert title here


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

查阅thymeleaf的用法~

后记

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

公众号

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76150.html

相关文章

  • SpringBoot 实战 (十八) | 整合 MongoDB

    摘要:前言如题,今天介绍下是如何整合的。存储结构如下男一个优秀的废人准备工作创建一个名为的数据库,不会建的。层实现类添加学生信息根据删除学生信息更新学生信息根据查询学生信息查询学生信息列表层测试结果测试已经全部通过,这里仅展示了保存操作。 微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。 showImg(https://segmentfault.com/img/remote...

    QLQ 评论0 收藏0
  • SpringBoot 实战 (十八) | 整合 MongoDB

    摘要:前言如题,今天介绍下是如何整合的。存储结构如下男一个优秀的废人准备工作创建一个名为的数据库,不会建的。层实现类添加学生信息根据删除学生信息更新学生信息根据查询学生信息查询学生信息列表层测试结果测试已经全部通过,这里仅展示了保存操作。 微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。 showImg(https://segmentfault.com/img/remote...

    jzzlee 评论0 收藏0
  • 一文掌握 Spring Boot Profiles

    摘要:需要注意的是必须要使用版本为以上才支持属性。与格式文件不同,正对不同的,无法在一个文件设置,官方采用命名形式为格式来达成一样的效果。采用方式添加的是属于额外激活的,也就是说覆盖掉外部传入的指定的。 showImg(https://segmentfault.com/img/remote/1460000019924197?w=1050&h=500); Spring Boot Profile...

    Eidesen 评论0 收藏0
  • 第二十八章:SpringBoot使用AutoConfiguration自定义Starter

    摘要:代码如下所示自定义业务实现恒宇少年码云消息内容是否显示消息内容,我们内的代码比较简单,根据属性参数进行返回格式化后的字符串。 在我们学习SpringBoot时都已经了解到starter是SpringBoot的核心组成部分,SpringBoot为我们提供了尽可能完善的封装,提供了一系列的自动化配置的starter插件,我们在使用spring-boot-starter-web时只需要在po...

    fasss 评论0 收藏0
  • Java相关

    摘要:本文是作者自己对中线程的状态线程间协作相关使用的理解与总结,不对之处,望指出,共勉。当中的的数目而不是已占用的位置数大于集合番一文通版集合番一文通版垃圾回收机制讲得很透彻,深入浅出。 一小时搞明白自定义注解 Annotation(注解)就是 Java 提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解) 是一个接口,程序可以通过...

    wangtdgoodluck 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<