Spring Boot 整合邮件发送

2020-09-26  本文已影响0人  SheHuan

Spring Boot整合邮件发送功能还是比较简单的,下边我们详细看整个实现过程。

一、基础配置

首先创建好Spring Boot项目,pom.xml中需要添加如下依赖:

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

然后在application.properties中添加如下配置:

spring.mail.host=smtp.qq.com
spring.mail.port=465
// 发件人的邮箱
spring.mail.username=544642279@qq.com
// QQ邮箱的授权码
spring.mail.password=xxxxxxxxxxx
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
// 打开调试
spring.mail.properties.mail.debug=true

这里使用QQ邮箱发送邮件,授权码需要在自己的QQ邮箱中获取,步骤网上很多。

二、发送简单的文本邮件

@Service
public class MailService {
    @Autowired
    private JavaMailSender javaMailSender;

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

    public void send() {
        SimpleMailMessage smm = new SimpleMailMessage();
        smm.setSubject("邮件主题");
        smm.setText("邮件正文\nhello spring boot");
        // 发送邮箱
        smm.setFrom(from);
        // 发送日期
        smm.setSentDate(new Date());
        // 要发给的邮箱
        smm.setTo("shehuandev@163.com");
        // 密送的邮箱
        smm.setBcc("shehuan320@163.com");
        // 抄送邮箱
        smm.setCc("shehuan.dev@gmail.com");
        javaMailSender.send(smm);
    }
}

首先需要注入JavaMailSender对象,Spring Boot已经帮我们创建好了,它是发送邮件的核心类。然后就是SimpleMailMessage类,同它来完成邮件信息的配置。测试结果如下:

但是SimpleMailMessage的功能相对弱一些,不能实现更加丰富的邮件内容,所以更多的时候可以考虑使用功能更强大的MimeMessage

三、发送html内容和带附件的邮件

发送html内容或者带附件的邮件,可以使用MimeMessage类,通过它创建MimeMessageHelper来完成对应的配置:

@Service
public class MailService {
    @Autowired
    private JavaMailSender javaMailSender;

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

    public void send2() {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
            mmh.setSubject("邮件主题");
            // 设置邮件内容
            mmh.setText("<html><body>邮件正文\n<img src='cid:img1'/>\n<h1>hello spring boot</h1></body></html>", true);
            // 配置图片资源
            mmh.addInline("img1", new File("src/main/resources/static/favicon.ico"));
            mmh.setFrom(from);
            // 发送日期
            mmh.setSentDate(new Date());
            mmh.setTo("shehuandev@163.com");
            // 添加附件
            mmh.addAttachment("favicon.ico", new File("src/main/resources/static/favicon.ico"));
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

其中setText()方法的第二个参数为true,表示发送的是html格式的内容,第一个参数则是html格式的邮件内容,cid:img1相当于图片的占位符,需要使用addInline()方法替换成对应的图片。

addAttachment()是用来添加附件的,第一个参数是附件名称,第二个是具体的附件内容。

测试的结果如下:


四、邮件模板

考虑一个问题,虽然可以使用MimeMessageHelper来配置邮件的内容为html格式,但是这样并不好维护,更好的办法可以使用邮件模板,将html和发送邮件的java代码分离开。这里分别使用ThymeleafFreeMarker来实现邮件模板的功能。

1、Thymeleaf邮件模板

先添加Thymeleaf的依赖:

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

然后编写一个简单的Thymeleaf邮件模板notice.html,放到resources/templates下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>放假通知</title>
</head>
<body>
<div>各位小伙伴们:</div><br>
<div><span th:text="${festival}"></span>即将到来,在此祝大家节日快乐!</div>
<div>根据公司安排将于<span style="color: red" th:text="${date}"></span>放假,请知悉。</div>
</body>
</html>

其中festivaldate是模板参数,需要发送邮件时传给模板。

最后就是发送邮件的代码了,这里需要注入Thymeleaf的模板引擎TemplateEngine来完成模板的渲染:

@Service
public class MailService {
    @Autowired
    private JavaMailSender javaMailSender;

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

    @Autowired
    private TemplateEngine templateEngine;

    public void send3() {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
            mmh.setSubject("国庆放假通知");

            // 开始配置Thymeleaf邮件模板
            Context context = new Context();
            // 准备邮件模板参数
            Map<String, Object> params = new HashMap<>();
            params.put("festival", "国庆节");
            params.put("date", "2020年10月1日至2020年10月8日");
            // 给模板传递参数
            context.setVariables(params); 
           // 完成模板的渲染
            String process = templateEngine.process("notice.html", context);
            mmh.setText(process, true);

            mmh.setFrom(from);
            mmh.setSentDate(new Date());
            mmh.setTo("shehuandev@163.com");
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

注意ContextThymeleaf对应包下的类。测试的效果如下:

2、FreeMarker邮件模板

FreeMarker邮件模板的用法也类似,先添加对应依赖:

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

对应的邮件模板如下notice.ftlh,同样放到resources/templates下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>放假通知</title>
</head>
<body>
<div>各位小伙伴们:</div><br>
<div><span>${festival}</span>即将到来,在此祝大家节日快乐!</div>
<div>根据公司安排将于<span style="color: red">${date}</span>放假,请知悉。</div>
</body>
</html>

同样的festivaldate是模板参数。

发送邮件的代码如下,但FreeMarker邮件模板的配置相对复杂一些,需要我们自己构建模板渲染引擎,具体的代码如下:

@Service
public class MailService {
    @Autowired
    private JavaMailSender javaMailSender;

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

    public void send4() {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
            mmh.setSubject("国庆放假通知");

            // 开始配置FreeMarker邮件模板
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_30);
            configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(), "templates");
            Template template = configuration.getTemplate("notice.ftlh");
            // 准备邮件模板参数
            Map<String, Object> params = new HashMap<>();
            params.put("festival", "国庆节");
            params.put("date", "2020年10月1日至2020年10月8日");
            StringWriter out = new StringWriter();
            // 渲染模板到输出流
            template.process(params, out);
            mmh.setText(out.toString(), true);

            mmh.setFrom(from);
            mmh.setSentDate(new Date());
            mmh.setTo("shehuandev@163.com");
            javaMailSender.send(mimeMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ConfigurationFreeMarker对应包下的类,Configuration.VERSION_2_3_30是使用的FreeMarker的版本号。测试的效果和Thymeleaf的一致。

上一篇下一篇

猜你喜欢

热点阅读