spring boot发送邮件

embedded/2024/10/11 3:10:38/

文章目录

  • 项目目录结构
  • 添加maven依赖
  • application.yml配置发信人信息
  • 编码测试
    • 创建 Email 工具类 `EmailUtil`
    • 测试发送邮件

项目目录结构

在这里插入图片描述

添加maven依赖

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

application.yml配置发信人信息

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

password 是授权码,不是登录密码
邮箱设置开启服务,生成授权码
在这里插入图片描述
在这里插入图片描述

spring:mail:host: smtp.qq.comusername: [发送邮箱账号]password: [邮箱授权码]default-encoding: UTF-8protocol: smtpport: 587properties: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;@Autowiredpublic 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;@Autowiredpublic 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";}
}

http://www.ppmy.cn/embedded/125675.html

相关文章

前端页面模块修改成可动态生成数据模块——大部分数据为GPT生成(仅供学习参考)

前端页面模块修改成可动态生成数据模块&#xff1a; 这些案例展示了如何通过Blade模板将前端页面模块变成可动态生成的模板。通过巧妙使用Blade语法、控制结构、CSS/JS分离、组件复用等技巧&#xff0c;可以大大提高代码的灵活性和复用性。在Laravel的Controller中准备好数据并…

方法重写与多态

方法重写 1.在子类和父类直接 2.方法名相同 3.参数个数和类型相同 4.返回类型相同或是其父类 5.访问权限不能严于父类 package com.hz.ch04.test01;public abstract class Pet {private String name;private int love;private int health;public String getName() {retur…

C++面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面&#xff1a; 资源重用&#xff1a;连接池允许多个客户端共享有限的数据库连接&#xff0c;减少频繁创建和销毁连接的开销&#xff0c;从而提高资源的利用率。 统一的连接管理&#xff1a;连接池集中管理数据库连…

c++中的final说明符

final是c11引入的说明符&#xff0c;可以修饰在类或者类成员函数尾部。 final修饰类时&#xff0c;表示该类不能被继承。 class A final { }; 上例表明&#xff0c;类A是一个不能被继承的类。 class A { public:virtual void bar(); };class B final: public A { public:voi…

模拟实现消息队列(基于SpringBoot实现)

项目代码 提要&#xff1a;此处的消息队列是仿照RabbitMQ实现&#xff08;参数之类的&#xff09;&#xff0c;实现一些基本的操作&#xff1a;创建/销毁交互机&#xff08;exchangeDeclare&#xff0c;exchangeDelete&#xff09;&#xff0c;队列&#xff08;queueDeclare&a…

JSON数据操作与处理全面指南

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;广泛应用于前后端的数据传递和API通信中。它基于键值对的方式组织数据&#xff0c;便于人类阅读和机器解析。在Java开发中&#xff0c;处理JSON数据通常需要使用一些常见的库&am…

rabbitMq-----消费者管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消费者字段消费者内存管理类新增/删除消费者 总的消费者管理类 前言 只有订阅客户端订阅了一个队列消息后&#xff0c;他才是一个消费者&#xff0c;而消费者存…

打破常规,BD仓储物流的效能提升!

当前&#xff0c;随着国家战略的推进&#xff0c;JS与民用领域的融合不断加深&#xff0c;物流业也步入了军民融合的新时代。在智能仓储物流方面&#xff0c;JS物流的智能化进展受到了BD系统的高度关注和重视。 一、建设JS仓储物流RFID基础设施 JS物流领域引入RFID技术的基础工…