前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 2.x(十八):邮件服务一文打尽

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

作者头像
山禾说
发布2019-07-22 15:41:26
4590
发布2019-07-22 15:41:26
举报
文章被收录于专栏:Vi的技术博客

前景介绍

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

大致思路

我们要做的其实就是把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简介,敬请期待,谢谢大家一直以来的支持!戳原文查看源码!

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前景介绍
  • 大致思路
  • 引入POM
  • 配置文件
  • 编写邮件的实体类
  • 编写发送邮件的方法
  • 关于模板的一些补充
  • 后记
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档