使用SpringBoot发邮件
SpringBoot中已有发邮件的工具包,只需要引用即可使用
1,pom引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2,在配置文件中配置邮件服务器信息。这里需要一个可用的邮件服务器。
spring.mail.default-encoding=utf-8
spring.mail.host=mail.xxxx.com
spring.mail.username=xxxx@xxxx.com
spring.mail.password=password
3,编写发邮件service,调用JavaMailSender.send()即可,支持简单文本邮件、富文本邮件、html邮件
Service代码如下

1 import org.springframework.beans.factory.annotation.Autowired; 2 import org.springframework.beans.factory.annotation.Value; 3 import org.springframework.core.io.FileSystemResource; 4 import org.springframework.mail.MailException; 5 import org.springframework.mail.SimpleMailMessage; 6 import org.springframework.mail.javamail.JavaMailSender; 7 import org.springframework.mail.javamail.MimeMessageHelper; 8 import org.springframework.stereotype.Service; 9 10 import javax.mail.MessagingException; 11 import javax.mail.internet.MimeMessage; 12 import java.io.File; 13 14 @Service 15 public class EmailService { 16 @Autowired 17 private JavaMailSender mailSender; 18 19 @Value("${spring.mail.username}") 20 private String from; 21 22 /** 23 * 发送简单文本邮件 24 * @param content 邮件正文 25 * @param subject 邮件主题 26 * @param to 邮件接收地址 27 * */ 28 public void sendSimpleMail(String to, String subject, String content) throws MailException { 29 System.out.println("-----from:" + from); 30 System.out.println("-----to:" + to); 31 System.out.println("-----subject:" + subject); 32 System.out.println("-----content:" + content); 33 34 SimpleMailMessage message = new SimpleMailMessage(); 35 message.setFrom(from); 36 message.setTo(to); 37 message.setSubject(subject); 38 message.setText(content); 39 mailSender.send(message); 40 } 41 42 /** 43 * 发送富文本邮件 44 * @param content 邮件正文 45 * @param rscId 设置在header头中的文件ID 46 * @param rscPath 图片路径 47 * @param subject 邮件主题 48 * @param to 邮件接收地址 49 * */ 50 public void sendRichTextMail(String to, String subject, String content, String rscPath, String rscId) throws MessagingException { 51 //MimeMessageHelper支持发送复杂邮件模板,支持文本、附件、HTML、图片等。 52 //如果需要发送多张图片,可以改变传参方式,使用集合添加多个<img src='cid:rscId'>和helper.addInline(rscId, res);即可实现 53 54 MimeMessage message = mailSender.createMimeMessage(); 55 MimeMessageHelper helper = new MimeMessageHelper(message, true); 56 helper.setFrom(from); 57 helper.setTo(to); 58 helper.setSubject(subject); 59 helper.setText(content, true); 60 File file = new File(rscPath); 61 FileSystemResource res = new FileSystemResource(file); 62 helper.addInline(rscId, res); 63 64 mailSender.send(message); 65 66 } 67 68 /** 69 * 发送HTML邮件 70 * @param to 邮件接收地址 71 * @param subject 邮件主题 72 * @param content 邮件正文 73 * */ 74 public void sendHtmlMail(String to, String subject, String content) throws MessagingException { 75 MimeMessage message = mailSender.createMimeMessage(); 76 //true 表⽰示需要创建⼀一个 multipart message 77 MimeMessageHelper helper = new MimeMessageHelper(message, true); 78 helper.setFrom(from); 79 helper.setTo(to); 80 helper.setSubject(subject); 81 helper.setText(content, true); 82 mailSender.send(message); 83 } 84 }
controller测试代码

1 import com.hyp.emailtest.service.EmailService; 2 import org.springframework.beans.factory.annotation.Autowired; 3 import org.springframework.mail.MailException; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 import org.springframework.web.bind.annotation.RestController; 7 8 import javax.mail.MessagingException; 9 10 @RestController 11 @RequestMapping("Mail") 12 public class EmailController { 13 14 @Autowired 15 private EmailService emailService; 16 17 //发送简单文本邮件 18 @RequestMapping(value = "send", method = RequestMethod.GET) 19 public void Send() { 20 String To = "test@xxxx.com"; 21 String Subject = "Java发邮件测试"; 22 String Content = "这是一封来自JavaMailSender自动发送的测试邮件"; 23 try { 24 emailService.sendSimpleMail(To, Subject, Content); 25 System.out.println("发送成功"); 26 } catch (MailException ex) { 27 System.out.println("发送失败"); 28 System.out.println(ex.toString()); 29 } 30 } 31 32 //发送富文本邮件 33 @RequestMapping(value = "sendImg", method = RequestMethod.GET) 34 public void SendWithImg() { 35 String to = "test@xxxx.com"; 36 String subject = "Java发邮件测试"; 37 String rscId = "img1"; 38 String content = "<html><body><img width='250px' src=\'cid:" + rscId + "\'></body></html>"; 39 //图片路径,这里要写绝对路径 40 String imgPath = "E:\\11.jpg"; 41 try { 42 emailService.sendRichTextMail(to, subject, content, imgPath, rscId); 43 System.out.println("发送成功"); 44 } catch (MessagingException ex) { 45 System.out.println("发送失败"); 46 System.out.println(ex.toString()); 47 } 48 } 49 50 //发送HTML邮件 51 @RequestMapping(value = "sendHtml", method = RequestMethod.GET) 52 public void SendWithHtml() { 53 String to = "test@xxxx.com"; 54 String subject = "Java发邮件测试"; 55 String content = "<html><head></head><body><h3>这是html邮件。。。</h3></body></html>"; 56 try { 57 emailService.sendHtmlMail(to, subject, content); 58 System.out.println("发送成功"); 59 } catch (MessagingException ex) { 60 System.out.println("发送失败"); 61 System.out.println(ex.toString()); 62 } 63 } 64 }
在controller中要注意的是,需要把EmailService注入,不能实例化,否则在Service类中@Value()注解会找不到spring.mail.username的值,
原因请参考:https://stackoverflow.com/questions/39047333/spring-boot-value-properties
我的理解是,手动实例化(new)类的实例是JVM做的事情,SpringBoot并没有参与,所以Value注解将被忽略,字段自然取不到值。
还有被注解的字段不能是static,SpringBoot依赖注入不支static的变量注入。原因是Spring依赖注入的底层原理还是利用反射方式来创建对象。而static修饰的字段、变量在JVM加载类的时候就已经创建,存在于方法区,是类的属性而不是对象的属性,Spring是基于对象层面的依赖注入。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构