spring boot发送邮件

文章目录

项目目录结构

添加maven依赖

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

application.yml配置发信人信息

我这里已qq邮箱为例,如果是其它邮箱也一样,需要修改 host

password 是授权码,不是登录密码

邮箱设置开启服务,生成授权码

yml 复制代码
spring:
  mail:
    host: smtp.qq.com
    username: [发送邮箱账号]
    password: [邮箱授权码]
    default-encoding: UTF-8
    protocol: smtp
    port: 587
    properties:
      mail:
        stmp:
          ssl:
            enable: true

编码测试

创建 Email 工具类 EmailUtil

java 复制代码
package com.example.demoboot.utils;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.IOException;
import java.util.Map;


@Component
public class EmailUtil {

    @Value("${spring.mail.username}")
    private String from; // 发件人
    private MailSender mailSender;
    private JavaMailSender javaMailSender;  // JavaMailSender 继承了 MailSender ,可以发送更复杂的邮件,可以携带附件。
    private TemplateEngine templateEngine;

    @Autowired
    public EmailUtil(MailSender mailSender, JavaMailSender javaMailSender, TemplateEngine templateEngine) {
        this.mailSender = mailSender;
        this.javaMailSender = javaMailSender;
        this.templateEngine = templateEngine;
    }

    /**
     * 发送一般邮件 -- 无附件
     * @param to      收件人
     * @param subject 主题
     * @param content 内容
     * @return 是否成功
     */
    public boolean sendGeneralEmail(String subject, String content, String[] to) {
        // 创建邮件消息
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        // 设置收件人
        message.setTo(to);
        // 设置邮件主题
        message.setSubject(subject);
        // 设置邮件内容
        message.setText(content);
        // 发送邮件
        mailSender.send(message);
        return true;
    }

    /**
     * 发送带附件的邮件
     * @param to        收件人
     * @param subject   主题
     * @param content   内容
     * @param filePaths 附件路径
     * @return 是否成功
     */
    public boolean sendAttachmentsEmail(String subject, String content, String[] to, String[] filePaths) throws MessagingException, IOException {

        // 创建邮件消息
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom(from);
        // 设置收件人
        helper.setTo(to);
        // 设置邮件主题
        helper.setSubject(subject);
        // 设置邮件内容
        helper.setText(content);

        // 添加附件
        if (filePaths != null) {
            for (String filePath : filePaths) {
                ClassPathResource resource = new ClassPathResource(filePath);
                String filename = resource.getFilename();
                File file = resource.getFile();
                assert filename != null;
                helper.addAttachment(filename, file);
            }
        }
        // 发送邮件
        javaMailSender.send(mimeMessage);
        return true;
    }

    /**
     * 发送带静态图片资源的邮件,图片资源内嵌在消息主题中
     * @param to         收件人
     * @param subject    主题
     * @param content    内容
     * @param picPathMap 静态资源路径
     * @return 是否成功
     */
    public boolean sendInlinePictureEmail(String subject, String content, String[] to, Map<String, String> picPathMap) throws MessagingException {
        // 创建邮件消息
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        // 设置发件人
        helper.setFrom(from);
        // 设置收件人
        helper.setTo(to);
        // 设置邮件主题
        helper.setSubject(subject);
        // html内容图片
        StringBuffer buffer = new StringBuffer();
        buffer.append("<html><body><div>");
        buffer.append(content);
        buffer.append("</div>包含以下图片:</br>");
        picPathMap.forEach((k, v) -> buffer.append("<img src=\'cid:")
                                           .append(k)
                                           .append("\'></br>"));
        buffer.append("</body></html>");
        helper.setText(buffer.toString(), true);
        // 指定讲资源地址
        picPathMap.forEach((k, v) -> {
            // FileSystemResource res = new FileSystemResource(new File(v));
            ClassPathResource res = new ClassPathResource(v);
            try {
                helper.addInline(k, res);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        });

        javaMailSender.send(mimeMessage);
        return true;
    }

	/**
     * 发送模板邮件
     * @param subject 主题
     * @param templateName  模板名称
     * @param templateData  模板参数
     * @param to    收件人
     * @return
     * @throws MessagingException
     */
    public boolean sendTemplateEmail(String subject, String templateName, Map<String, Object> templateData, String[] to) throws MessagingException {

        Context context = new Context();
        context.setVariables(templateData);
        String content = templateEngine.process(templateName, context);
        // 创建邮件消息
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom(from);
        // 设置收件人
        helper.setTo(to);
        // 设置邮件主题
        helper.setSubject(subject);
        // 设置邮件内容
        helper.setText(content, true);
        // 发送邮件
        javaMailSender.send(mimeMessage);
        return true;
    }
}

测试发送邮件

java 复制代码
package com.example.demoboot.controller;

import com.example.demoboot.utils.EmailUtil;
import jakarta.mail.MessagingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;

import java.io.IOException;
import java.util.HashMap;

@Controller
@RequestMapping("/mail")
public class MailController {

    private EmailUtil emailUtil;


    @Autowired
    public MailController(EmailUtil emailUtil) {
        this.emailUtil = emailUtil;
    }

    @ResponseBody
    @RequestMapping("/send/1")
    public String send() {
        emailUtil.sendGeneralEmail("测试邮件", "测试邮件内容", new String[]{"xxxxx@qq.com"});
        return "success";
    }

    @ResponseBody
    @RequestMapping("/send/2")
    public String send2() {
        HashMap<String, String> map = new HashMap<>();
        map.put("1", "static/1.jpg");
        map.put("2", "static/2.jpg");
        try {
            emailUtil.sendInlinePictureEmail("测试邮件", "测试邮件内容", new String[]{"xxxxx@qq.com"}, map);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
        return "success";
    }

    @ResponseBody
    @RequestMapping("/send/3")
    public String send3() {
        try {
            emailUtil.sendAttachmentsEmail("测试邮件", "测试邮件内容", new String[]{"xxxxx@qq.com"}, new String[]{"static/1.jpg", "static/2.jpg"});
        } catch (MessagingException | IOException e) {
            throw new RuntimeException(e);
        }
        return "success";
    }

	@ResponseBody
    @RequestMapping("/send/4")
    public String send4() throws MessagingException {
        HashMap<String, Object> map = new HashMap<>();
        map.put("info", "测试邮件");
        map.put("say", "你好!!!!!!!!");
        emailUtil.sendTemplateEmail("测试邮件", "mailTemplate", map, new String[]{"762741385@qq.com"});
        return "mailTemplate";
    }
}
相关推荐
devlei4 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
pshdhx_albert5 小时前
AI agent实现打字机效果
java·http·ai编程
沉鱼.445 小时前
第十二届题目
java·前端·算法
努力的小郑6 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
赫瑞6 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
Victor3567 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3567 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁7 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp7 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
周末也要写八哥7 小时前
多进程和多线程的特点和区别
java·开发语言·jvm