【笑小枫的SpringBoot系列】【十四】SpringBoot发送邮件

简介: 【笑小枫的SpringBoot系列】【十四】SpringBoot发送邮件

本文简介


本文主要介绍了使用SpringBoot发送邮件,主要包含如何获取发送邮件的授权码,这里以QQ邮箱为例,然后介绍了功能如何实现,包括通过模板发送邮件,发送带图片的邮件,发送带附件的邮件,发送带有多个附件的邮件。


获取SMTP授权码


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


  1. 首先登录QQ邮箱网页版,然后在设置里面找到账户


10f68284b5a5f898511cc340a3758270.png

  1. 可以看到下图中的一堆服务,我们只要开通SMTP服务即可。


95d77d08efd5e46f20d95fd75d4d7ab5.png



  1. QQ邮箱开通SMTP服务需要使用密保手机发送短信码验证,我在发送的时候,提示1069070069这个号码已关闭服务,可以发送下面的10690329021269


c28e4945793a65c8f49e45276b807240.png


  1. 验证成功后,可以看到对应的授权码,我们复制出来,留着备用。😺


c1474c1244be8d6ba5b217786b35a1ca.png


发送邮件功能实现


上面我们已经获取到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);
    }
}


使用我们的接口服务平台进行调用


37d9886a140bf7fff7e7388e8a37a85f.png


纯文本的邮件的测试结果👇,可以看到添加的两个附件。


7f7a02cb8959bacd21d8b194fe8fa5c3.png

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

ba708a358560b6ffdde8810ca3bd64f0.png


关于笑小枫💕


本章到这里结束了,喜欢的朋友关注一下我呦😘😘,大伙的支持,就是我坚持写下去的动力。

笑小枫个人博客:https://www.xiaoxiaofeng.com

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

目录
相关文章
|
3月前
|
安全 JavaScript Java
SpringBoot实现定时发送邮件
SpringBoot实现定时发送邮件
50 0
|
3月前
|
Java Spring
Spring boot项目如何发送邮件
Spring boot项目如何发送邮件
33 2
|
3月前
|
Java
Springboot如何发送邮件
Springboot如何发送邮件
|
3月前
|
消息中间件 JSON Java
如何利用springboot + rabbitmq发送邮件?
RabbitMQ相关知识请参考: RabbitMQ消息确认、消息持久化等核心知识总结 - 简书
41 2
|
3月前
|
Java
【Java专题_03】使用springboot发送邮件
【Java专题_03】使用springboot发送邮件
45 2
|
3月前
|
安全 Java 数据安全/隐私保护
SpringBoot+Email发送邮件
邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送,以构建一个可靠的通知体系。
174 1
SpringBoot+Email发送邮件
|
8月前
|
Java
SpringBoot项目发送邮件
SpringBoot项目发送邮件
67 1
|
9月前
|
Java 测试技术 Maven
Spring Boot发送邮件
Spring Boot发送邮件
|
JavaScript Java Spring
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件
132 0
|
Java 容器
JavaMailSender发送邮件(整合SpringBoot、解决空指针异常问题)
一、邮箱开启SMTP服务 以qq邮箱为例 进入邮箱设置页面后选择账户