邮件发送是后端系统的常见功能——注册验证码、系统告警、周报推送。SpringBoot 封装了 JavaMail配置简单API 友好。一、配置1. 引入依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-mail/artifactId/dependency2. 邮箱配置spring:mail:host:smtp.qq.comport:465username:your_emailqq.compassword:你的授权码# 不是QQ密码是SMTP授权码properties:mail:smtp:auth:truessl:enable:truesocketFactory:port:465class:javax.net.ssl.SSLSocketFactory授权码获取QQ邮箱 → 设置 → 账号 → 开启SMTP服务 → 生成授权码二、发送邮件1. 简单文本邮件ServicepublicclassMailService{AutowiredprivateJavaMailSendermailSender;Value(${spring.mail.username})privateStringfrom;publicvoidsendSimpleMail(Stringto,Stringsubject,Stringcontent){SimpleMailMessagemessagenewSimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(content);mailSender.send(message);}}2. HTML 邮件publicvoidsendHtmlMail(Stringto,Stringsubject,StringhtmlContent)throwsMessagingException{MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(htmlContent,true);// true HTML 格式mailSender.send(message);}HTML 内容示例Stringhtmldiv stylepadding:20px;max-width:600px;margin:0 autoh2 stylecolor:#e74c3c秒杀成功通知/h2p亲爱的用户/pp您在秒杀活动中抢购的商品已成功下单/ptable border1 cellpadding8 styleborder-collapse:collapsetrtd订单号/tdtdorderNo/td/trtrtd商品名称/tdtdiPhone 15/td/trtrtd金额/tdtd¥4999/td/tr/tablebrp祝您购物愉快/p/div;3. 带附件邮件publicvoidsendAttachmentMail(Stringto,Stringsubject,Stringcontent,StringfilePath)throwsMessagingException{MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content);// 添加附件FilefilenewFile(filePath);helper.addAttachment(file.getName(),file);mailSender.send(message);}4. 带内联图片publicvoidsendInlineImageMail(Stringto,Stringsubject,Stringcontent,StringimgPath)throwsMessagingException{MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(htmlbodyimg srccid:image1/pcontent/p/body/html,true);FileSystemResourceimgnewFileSystemResource(newFile(imgPath));helper.addInline(image1,img);mailSender.send(message);}三、模板邮件1. 使用 Thymeleaf 模板dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependency!-- resources/templates/mail/welcome.html --!DOCTYPEhtmlhtmlxmlns:thhttp://www.thymeleaf.orgbodyh2th:text欢迎 ${username} 加入欢迎加入/h2p请点击以下链接激活账户/path:href${activateUrl}激活账户/apth:text链接有效期 ${expireHours} 小时有效期/p/body/htmlServicepublicclassTemplateMailService{AutowiredprivateJavaMailSendermailSender;AutowiredprivateTemplateEnginetemplateEngine;Value(${spring.mail.username})privateStringfrom;publicvoidsendTemplateMail(Stringto,Stringsubject,MapString,Objectparams)throwsMessagingException{// 渲染模板ContextcontextnewContext();context.setVariables(params);StringhtmltemplateEngine.process(mail/welcome.html,context);// 发送MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(html,true);mailSender.send(message);}}四、批量发送publicvoidsendBatch(ListStringtoList,Stringsubject,Stringcontent){for(Stringto:toList){try{sendSimpleMail(to,subject,content);// 每封间隔 3 秒避免被判定为垃圾邮件Thread.sleep(3000);}catch(Exceptione){log.error(发送失败: {},to,e);}}}五、异步发送ServicepublicclassAsyncMailService{Async(taskExecutor)publicvoidsendMailAsync(Stringto,Stringsubject,Stringcontent){mailService.sendSimpleMail(to,subject,content);log.info(邮件已异步发送: {},to);}}六、常见问题1. 535 Error登录失败# 原因用了QQ密码而不是授权码# 解决去QQ邮箱 → 设置 → 账号 → 生成授权码spring:mail:password:你的授权码# 不是QQ密码2. 554 被判定为垃圾邮件// 原因邮件内容太短或太模板化// 解决// - 内容不要太雷同// - 加收件人姓名个性化// - 控制发送频率每分钟不超过 10 封3. 发送超时spring:mail:properties:mail:smtp:connectiontimeout:5000timeout:5000writetimeout:5000七、秒杀系统应用ServicepublicclassSeckillMailService{Async(taskExecutor)publicvoidnotifySeckillResult(LonguserId,StringproductName,booleansuccess,StringorderNo){MapString,ObjectparamsnewHashMap();params.put(userId,userId);params.put(productName,productName);params.put(success,success);params.put(orderNo,orderNo);templateMailService.sendTemplateMail(userexample.com,秒杀结果通知,params);}}总结发送方式 简单文本 → SimpleMailMessage HTML内容 → MimeMessageHelper(true) 带附件 → helper.addAttachment() 内联图片 → helper.addInline() 注意事项 使用授权码而非密码 控制发送频率 异步发送不影响主流程 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。
SpringBoot 整合邮件发送——普通邮件、HTML邮件、附件邮件
发布时间:2026/7/14 23:30:47
邮件发送是后端系统的常见功能——注册验证码、系统告警、周报推送。SpringBoot 封装了 JavaMail配置简单API 友好。一、配置1. 引入依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-mail/artifactId/dependency2. 邮箱配置spring:mail:host:smtp.qq.comport:465username:your_emailqq.compassword:你的授权码# 不是QQ密码是SMTP授权码properties:mail:smtp:auth:truessl:enable:truesocketFactory:port:465class:javax.net.ssl.SSLSocketFactory授权码获取QQ邮箱 → 设置 → 账号 → 开启SMTP服务 → 生成授权码二、发送邮件1. 简单文本邮件ServicepublicclassMailService{AutowiredprivateJavaMailSendermailSender;Value(${spring.mail.username})privateStringfrom;publicvoidsendSimpleMail(Stringto,Stringsubject,Stringcontent){SimpleMailMessagemessagenewSimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(content);mailSender.send(message);}}2. HTML 邮件publicvoidsendHtmlMail(Stringto,Stringsubject,StringhtmlContent)throwsMessagingException{MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(htmlContent,true);// true HTML 格式mailSender.send(message);}HTML 内容示例Stringhtmldiv stylepadding:20px;max-width:600px;margin:0 autoh2 stylecolor:#e74c3c秒杀成功通知/h2p亲爱的用户/pp您在秒杀活动中抢购的商品已成功下单/ptable border1 cellpadding8 styleborder-collapse:collapsetrtd订单号/tdtdorderNo/td/trtrtd商品名称/tdtdiPhone 15/td/trtrtd金额/tdtd¥4999/td/tr/tablebrp祝您购物愉快/p/div;3. 带附件邮件publicvoidsendAttachmentMail(Stringto,Stringsubject,Stringcontent,StringfilePath)throwsMessagingException{MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content);// 添加附件FilefilenewFile(filePath);helper.addAttachment(file.getName(),file);mailSender.send(message);}4. 带内联图片publicvoidsendInlineImageMail(Stringto,Stringsubject,Stringcontent,StringimgPath)throwsMessagingException{MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(htmlbodyimg srccid:image1/pcontent/p/body/html,true);FileSystemResourceimgnewFileSystemResource(newFile(imgPath));helper.addInline(image1,img);mailSender.send(message);}三、模板邮件1. 使用 Thymeleaf 模板dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependency!-- resources/templates/mail/welcome.html --!DOCTYPEhtmlhtmlxmlns:thhttp://www.thymeleaf.orgbodyh2th:text欢迎 ${username} 加入欢迎加入/h2p请点击以下链接激活账户/path:href${activateUrl}激活账户/apth:text链接有效期 ${expireHours} 小时有效期/p/body/htmlServicepublicclassTemplateMailService{AutowiredprivateJavaMailSendermailSender;AutowiredprivateTemplateEnginetemplateEngine;Value(${spring.mail.username})privateStringfrom;publicvoidsendTemplateMail(Stringto,Stringsubject,MapString,Objectparams)throwsMessagingException{// 渲染模板ContextcontextnewContext();context.setVariables(params);StringhtmltemplateEngine.process(mail/welcome.html,context);// 发送MimeMessagemessagemailSender.createMimeMessage();MimeMessageHelperhelpernewMimeMessageHelper(message,true,UTF-8);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(html,true);mailSender.send(message);}}四、批量发送publicvoidsendBatch(ListStringtoList,Stringsubject,Stringcontent){for(Stringto:toList){try{sendSimpleMail(to,subject,content);// 每封间隔 3 秒避免被判定为垃圾邮件Thread.sleep(3000);}catch(Exceptione){log.error(发送失败: {},to,e);}}}五、异步发送ServicepublicclassAsyncMailService{Async(taskExecutor)publicvoidsendMailAsync(Stringto,Stringsubject,Stringcontent){mailService.sendSimpleMail(to,subject,content);log.info(邮件已异步发送: {},to);}}六、常见问题1. 535 Error登录失败# 原因用了QQ密码而不是授权码# 解决去QQ邮箱 → 设置 → 账号 → 生成授权码spring:mail:password:你的授权码# 不是QQ密码2. 554 被判定为垃圾邮件// 原因邮件内容太短或太模板化// 解决// - 内容不要太雷同// - 加收件人姓名个性化// - 控制发送频率每分钟不超过 10 封3. 发送超时spring:mail:properties:mail:smtp:connectiontimeout:5000timeout:5000writetimeout:5000七、秒杀系统应用ServicepublicclassSeckillMailService{Async(taskExecutor)publicvoidnotifySeckillResult(LonguserId,StringproductName,booleansuccess,StringorderNo){MapString,ObjectparamsnewHashMap();params.put(userId,userId);params.put(productName,productName);params.put(success,success);params.put(orderNo,orderNo);templateMailService.sendTemplateMail(userexample.com,秒杀结果通知,params);}}总结发送方式 简单文本 → SimpleMailMessage HTML内容 → MimeMessageHelper(true) 带附件 → helper.addAttachment() 内联图片 → helper.addInline() 注意事项 使用授权码而非密码 控制发送频率 异步发送不影响主流程 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。