重庆建设执业资格注册中心网站,娄底手机网站制作,h5做的公司网站,福州网站推广优化一、知识点背景
在 SpringBoot 项目中#xff0c;邮件发送是常见功能#xff08;如注册通知、告警推送#xff09;#xff0c;但单文本邮件无法满足复杂场景#xff08;如带样式的通知、多附件报表#xff09;。本文详解SpringBoot 3.x整合JavaMailSender实现多收件人 …一、知识点背景在 SpringBoot 项目中邮件发送是常见功能如注册通知、告警推送但单文本邮件无法满足复杂场景如带样式的通知、多附件报表。本文详解SpringBoot 3.x整合JavaMailSender实现多收件人 HTML 模板 附件的完整流程并解决实际开发中的常见问题。二、学习过程 步骤图文并茂步骤 1引入核心依赖pom.xml在 SpringBoot 项目中需引入邮件和模板引擎Thymeleaf依赖xml!-- SpringBoot邮件核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-mail/artifactId /dependency !-- Thymeleaf用于HTML邮件模板 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency步骤 2配置邮箱参数application.yml以 QQ 邮箱为例其他邮箱如网易 / 企业邮箱仅需修改服务器地址yamlspring: mail: # QQ邮箱SMTP服务器地址 host: smtp.qq.com # SMTP端口SSL加密 port: 465 # 发件人邮箱 username: 你的QQ邮箱qq.com # 注意不是QQ密码是邮箱“授权码”需在QQ邮箱设置中开启 password: 你的QQ邮箱授权码 # 加密方式SSL protocol: smtps properties: mail: smtp: auth: true starttls: enable: true required: true图 1QQ 邮箱 “POP3/SMTP 服务” 开启界面此处建议插入截图QQ 邮箱→设置→账户→开启 POP3/SMTP 服务的界面步骤 3封装通用邮件工具类实现多收件人、附件、HTML 模板的复用工具类java运行package com.example.mail.utils; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; 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; /** * SpringBoot邮件发送工具类支持多收件人、HTML模板、附件 */ Component public class MailSendUtils { private final JavaMailSender mailSender; private final TemplateEngine templateEngine; // 构造注入Spring推荐方式 public MailSendUtils(JavaMailSender mailSender, TemplateEngine templateEngine) { this.mailSender mailSender; this.templateEngine templateEngine; } /** * 发送带HTML模板多附件的邮件 * param to 收件人列表如{user1qq.com, user2163.com} * param subject 邮件主题 * param templateName Thymeleaf模板名如emailTemplate * param context 模板参数 * param attachments 附件列表 */ public void sendTemplateMailWithAttach( String[] to, String subject, String templateName, Context context, File[] attachments ) throws MessagingException { // 1. 创建MimeMessage支持多部分内容 MimeMessage mimeMessage mailSender.createMimeMessage(); // 2. 初始化Helpertrue支持多部分UTF-8避免中文乱码 MimeMessageHelper helper new MimeMessageHelper(mimeMessage, true, UTF-8); // 3. 设置邮件基础信息 helper.setFrom(你的QQ邮箱qq.com); // 发件人 helper.setTo(to); // 多收件人 helper.setSubject(subject); // 主题 // 4. 渲染Thymeleaf模板为HTML内容 String htmlContent templateEngine.process(templateName, context); helper.setText(htmlContent, true); // true内容是HTML // 5. 添加多个附件 if (attachments ! null attachments.length 0) { for (File file : attachments) { helper.addAttachment(file.getName(), file); } } // 6. 发送邮件 mailSender.send(mimeMessage); } }步骤 4编写 HTML 邮件模板在resources/templates下创建emailTemplate.htmlThymeleaf 模板html预览!DOCTYPE html html langzh-CN xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 title【SpringBoot邮件测试】/title style .content { color: #333; font-size: 14px; line-height: 1.8; } .sign { color: #666; margin-top: 20px; } /style /head body div classcontent p您好span th:text${username}用户/span/p p这是一封来自SpringBoot的HTML模板邮件您的验证码是span stylecolor: #ff4d4f; font-weight: bold; th:text${code}123456/span/p /div div classsign p—— SpringBoot邮件测试团队/p /div /body /html图 2Thymeleaf 模板文件目录结构此处建议插入截图IDEA 中 resources/templates 下的 emailTemplate.html 位置步骤 5测试邮件发送Controller 层编写接口触发邮件发送java运行package com.example.mail.controller; import com.example.mail.utils.MailSendUtils; import jakarta.mail.MessagingException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.thymeleaf.context.Context; import java.io.File; RestController public class MailController { private final MailSendUtils mailSendUtils; public MailController(MailSendUtils mailSendUtils) { this.mailSendUtils mailSendUtils; } GetMapping(/sendMail) public String sendMail() throws MessagingException { // 1. 收件人列表 String[] to {收件人1qq.com, 收件人2163.com}; // 2. 邮件主题 String subject SpringBoot邮件测试含模板附件; // 3. 模板参数 Context context new Context(); context.setVariable(username, 测试用户); context.setVariable(code, 888888); // 4. 附件示例本地的test.txt文件 File[] attachments {new File(D:/test.txt)}; // 调用工具类发送邮件 mailSendUtils.sendTemplateMailWithAttach(to, subject, emailTemplate, context, attachments); return 邮件发送成功; } }三、遇到的问题 解决过程问题 1MailAuthenticationException认证失败现象启动项目调用接口后控制台报错Authentication failed。原因邮箱未开启 “POP3/SMTP 服务”application.yml中password填的是 QQ 密码而非授权码。解决步骤登录 QQ 邮箱→设置→账户→开启 “POP3/SMTP 服务”生成 “授权码”需验证手机将password替换为授权码。问题 2附件发送后乱码现象收件人收到邮件后附件名称显示为乱码如 “????.txt”。原因MimeMessageHelper未指定编码格式。解决步骤在初始化MimeMessageHelper时显式指定编码为UTF-8java运行MimeMessageHelper helper new MimeMessageHelper(mimeMessage, true, UTF-8);问题 3SocketTimeoutException连接超时现象调用接口后长时间无响应最终报错Connection timed out。原因服务器防火墙屏蔽了 SMTP 端口如 465网络环境限制如公司内网禁止外部邮件连接。解决步骤测试端口连通性用telnet smtp.qq.com 465验证是否能连接若端口不通联系运维开放端口或切换为企业内网邮箱。四、总结 最佳实践核心总结SpringBoot 邮件发送的核心是JavaMailSender配合MimeMessageHelper实现复杂邮件多收件人通过helper.setTo(String[] to)实现附件通过helper.addAttachment()添加Thymeleaf 模板需放在resources/templates目录下通过TemplateEngine渲染为 HTML。生产环境最佳实践异步发送用Async注解 线程池异步发送避免阻塞业务线程java运行// 在工具类方法上添加Async Async public void sendTemplateMailWithAttach(...) { ... }异常重试结合Spring Retry实现邮件发送失败重试避免网络波动导致的单次失败日志记录记录邮件发送状态成功 / 失败便于排查问题。