整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

springboot(二十四)使用springboo

springboot(二十四)使用springboot发送邮件

面记录使用springboot发送四种邮件的方法:普通文本、html、附件、模板html

1、引入springboot依赖包

gradle:

 compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail'
 compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'

maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>3.0.3</version>
</dependency>

spring-boot-starter-mail实现邮件发送
spring-boot-starter-thymeleaf实现模板的创建

2、 在resources/templates中创建一个模板html:emailTemplate.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>这是一个测试的模板</title>
</head>
<body>
您的账号存在异常,请点击下面链接进行安全验证<br/>
<a href="#" th:href="@{http://www.lalalala.com/{userid}(userid=${userid})}">安全验证</a>
</body>
</html>

3、 四种邮件发送测试代码

package com.iscas.biz.test.controller;

import com.iscas.templet.common.BaseController;
import com.iscas.templet.common.ResponseEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

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

/**
 * 邮件发送测试
 *
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2020/8/12 21:16
 * @since jdk1.8
 */
@RestController
@RequestMapping("/send/email/test")
@Slf4j
public class SendEmailController extends BaseController {
    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 测试发送普通文本邮件
     * */
    @GetMapping("/text")
    public ResponseEntity testText() {

        SimpleMailMessage message=new SimpleMailMessage();
        // 发件人地址
        message.setFrom("461402005@qq.com");
        // 收件人地址
        message.setTo("76775081@qq.com");
        // 邮件标题
        message.setSubject("这是一个测试");
        // 邮件正文
        message.setText("这是测试正文");

        javaMailSender.send(message);
        log.debug("发送成功!");

        return getResponse();
    }

    /**
     * 测试发送HTML邮件
     * */
    @GetMapping("/html")
    public ResponseEntity testHtml() throws MessagingException {

        MimeMessage message=javaMailSender.createMimeMessage();
        // 这里与发送文本邮件有所不同
        MimeMessageHelper helper=new MimeMessageHelper(message, true);
        // 发件人地址
        helper.setFrom("461402005@qq.com");
        // 收件人地址
        helper.setTo("76775081@qq.com");
        helper.setSubject("这是html测试");
        // 发送HTML邮件
        String html="<html><body><h1>这是测试测试</h1></body></html>";
        helper.setText(html, true);

        javaMailSender.send(message);
        log.debug("发送成功");

        return getResponse();
    }

    /**
     * 测试发送附件
     * */
    @GetMapping("/attachment")
    public ResponseEntity testAttachment() throws MessagingException {

        MimeMessage message=javaMailSender.createMimeMessage();
        // 这里与发送文本邮件有所不同
        MimeMessageHelper helper=new MimeMessageHelper(message, true);
        // 发件人地址
        helper.setFrom("461402005@qq.com");
        // 收件人地址
        helper.setTo("76775081@qq.com");
        helper.setSubject("这是附件测试");
        // 发送HTML
        String html="<html><body><h1>这是测试测试</h1></body></html>";
        helper.setText(html, true);

        //发送附件
        FileSystemResource file=new FileSystemResource("E:\\test\\repo1\\a.txt");
        // 发送文件名
        String fileName=file.getFilename();
        helper.addAttachment(fileName, file);

        javaMailSender.send(message);
        log.debug("发送成功");

        return getResponse();
    }

    /**
     * 测试发送thymeleaf模板邮件
     * */
    @GetMapping("/template")
    public ResponseEntity testTemplate() throws MessagingException {

        MimeMessage message=javaMailSender.createMimeMessage();
        // 这里与发送文本邮件有所不同
        MimeMessageHelper helper=new MimeMessageHelper(message, true);
        // 发件人地址
        helper.setFrom("461402005@qq.com");
        // 收件人地址
        helper.setTo("76775081@qq.com");
        helper.setSubject("这是模板测试");

        //获取模板生成html
        Context context=new Context();
        // 这里的id与resources/templates下的模板文件中的${userid}必须对应
        context.setVariable("userid", 1);
        // 这里的"emailTemplate"与resources/templates下的模板文件一直
        String html=templateEngine.process("emailTemplate", context);
        helper.setText(html, true);

        //发送附件
        FileSystemResource file=new FileSystemResource("E:\\test\\repo1\\a.txt");
        // 发送文件名
        String fileName=file.getFilename();
        helper.addAttachment(fileName, file);

        javaMailSender.send(message);
        log.debug("发送成功");

        return getResponse();
    }
}

4、 将邮件发送封装为工具类

package com.iscas.base.biz.service.common;

import cn.hutool.core.io.IoUtil;
import com.iscas.templet.common.ResponseEntity;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 发送邮件工具
 *
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2020/8/12 21:52
 * @since jdk1.8
 */
