前言

在今天的数字化时代,电子邮件依然是沟通与合作的重要工具。对于Java开发者来说,如何在应用程序中高效地发送邮件是一个常见需求。Spring框架中的JavaMailSender接口正是为此而生,它提供了一个简洁而强大的API,让我们能够轻松地在Spring应用中集成邮件发送功能。本文将带你深入了解JavaMailSender,包括其基本概念、配置方法以及实际使用案例。

一、JavaMailSender简介

JavaMailSender是Spring框架提供的一个接口,用于发送电子邮件。它封装了JavaMail API的复杂性,让开发者无需直接处理底层的邮件发送逻辑。通过简单的配置和调用,你就可以实现邮件的发送,包括文本邮件、HTML邮件、带附件的邮件等。

二、配置JavaMailSender

要在Spring项目中使用JavaMailSender,首先需要在你的Spring配置文件中进行相应的设置。这通常涉及到两个步骤:添加依赖和配置邮件服务器信息。

添加依赖

如果你使用的是Maven构建工具,你需要在pom.xml文件中添加Spring Mail的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 配置邮件模板用 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置邮件服务器信息

在Spring Boot项目中,你可以在application.properties或application.yml文件中配置邮件服务器的相关信息,例如SMTP服务器地址、端口、用户名和密码等。

这里使用YAML格式:

spring:
  application:
    name: my-spring-security
  mail:
    host: smtp.163.com
    username: your-email@example.com
    password: your-email-password
    default-encoding: UTF-8
    port: 465
    protocol: smtp
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          ssl:
            enable: true
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory

mail:
  fromMail:
    addr: your-email@example.com  

三、使用JavaMailSender发送邮件

配置完成后,你可以通过注入JavaMailSender接口来发送邮件。以下是一个简单的示例,展示了如何发送纯文本邮件和HTML邮件。

创建MailService.java

package com.hx.myemail.service;

/**
 * 描述
 *
 * @author hanxu
 * @date 2024/12/23
 * @since 2024/12/23
 */
public interface MailService {
    /**
     * 发送简单邮件
     * @param to
     * @param subject
     * @param content
     */
    void sendSimpleMail(String to, String subject, String content);

    /**
     * 发送html邮件
     * @param to
     * @param subject
     * @param content
     */
    void sendHtmlMail(String to, String subject, String content);

    /**
     * 发送带附件的邮件
     * @param to
     * @param subject
     * @param content
     * @param filePaths
     */
    void sendAttachmentMail(String to, String subject, String content, String[] filePaths);

    /**
     * 发送带静态资源的邮件
     * @param to
     * @param subject
     * @param content
     * @param filePaths
     * @param rscId
     */
    void sendInlineResourceMail(String to, String subject, String content, String[] filePaths, String rscId);


}

实现类 MailServiceImpl.java

package com.hx.myemail.service.impl;

import com.hx.myemail.service.MailService;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.stereotype.Service;

import java.io.File;

/**
 * 描述
 *
 * @author hanxu
 * @date 2024/12/23
 * @since 2024/12/23
 */
@Service
public class MailServiceImpl implements MailService {

    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${mail.fromMail.addr}")
    private String from;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        try {
            javaMailSender.send(message);
            System.out.println(">>>>>邮件发送成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) {

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            javaMailSender.send(mimeMessage);
            System.out.println(">>>>>Html邮件发送成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void sendAttachmentMail(String to, String subject, String content, String[] filePaths) {
        MimeMessage message = javaMailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            for (String filePath : filePaths) {
                FileSystemResource file = new FileSystemResource(new File(filePath));
                String filename = filePath.substring(filePath.lastIndexOf(File.separator));
                helper.addAttachment(filename, file);
            }

            javaMailSender.send(message);
            System.out.println(">>>>>待附件的邮件发送成功!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void sendInlineResourceMail(String to, String subject, String content, String[] filePaths, String rscId) {
        MimeMessage message = javaMailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource fileSystemResource = new FileSystemResource(new File(filePaths[0]));
            helper.addInline(rscId, fileSystemResource);

            javaMailSender.send(message);

            System.out.println(">>>>>发送静态资源邮件成功!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

四、进行测试

使用单元测试类发送邮件

package com.hx.myemail;

import com.hx.myemail.service.MailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

/**
 * 描述
 *
 * @author hanxu
 * @date 2024/12/23
 * @since 2024/12/23
 */
@SpringBootTest
public class MailServiceTest {

    @Autowired
    private MailService mailService;

    @Autowired
    private TemplateEngine templateEngine;

    private String toEmail = "example@163.com";

    @Test
    void sendHtmlMail() {

        String content = "<html><body><h1>hello world</h1> <br/> <h3>这是一封Html邮件!</h3></body></html>";

        mailService.sendHtmlMail(toEmail, "测试Html邮件", content);
    }

    @Test
    void sendSimpleMail() {
        mailService.sendSimpleMail(toEmail, "测试简单邮件", "这是一封简单邮件!");
    }

    @Test
    void sendAttachmentMail() {
        String[] filePaths = {"D:\\cpu30.jar", "D:\\hello.py", "D:\\testManageLog.doc"};
        mailService.sendAttachmentMail(toEmail, "测试附件邮件", "这是一封附件邮件!", filePaths);
    }

    @Test
    void sendInlineResourceMail() {
        String rscId = "neo006";
        String[] imagePath = {"D:\\background\\559ad287880511ebb6edd017c2d2eca2.png"};
        String content = "<html><body><h1>hello world</h1> <br/> <img src=\"cid:" + rscId + "\" / > </body></html>";
        mailService.sendInlineResourceMail(toEmail, "测试静态资源邮件", content, imagePath, rscId);
    }

    @Test
    void sendTemplateMail() {
        Context context = new Context();
        context.setVariable("checkCode", "AKJ878");
        context.setVariable("signName", "SIGN_NAME");
        String emailTemplate = templateEngine.process("mailTemplate", context);
        mailService.sendHtmlMail(toEmail, "测试模板邮件", emailTemplate);
    }

    @Test
    void sendTemplateMail2() {
        Context context = new Context();
        context.setVariable("code", "RRGZXB");
        String emailTemplate = templateEngine.process("mailTemplate/codeTemplate", context);
        mailService.sendHtmlMail(toEmail, "测试模板邮件2", emailTemplate);
    }
}

thymleaf模板的目录结构
在这里插入图片描述
mailTemplate.html内容

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    您好,这是验证邮件,请点击下面的链接完成验证,<br/>
    <p><span th:text="${signName}"></span>】您的验证码为:<span th:text="${checkCode}"></span>,请勿泄漏!如非本人操作,请忽略!</p>
    <a href="#" th:href="@{ https://www.baidu.com }">百度</a>
</body>
</html>

codeTemplate.html内容

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    这是验证码的模板邮件:<span th:text="${code}"></span>
</body>
</html>

五、总结

JavaMailSender是Spring框架中处理邮件发送的强大工具,通过简单的配置和API调用,可以轻松实现邮件的发送功能。无论是纯文本邮件、HTML邮件还是带附件的邮件,JavaMailSender都能提供很好的支持。

Logo

一站式 AI 云服务平台

更多推荐