zoukankan      html  css  js  c++  java
  • Spring Boot 2发送邮件手把手图文教程

    原文:http://www.itmuch.com/spring-boot/send-email/

    本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本。

    最近有童鞋问到笔者如何用Spring Boot发送邮件,故而整理下Spring Boot发送邮件的各种姿势。

    说到邮件放松,相信大家对Spring Framework提供的接口 JavaMailSender 都不陌生。那么Spring Boot是否有开箱即用的邮件发送呢?

    答案是肯定的。Spring Boot为发送邮件提供了starter:spring-boot-starter-mail 。

    本文详细探讨如何用Spring Boot发送邮件。

    一、邮箱配置

    以126邮箱为例:

    • 开启SMTP服务

      126邮箱开启SMTP-1

    • 设置/重置客户端授权密码

      126邮箱开启SMTP-2

    二、编码

    2.1 准备工作

    • 加依赖

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

      写配置

    • spring:
        mail:
          host: smtp.126.com
          username: eacdy0000@126.com
          password: 上面设置的授权码

      2.2 发送简单邮件

    • public String simple() {
          SimpleMailMessage message = new SimpleMailMessage();
          // 发件人邮箱
          message.setFrom(this.mailProperties.getUsername());
          // 收信人邮箱
          message.setTo("511932633@qq.com");
          // 邮件主题
          message.setSubject("简单邮件测试");
          // 邮件内容
          message.setText("简单邮件测试");
          this.javaMailSender.send(message);
          return "success";
      }

      结果类似下图:

      发送简单邮件

      2.3 发送HTML邮件

      简单邮件是没有样式的,很多时候,我们希望发送的邮件内容带有样式,此时可发送HTML邮件。

    • public String html() throws MessagingException {
          MimeMessage message = javaMailSender.createMimeMessage();
          MimeMessageHelper messageHelper = new MimeMessageHelper(message);
      
          messageHelper.setFrom(this.mailProperties.getUsername());
          messageHelper.setTo("511932633@qq.com");
          messageHelper.setSubject("HTML内容邮件测试");
          // 第二个参数表示是否html,设为true
          messageHelper.setText("<h1>HTML内容..</h1>", true);
      
          this.javaMailSender.send(message);
          return "success";
      }

      结果类似下图:

      发送HTML邮件

      2.4 发送带附件的邮件

      很多场景下,需要为邮件插入附件,此时该怎么办呢?继续上代码——

    • @GetMapping("/attach")
      public String attach() throws MessagingException {
          MimeMessage message = this.javaMailSender.createMimeMessage();
          // 第二个参数表示是否开启multipart模式
          MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
      
          messageHelper.setFrom(this.mailProperties.getUsername());
          messageHelper.setTo("511932633@qq.com");
          messageHelper.setSubject("带附件的邮件测试");
          // 第二个参数表示是否html,设为true
          messageHelper.setText("<h1>HTML内容..</h1>", true);
          messageHelper.addAttachment("附件名称",
                  new ClassPathResource("wx.jpg"));
      
          this.javaMailSender.send(message);
          return "success";
      }

      结果类似下图:

      发送带附件的邮件

      2.5 发送带内联附件的邮件

      附件 + HTML基本能满足日常工作中多数需求。但如果能将附件内联在邮件内容中,那么体验就更好啦!如何实现附件的内联呢?

    • @GetMapping("/inline-attach")
      public String inlineAttach() throws MessagingException {
          MimeMessage message = this.javaMailSender.createMimeMessage();
          // 第二个参数表示是否开启multipart模式
          MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
          messageHelper.setFrom(this.mailProperties.getUsername());
          messageHelper.setTo("511932633@qq.com");
          messageHelper.setSubject("内联附件的邮件测试");
          // 第二个参数表示是否html,设为true
          messageHelper.setText("<h1>HTML内容..<img src="cid:attach"/></h1>", true);
          messageHelper.addInline("attach", new ClassPathResource("wx.jpg"));
      
          this.javaMailSender.send(message);
          return "success";
      }

      由代码可知,只需在想要内联的地方使用 cid:xx 引用内联附件,然后用 addInline(xx, file) 指定附件即可。两处的 xx 必须一致。

      结果类似下图:

      发送带内联附件的邮件

      2.6 发送基于Freemarker模板的邮件

      上面的例子中,邮件内容是直接以字符串体现的,这通常不适合生产,因为实际项目中邮件往往带有变量。此时,可考虑使用Freemarker模板(或者其他模板,Spring Boot 2.x默认支持Freemarker、Groovy、Thymeleaf、Mustache四种模板引擎,也可根据需求使用其他模板引擎)。

      • 创建Freemarker模板文件mail.ftl,并将其存放在resources/templates/ 目录中

    • <h1>亲爱的${username}, 欢迎关注${event}</h1>

    编码:

    @GetMapping("/freemarker")
    public String freemarker() throws MessagingException, IOException, TemplateException {
        MimeMessage message = this.javaMailSender.createMimeMessage();
        // 第二个参数表示是否开启multipart模式
        MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
        messageHelper.setFrom(this.mailProperties.getUsername());
        messageHelper.setTo("511932633@qq.com");
        messageHelper.setSubject("基于freemarker模板的邮件测试");
    
        Map<String, Object> model = new HashMap<>();
        model.put("username", "itmuch");
        model.put("event", "IT牧场大事件");
    
        String content = FreeMarkerTemplateUtils.processTemplateIntoString(
                this.freemarkerConfiguration.getTemplate("mail.ftl"), model);
    
        // 第二个参数表示是否html,设为true
        messageHelper.setText(content, true);
    
        this.javaMailSender.send(message);
        return "success";
    }

    此时,结果类似下图:

    发送基于Freemarker模板的邮件

    三、配套代码

  • 相关阅读:
    CSS 选择器及各样式引用方式
    The usage of docker image wurstmeister/kafka
    kafka connect rest api
    Kafka connect in practice(3): distributed mode mysql binlog ->kafka->hive
    jail-break-rule
    Ubuntu下把缺省的dash shell修改为bash shell
    mysql 5.7 enable binlog
    Docker CMD in detail
    记一次深度系统安装至windows系统盘提示挂载为只读模式问题
    android 监听声音变化
  • 原文地址:https://www.cnblogs.com/shihaiming/p/10984314.html
Copyright © 2011-2022 走看看