@Service
@Slf4j
public class SendEmailService {
    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 发送普通文本邮件
     *
     * @version 1.0
     * @since jdk1.8
     * @date 2020/8/12
     * @param from 发送邮件地址
     * @param to 接收邮件地址
     * @param title 邮件主题
     * @param content 邮件正文文本
     * */
    public void sendText(String from, String to, String title, String content) {


        SimpleMailMessage message=new SimpleMailMessage();
        // 发件人地址
        message.setFrom(from);
        // 收件人地址
        message.setTo(to);
        // 邮件标题
        message.setSubject(title);
        // 邮件正文
        message.setText(content);

        javaMailSender.send(message);
        log.debug("邮件发送成功!");
    }

    /**
     * 发送HTML邮件
     * @version 1.0
     * @since jdk1.8
     * @date 2020/8/12
     * @param from 发送邮件地址
     * @param to 接收邮件地址
     * @param title 邮件主题
     * @param html 邮件正文html
     * */
    public void sendHtml(String from, String to, String title, String html) throws MessagingException {

        MimeMessage message=javaMailSender.createMimeMessage();
        // 这里与发送文本邮件有所不同
        MimeMessageHelper helper=new MimeMessageHelper(message, true);
        // 发件人地址
        helper.setFrom(from);
        // 收件人地址
        helper.setTo(to);
        helper.setSubject(title);
        // 发送HTML邮件
        helper.setText(html, true);

        javaMailSender.send(message);
        log.debug("邮件发送成功");

    }

    /**
     * 发送附件
     *
     *
     * @version 1.0
     * @since jdk1.8
     * @date 2020/8/12
     * @param from 发送邮件地址
     * @param to 接收邮件地址
     * @param title 邮件主题
     * @param html 邮件正文html
     * @param inputStream 附件输入流
     * @param fileName 文件名称
     *
     * */
    public void sendAttachment(String from, String to, String title, String html, InputStream inputStream, String fileName) throws MessagingException {

        MimeMessage message=javaMailSender.createMimeMessage();
        // 这里与发送文本邮件有所不同
        MimeMessageHelper helper=new MimeMessageHelper(message, true);
        // 发件人地址
        helper.setFrom(from);
        // 收件人地址
        helper.setTo(to);
        helper.setSubject(title);
        // 发送HTML
        helper.setText(html, true);

        //发送附件

        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        IoUtil.copy(inputStream, baos);

        ByteArrayResource byteArrayResource=new ByteArrayResource(baos.toByteArray());
        // 发送文件名
        helper.addAttachment(fileName, byteArrayResource);

        javaMailSender.send(message);
        log.debug("发送成功");

    }

    /**
     * 测试发送thymeleaf模板邮件
     * templateName必须在resources/templates下
     *
     * @version 1.0
     * @since jdk1.8
     * @date 2020/8/12
     * @param from 发送邮件地址
     * @param to 接收邮件地址
     * @param title 邮件主题
     * @param templateName 模板名称,templateName必须在resources/templates下
     * @param context 构建模板的上下文,构建方式参见单元测试
     * */
    @GetMapping("/template")
    public void sendTemplate(String from, String to, String title, String templateName, Context context) throws MessagingException {

        MimeMessage message=javaMailSender.createMimeMessage();
        // 这里与发送文本邮件有所不同
        MimeMessageHelper helper=new MimeMessageHelper(message, true);
        // 发件人地址
        helper.setFrom(from);
        // 收件人地址
        helper.setTo(to);
        helper.setSubject(title);

        //获取模板生成html
        String html=templateEngine.process(templateName, context);
        helper.setText(html, true);

        javaMailSender.send(message);
        log.debug("邮件发送成功");

    }

    /**
     * 测试发送thymeleaf模板邮件,并携带附件
     * templateName必须在resources/templates下
     * @version 1.0
     * @since jdk1.8
     * @date 2020/8/12
     * @param from 发送邮件地址
     * @param to 接收邮件地址
     * @param title 邮件主题
     * @param templateName 模板名称,templateName必须在resources/templates下
     * @param context 构建模板的上下文,构建方式参见单元测试
     * @param inputStream 附件输入流
     * @param fileName 文件名称
     * */
    public void sendTemplateWithAttachment(String from, String to, String title, String templateName, Context context, InputStream inputStream, String fileName) throws MessagingException {
        //获取模板生成html
        String html=templateEngine.process(templateName, context);
        sendAttachment(from, to, title, html, inputStream, fileName);
    }
}

5、单元测试 

pring Boot Mail

在Spring Boot中发送邮件,需要使用Spring提供的org.springframework.mail.javamail.JavaMailSender,它提供了许多简易的用法,可以发送简单邮件,HTML格式邮件,带附件的邮件及模板邮件。

1创建Spring Boot工程并引入依赖

创建Spring Boot工程

添加依赖: spring-boot-starter-mail

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 复制代码

2 邮件配置

在application.yml配置文件中添加邮件相关配置(以163邮箱为例)

spring:
  ## 邮件配置
  mail:
    host: smtp.163.com
    username: 邮箱
    password: 邮箱授权密码
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
复制代码

