乐趣区

关于springboot:笑小枫的SpringBoot系列十四SpringBoot发送邮件

本文简介

本文次要介绍了应用 SpringBoot 发送邮件,次要蕴含如何获取发送邮件的受权码,这里以 QQ 邮箱为例,而后介绍了性能如何实现,包含通过模板发送邮件,发送带图片的邮件,发送带附件的邮件,发送带有多个附件的邮件。

获取 SMTP 受权码

应用 SPringBoot 发送邮件呢,首先须要发送邮件的地址开明 SMTP 服务,并获取到对应的受权码,接下来就以 QQ 邮箱为例,简略的介绍一下怎么可通 SMTP,并且获取到受权码值。具体操作如下图所示:

  1. 首先登录 QQ 邮箱网页版,而后在设置外面找到账户
  1. 能够看到下图中的一堆服务,咱们只有开明 SMTP 服务即可。
  1. QQ 邮箱开明 SMTP 服务须要应用密保手机发送短信码验证,我在发送的时候,提醒 1069070069 这个号码已敞开服务,能够发送上面的10690329021269
  1. 验证胜利后,能够看到对应的受权码,咱们复制进去,留着备用。😺

发送邮件性能实现

下面咱们曾经获取到 QQ 邮箱的 STMP 服务的受权码,接下来咱们看看怎么实现性能。

  • pom.xml 增加援用

    <!-- 配置 thymeleaf 模板依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
    <!-- 反对发送邮件依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
  • 配置发送邮件的 application

    spring
    mail:
      default-encoding: UTF-8
      host: smtp.qq.com
      username: 你的邮箱地址
      password: 你的受权码
      port: 22
      protocol: smtp
      properties:
        mail:
          smtp:
            ssl:
              enable: true
            socketFactory:
              port: 465
              class: javax.net.ssl.SSLSocketFactory

这里的配置文件是以 QQ 邮箱的为例,如果是其余的邮箱,能够参考表格里的 SMTP 服务器地址和对应的端口号。

邮箱类型 SMTP 服务器地址 端口号
QQ 邮箱 smtp.qq.com 465 或 587
sina 邮箱 smtp.sina.cn 465 或 587
126 邮箱 smtp.126.com 465 或 994
aliyun 邮箱 smtp.aliyun.com 465 或 994
163 邮箱 smtp.163.com 465 或 994
yeah 邮箱 smtp.yeah.net 465 或 994
  • config.bean 包下编写发送邮件类EmailBean.java👇
package com.maple.demo.config.bean;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.thymeleaf.context.Context;

import java.util.List;

/**
 * @author 笑小枫
 * @date 2022/7/22
 */
@Data
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
public class EmailBean {
    /**
     * 填充内容
     */
    private Context context;

    /**
     * 应用模板,和 text 互斥,优先应用模板,模板不存在发送 text 内容
     */
    private String templateName;

    /**
     * 发送给谁
     */
    private String toUser;

    /**
     * 抄送给谁
     */
    private String[] ccUser;

    /**
     * 邮件主体
     */
    private String subject;

    /**
     * 邮件内容,和 templateName 互斥,优先应用模板,模板不存在发送 text 内容
     */
    private String text;

    /**
     * 附件列表
     */
    private List<String> attachmentList;
}
  • util 包下编写邮件的工具类EmailUtil.java👇
package com.maple.demo.util;

import com.maple.demo.config.bean.EmailBean;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * @author 笑小枫
 * @date 2022/7/22
 */
@Service
@RequiredArgsConstructor
public class EmailUtil {

    private final JavaMailSender mailSender;

    private final TemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String from;

