Spring Boot框架 -- 邮件发送

本文详细介绍了如何使用SpringBoot发送邮件,包括开启QQ邮箱的SMTP服务,配置SpringBoot的邮件依赖,发送简单邮件、带附件的邮件,以及利用Thymeleaf构建邮件模板。示例代码展示了如何实现这些功能。
摘要由CSDN通过智能技术生成

Spring Boot – 邮件发送

1、前期准备

以QQ邮箱为例子,首先需要申请开通POP3/STMP服务或者IMAP/SMTP服务。

SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,定义了邮件客户与STMP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。

POP3(Post Office Protocol3),即邮局协议,定义了邮件客户端与POP3服务器之间的通信规则。

IMAP(Internet Message Access Protocol),交互邮件访问协议,与POP3协议作用类似,是POP3协议的拓展,功能更强。

QQ邮箱,开通POP3/STMP服务或者IMAP/SMTP服务的步骤:

  1. 登录QQ邮箱,点击顶部的设置按钮和账户按钮

    在这里插入图片描述

  2. 找到POP3/STMP服务,点击“开启”

    在这里插入图片描述

  3. 按其指令操作后,会得到一个授权码,保存起来,后面会使用到


2、环境搭建

邮件发送是一个常见的功能,Sum公司提供了JavaMail用来实现邮件发现,但是配置较为繁琐。Spring框架提供了JavaMailSender来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration来进一步简化。

  1. 在Spring Boot项目中添加邮件依赖
<!--        邮件依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  1. 在application.yml配置邮件基本信息
spring: 
  mail:
    host: smtp.qq.com # 发件服务器
    username: xxx@qq.com # 账号
    password: xxx # 密码(授权码)
    port: 465
    protocol: smtp  # 协议
    default-encoding: utf-8
    # 下面这些配置大家不用深究,主要用于SSL连接配置
    properties:
      mail:
        debug: true   # 开启debug
        imap:
          ssl:
            socketFactory:
              fallback: false
        smtp:
          auth: true
          ssl:
            enable: true
            socketFactory:
              class: com.fintech.modules.base.util.mail.MailSSLSocketFactory
          starttls:
            enable: true
            required: true
      test-connection: false

3、发送简单邮件

创建一个MailService接口以及实现类来封装邮件的发送,代码如下:

public interface MailService {
    /**
     * 发送简单的邮件
     * @param from 邮件发送者
     * @param to 邮件接收人
     * @param cc 邮件抄送人
     * @param subject 邮件主题
     * @param content 邮件内容
     */
    public void sendSimpleMail(String from, String to, String cc, String subject, String content);
}
@Service
public class MailServiceImpl implements MailService {

    // JavaMailSender是Spring Boot在MailSenderPropertiesConfiguration类中配置好的
    // 这里直接注入使用即可
    @Autowired
    private JavaMailSender javaMailSender;

    @Override
    public void sendSimpleMail(String from, String to, String cc, String subject, String content) {
        //构造一个SimpleMailMessage对象
        SimpleMailMessage mailMessage = new SimpleMailMessage();

        //进行相关配置
        mailMessage.setFrom(from);
        mailMessage.setTo(to);
        mailMessage.setCc(cc);
        mailMessage.setSubject(subject);
        mailMessage.setText(content);

        //使用JavaMailSender讲邮件发送出去
        javaMailSender.send(mailMessage);
    }
}

单元测试中写一个测试进行测试:

<!--        junit-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
@RunWith(SpringRunner.class)
@SpringBootTest
class ServiceTest {
    @Autowired
    private MailService mailService;

    @Test
    public void sendTest() {
        //zhang_9782021@163.com
        mailService.sendSimpleMail("xxx@qq.com",
                "xxx@qq.com",
                "xxx@qq.com",
                "测试邮件的主题",
                "测试邮件的内容");
    }
}

至此,一个简单的邮件发送成功。


4、发送带附件的邮件

发送带附件的邮件也很容易,通过调用Attachment方法即可添加附件,该方法调用多次即可添加多个文件。

在service层的MailService添加一个新的方法,如下:

/**
     * 发送带附件的邮件
     * @param from    邮件发送者
     * @param to      邮件接收人
     * @param cc      邮件抄送人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param file 附件文件
     */
    public void sendAttachFileMail(String from, String to, String cc, 
                                   String subject, String content, 
                                   File file) throws MessagingException;
@Override
public void sendAttachFileMail(String from, String to, String cc, 
                               String subject, String content, 
                               File file) throws MessagingException {
    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    
    helper.setFrom(from);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(content);
    helper.addAttachment(file.getName(), file);
    
    javaMailSender.send(message);
}

这里使用了MimeMessageHelper简化了邮件配置,其构造器的第二个参数true表示构造一个multipart message类型的邮件,multipart message类型的邮件包含多个正文、附件以及内嵌资源,最后通过addAttachment方法添加附件。

测试类:

@Test
public void sendTest02() throws MessagingException {
    mailService.sendAttachFileMail("1652644822@qq.com",
            "xxx@qq.com",
            "xxx@qq.com",
            "测试带附件邮件的主题",
            "测试带附件邮件的内容",
            new File("E:\\Photo\\基操勿6.jpg"));
}

5、Thymeleaf构建邮件模板

对于格式复杂邮件的,如果采用字符换进行HTML拼接,很容易出错,使用HTML模板很容易解决这个问题。

使用Thymeleaf构建邮件模板,首先添加Thymeleaf依赖:

<!--        Thymeleaf模板引擎-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Thymeleaf邮件模板默认位置是在resources/templates目录下,创建相应的目录以及mail.html,代码:

<!DOCTYPE html>
<html lang="en"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件</title>
</head>
<body>

<div>邮箱激活</div>
<div>您的注册信息是:</div>
<div>
    <table border="1px">
        <tr>
            <td>用户名</td>
            <td th:text="${userName}"></td>
        </tr>
        <tr>
            <td>密码</td>
            <td th:text="${password}"></td>
        </tr>
    </table>
</div>
</body>
</html>

在service层添加一个sendHtmlMail方法,代码如下:

/**
 * 发送带附件的邮件
 *
 * @param from    邮件发送者
 * @param to      邮件接收人
 * @param cc      邮件抄送人
 * @param subject 邮件主题
 * @param content 邮件内容
 */
public void sendHtmlMail(String from, String to, 
                         String cc, String subject, 
                         String content) throws MessagingException;
@Override
public void sendHtmlMail(String from, String to, String cc, String subject, String content) throws MessagingException {
    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(content, true);
    javaMailSender.send(message);
}

测试类:

@Autowired
private TemplateEngine templateEngine;
@Test
public void sendHtmlMailTest() throws MessagingException {
    Context context = new Context();
    context.setVariable("userName", "Spring Boot");
    context.setVariable("password", "Spring Boot");
    String mail = templateEngine.process("mail", context);
    mailService.sendHtmlMail("xxx@qq.com",
            "xxx@qq.com",
            "xxx@qq.com",
            "测试Thymeleaf构建邮件模板的主题",
            mail);
}

至此,几种不同的邮件发送的方式大致如此。


注:此文章为个人学习笔记,如有错误,敬请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值