3 发送简单邮件

使用Spring Boot发送简单邮件

@Service(value="jmsService")
public class JmsService {

    @Autowired
    private JavaMailSender jms;

    public void sendSimpleMail(String sender, String receiver, String subject, String text) {
        try {
            SimpleMailMessage message=new SimpleMailMessage();
            message.setFrom(sender);       // 发送者
            message.setTo(receiver);       // 接受者
            message.setSubject(subject);   // 邮件主题
            message.setText(text);         // 邮件正文

            jms.send(message);
        } catch (Exception exception) {
            // TODO 异常处理
        }
    }
}
复制代码

4 发送HTML格式邮件

使用Spring Boot发送HTML格式邮件

@Service(value="jmsService")
public class JmsService {

    @Autowired
    private JavaMailSender jms;

    public void sendHtmlMail(String sender, String receiver, String subject, String htmlText) {
        MimeMessage message=null;

        try {
            message=jms.createMimeMessage();
            MimeMessageHelper helper=new MimeMessageHelper(message, true);
            helper.setFrom(sender);       // 发送者
            helper.setTo(receiver);       // 接受者
            helper.setSubject(subject);   // 邮件主题

            if (StringUtil.isNotEmpty(htmlText)) {
                StringBuffer sb=new StringBuffer(htmlText);
                helper.setText(sb.toString(), true);  // HTML
            }

            jms.send(message);
        } catch (Exception exception) {
            // TODO 异常处理
        }
    }
}
复制代码

5 发送带附件的邮件

使用Spring Boot发送带附件的邮件

@Service(value="jmsService")
public class JmsService {

    @Autowired
    private JavaMailSender jms;

    public void sendSimpleMailWithAttachment(String sender, String receiver, String subject, String filePath) {
        MimeMessage message=null;

        try {
            message=jms.createMimeMessage();
            MimeMessageHelper helper=new MimeMessageHelper(message, true);
            helper.setFrom(sender);             // 发送者
            helper.setTo(receiver);             // 接受者
            helper.setSubject(subject);         // 邮件主题
            helper.setText("详情参见附件内容!");  // 邮件正文


            File file=new File(filePath);
            FileSystemResource fileResource=new FileSystemResource(file);
            helper.addAttachment(file.getName(), fileResource);  // 附件

            jms.send(message);
        } catch (Exception exception) {
            // TODO 异常处理
        }
    }
}
复制代码

6 发送模板邮件

使用Spring Boot发送模板邮件,以thymeleaf为例

6.1 引入模板引擎

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 复制代码

6.2 thymeleaf配置

spring:
  ## thymelea模板配置
  thymeleaf:
    #thymeleaf 所在路径
    prefix: classpath:/templates/
    #thymeleaf 后缀
    suffix: .html
    #thymeleaf 采用的标准
    mode: HTML5
    #thymeleaf 编码格式
    encoding: UTF-8
复制代码

6.3 新建邮件模板

在项目resources/templates目录下新建邮件模板template.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>注册码</title>
</head>

<body>
    您好,您的注册码为<span th:text="${code}"></span>,请在5分钟内使用完成操作。
</body>

</html>
复制代码

6.4 发送模板邮件

@Service(value="jmsService")
public class JmsService {

    @Autowired
    private JavaMailSender jms;

    @Autowired
    private TemplateEngine templateEngine;

    public void sendTemplateEmail(String sender, String receiver, String subject, String code) {
        MimeMessage message=null;

        try {
            message=jms.createMimeMessage();
            MimeMessageHelper helper=new MimeMessageHelper(message, true);
            helper.setFrom(sender);              // 发送者
            helper.setTo(receiver);              // 接受者
            helper.setSubject(subject);          // 邮件主题

            Context context=new Context();
            context.setVariable("code", code);   // 模板邮件参数

            String template=templateEngine.process("template", context);
            helper.setText(template, true);

            jms.send(message);
        } catch (Exception exception) {
            // TODO 异常处理
        }
    }
}


链接:https://juejin.im/post/6876818580286603278
来源:掘金

pring 对 Java Mail 有很好的支持。因此,Spring Boot 也提供了自动配置的支持。

Spring Boot 集成 Java Mail

Spring Boot 中使用 Java Mail 非常简单方便。修改 pom 文件,添加依赖。

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

在 src/main/resources/application.properties 中配置邮件信息

#email
spring.mail.host=smtp.163.com
spring.mail.username=请输入用户名
spring.mail.password=请输入密码
spring.mail.port=25
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8

单元测试

我们通过编写单元测试用例,测试 Java Mail 是否正常工作。值得注意的是,邮件包括几种类型:简单文本的邮件、 HTML 文本的邮件、 内嵌图片的邮件、 包含附件的邮件。

发送包含HTML文本的邮件

发送包含内嵌图片的邮件

发送包含附件的邮件

喜欢的小伙伴,点个关注吧!