本文简介

本文次要介绍了应用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

    springmail:  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.com465或587
sina邮箱smtp.sina.cn465或587
126邮箱smtp.126.com465或994
aliyun邮箱smtp.aliyun.com465或994
163邮箱smtp.163.com465或994
yeah邮箱smtp.yeah.net465或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@RequiredArgsConstructorpublic 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@RequiredArgsConstructorpublic 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