    @Async
    public void sendEmail(EmailBean emailBean) {
        try {
            // 解决附件名称过长导致的附件名称乱码问题
            System.setProperty("mail.mime.splitlongparameters", "false");
            // 定义邮件信息
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper;
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(emailBean.getToUser());
            helper.setSubject(emailBean.getSubject());
            if (emailBean.getCcUser() != null && emailBean.getCcUser().length > 0) {helper.setCc(emailBean.getCcUser());
            }

            // 如果存在模板,定义邮件模板中的内容,context 的内容对应 email.html 的 ${project}占位的内容
            if (emailBean.getContext() != null && StringUtils.isNotBlank(emailBean.getTemplateName())) {String emailContent = templateEngine.process(emailBean.getTemplateName(), emailBean.getContext());
                helper.setText(emailContent, true);
            } else {helper.setText(emailBean.getText());
            }

            // 如果存在附件,定义邮件的附件
            if (emailBean.getAttachmentList() != null && !emailBean.getAttachmentList().isEmpty()) {for (String attachment : emailBean.getAttachmentList()) {FileSystemResource file = new FileSystemResource(attachment);
                    if (StringUtils.isNotBlank(file.getFilename())) {helper.addAttachment(file.getFilename(), file);
                    }

                }
            }
            mailSender.send(message);
        } catch (MessagingException e) {e.printStackTrace();
        }
    }
}
  • 配置发送邮件的模板
    resources目录下创立 templates 目录。创立 email.html 模板。

    这里能够依据本人的需要配置 html 页面,这种形式是通过配置 thymeleaf 模板的模式进行发送,如果间接能够发送文本内容即可,则不必配置。

    如果配置的模版比拟多,且常常变动或者由业务人员配置,能够间接增加一张邮件模版配置表,前端通过富文本的模式进行页面配置,而后取邮件模版的配置表内容即可。绝对简单一些,这里只说一下思路,不再进行演示,有什么疑难能够留言或者分割我。

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
      <title>xiaoxiaofeng</title>
      <style>
          body {
              text-align: center;
              margin-left: auto;
              margin-right: auto;
          }
          #main {text-align: center;}
      </style>
    </head>
    <body>
    <div id="main">
      <h3> 欢送应用 <span th:text="${project}"></span></h3>
      您的验证码是:<h2><span th:text="${code}"></span></h2>
      <span> 本站由 <a href="https://www.xiaoxiaofeng.com" target="_blank"> 笑小枫(https://www.xiaoxiaofeng.com)</a> 提供技术支持 </span>
    </div>
    </body>
    </html>

功能测试

编写一个发送邮件的拆穿 controller,次要演示两种模式发送邮件

  • 通过纯文本发送邮件,蕴含附件
  • 通过 html 模版发送邮件
package com.maple.demo.controller;

import com.maple.demo.config.bean.EmailBean;
import com.maple.demo.util.EmailUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.context.Context;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 笑小枫
 * @date 2022/7/22
 */
@RestController
@AllArgsConstructor
@RequestMapping("/example")
@Api(tags = "实例演示 - 发送邮件")
public class TestSendEmailController {

    private final EmailUtil emailUtil;

    @PostMapping("/sendEmailText")
    @ApiOperation(value = "发送纯文本带附件的邮件")
    public void sendEmailText(String text) {List<String> attachmentList = new ArrayList<>();
        // 定义绝对路径
        attachmentList.add("D:\\xiaoxiaofeng.jpg");
        // 定义相对路径
        attachmentList.add("src/main/resources/templates/email.html");

        EmailBean emailBean = EmailBean.builder()
                .text(text)
                .subject("欢送应用笑小枫集体博客")
                .toUser("1150640979@qq.com")
                .attachmentList(attachmentList)
                .build();

        emailUtil.sendEmail(emailBean);
    }

    @PostMapping("/sendEmailTemplate")
    @ApiOperation(value = "依据 html 模板发送验证码邮件")
    public void sendEmailTemplate() {Context context = new Context();
        context.setVariable("project", "笑小枫集体博客");
        // 生成 6 位数字验证码
        String code = String.valueOf((int) (Math.random() * 900000 + 100000));
        context.setVariable("code", code);
        EmailBean emailBean = EmailBean.builder()
                .context(context)
                .templateName("email")
                .subject("笑小枫发送验证码")
                .toUser("1150640979@qq.com")
                .build();

        emailUtil.sendEmail(emailBean);
    }
}

应用咱们的接口服务平台进行调用

纯文本的邮件的测试后果👇,能够看到增加的两个附件。

通过 html 模版发送邮件的测试后果👇

对于笑小枫💕

本章到这里完结了,喜爱的敌人关注一下我呦😘😘,大伙的反对,就是我保持写下去的能源。

微信公众号:笑小枫

笑小枫集体博客:https://www.xiaoxiaofeng.com

本文源码:https://github.com/hack-feng/maple-demo

退出移动版