若依框架中实现邮件发送功能

2025-06发布2次浏览

在若依(RuoYi)框架中实现邮件发送功能,通常需要借助Java的邮件发送库javax.mail或其替代品jakarta.mail。若依框架本身是一个基于Spring Boot的快速开发平台,提供了模块化和插件化的扩展能力,因此我们可以利用这些特性来集成邮件发送功能。

以下是实现邮件发送功能的详细步骤:


1. 引入依赖

首先,在项目的pom.xml文件中添加邮件相关的依赖项。若依框架使用的是Spring Boot,因此可以直接引入Spring Boot提供的邮件支持模块。

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

如果项目中尚未配置Lombok插件,也可以一并引入以简化代码开发:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2. 配置邮件服务器信息

application.ymlapplication.properties文件中配置邮件服务器的相关参数。以下是一个典型的SMTP服务器配置示例:

spring:
  mail:
    host: smtp.qq.com # 邮件服务器地址,例如QQ邮箱、163邮箱等
    port: 587 # SMTP端口
    username: your_email@qq.com # 发件人邮箱账号
    password: your_auth_code # 授权码,而非邮箱密码
    properties:
      mail:
        smtp:
          auth: true # 是否需要身份验证
          starttls:
            enable: true # 启用TLS加密
    default-encoding: UTF-8 # 默认编码

注意

  • 如果使用QQ邮箱,请确保已开启SMTP服务,并获取授权码作为password字段的值。
  • 对于其他邮箱(如163、Gmail等),需根据其官方文档调整相关配置。

3. 创建邮件发送服务

在若依框架中,可以通过创建一个Service类来封装邮件发送逻辑。以下是一个简单的实现示例:

3.1 定义邮件发送接口

public interface MailService {
    /**
     * 发送简单文本邮件
     *
     * @param to      收件人邮箱
     * @param subject 邮件主题
     * @param content 邮件内容
     */
    void sendSimpleMail(String to, String subject, String content);

    /**
     * 发送HTML格式邮件
     *
     * @param to      收件人邮箱
     * @param subject 邮件主题
     * @param content 邮件内容(HTML格式)
     */
    void sendHtmlMail(String to, String subject, String content);
}

3.2 实现邮件发送逻辑

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

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

@Service
public class MailServiceImpl implements MailService {

    @Autowired
    private JavaMailSender javaMailSender;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        javaMailSender.send(message);
    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true); // 第二个参数为true表示启用HTML格式
        javaMailSender.send(mimeMessage);
    }
}

4. 测试邮件发送功能

为了验证邮件发送功能是否正常工作,可以在Controller层编写一个测试接口。例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MailController {

    @Autowired
    private MailService mailService;

    @GetMapping("/sendMail")
    public String sendMail(@RequestParam String to, @RequestParam String subject, @RequestParam String content) {
        try {
            mailService.sendHtmlMail(to, subject, content);
            return "邮件发送成功!";
        } catch (Exception e) {
            e.printStackTrace();
            return "邮件发送失败:" + e.getMessage();
        }
    }
}

访问http://localhost:8080/sendMail?to=receiver@example.com&subject=Test&content=<h1>Hello</h1>即可触发邮件发送。


5. 处理异常情况

在实际应用中,可能会遇到各种异常,例如网络问题、认证失败等。因此,建议对邮件发送过程进行日志记录和错误处理。可以在MailServiceImpl中加入日志记录功能:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
public class MailServiceImpl implements MailService {

    private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);

    @Autowired
    private JavaMailSender javaMailSender;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(to);
            message.setSubject(subject);
            message.setText(content);
            javaMailSender.send(message);
            logger.info("邮件发送成功:{}", to);
        } catch (Exception e) {
            logger.error("邮件发送失败:{}", to, e);
        }
    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(mimeMessage);
            logger.info("HTML邮件发送成功:{}", to);
        } catch (MessagingException e) {
            logger.error("HTML邮件发送失败:{}", to, e);
            throw e;
        }
    }
}

6. 扩展功能:附件与模板邮件

6.1 发送带附件的邮件

可以使用MimeMessageHelperaddAttachment方法来添加附件:

@Override
public void sendAttachmentMail(String to, String subject, String content, String filePath) throws MessagingException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(content, true);
    FileSystemResource file = new FileSystemResource(new File(filePath));
    helper.addAttachment("附件名称", file);
    javaMailSender.send(mimeMessage);
}

6.2 使用Thymeleaf模板生成邮件内容

通过整合Thymeleaf模板引擎,可以动态生成复杂的邮件内容。以下是一个简单的实现:

  1. application.yml中引入Thymeleaf依赖。
  2. 创建一个HTML模板文件(如emailTemplate.html)。
  3. 修改sendHtmlMail方法以支持模板渲染。
@Autowired
private TemplateEngine templateEngine;

@Override
public void sendTemplateMail(String to, String subject, Map<String, Object> model) throws MessagingException {
    Context context = new Context();
    context.setVariables(model);
    String emailContent = templateEngine.process("emailTemplate", context);

    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(emailContent, true);
    javaMailSender.send(mimeMessage);
}