SpringBoot 整合Mail邮件
1. 邮件与协议
A. smtp(简单邮件传输协议):smtp是Simple Mail Transfer Protocol缩写,它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式,smtp认证要求必须提供账号和密码才能登陆服务器,其目的是避免用户受到垃圾邮件的干扰;
B. pop3(邮局协议):pop3是Post Office Protocol 3缩写,支持客户端远程管理服务器端的邮件;
C. smtp服务器地址:网易163/QQ/126/sina/aliyun邮箱 ——> smtp.163.com/smtp.qq.com/ smtp.126.com/smtp.sina.com/ smtp.aliyun.com;
D. 邮件分简单邮件和复杂邮件,复杂邮件有html格式邮件、带附件格式邮件、带静态资源邮件、基于Freemarker模板的邮件;
2. pom.xml Maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
3. 邮箱信息配置
A. application.properties文件配置
B. 前端传输参数动态配置
注意:若使用配置文件设置邮箱信息,可使用JavaMailSender接口发送邮件;若动态配置邮箱信息,需使用JavaMailSenderImpl实现类发送邮件;它们是Java后端发送邮件和集成邮件服务的主流工具。
4. 发送邮件
A. 发送简单邮件
package com.ruhuanxingyun.dcy.service.manage.service; import com.ruhuanxingyun.dcy.service.manage.model.dto.MailDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.mail.MailProperties; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; /** * @description: 邮件 服务层 * @author: ruphie * @date: Create in 2021/4/17 11:00 * @company: ruhuanxingyun */ @Slf4j @Service public class MailService { @Autowired private MailProperties mailProperties; @Autowired private JavaMailSender javaMailSender; /** * 发送简单邮件 * @param mailDTO 邮件信息 */ public void sendSimpleMail(MailDTO mailDTO) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); // 邮件发送人 simpleMailMessage.setFrom(mailProperties.getUsername()); // 邮件收件人 simpleMailMessage.setTo(mailDTO.getMailRecipient()); //邮件主题 simpleMailMessage.setSubject(mailDTO.getSubject()); //邮件内容 simpleMailMessage.setText(mailDTO.getContent()); // 发送邮件 javaMailSender.send(simpleMailMessage); } }
B. 发送HTML邮件
package com.ruhuanxingyun.service.system.impl; import com.ruhuanxingyun.entity.system.Mail; import com.ruhuanxingyun.service.system.IMailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.util.Properties; /** * @description: 邮件工具接口实现层 * @author: ruphie * @date: Create in 2020/1/4 16:58 * @company: ruhuanxingyun */ @Service public class MailServiceImpl implements IMailService { @Autowired private JavaMailSenderImpl javaMailSender; @Override public void sendHtmlMail(Mail mail){ javaMailSender.setDefaultEncoding("UTF-8"); javaMailSender.setHost(mail.getMailHost());
javaMailSender.setPort(mail.getMailPort()); // 是否SSL加密连接 if (mail.getOnSsl() == 2) { Properties properties = new Properties(); properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); javaMailSender.setJavaMailProperties(properties); } // 需要验证邮箱用户名和密码 if (mail.getOnAuth() == 2) { javaMailSender.setUsername(mail.getUsername()); javaMailSender.setPassword(mail.getPassword()); } MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true); messageHelper.setFrom(mail.getMailSender()); messageHelper.setTo(mail.getMailRecipient()); messageHelper.setSubject(mail.getSubject()); messageHelper.setText(mail.getContent(), true); javaMailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); throw new RuntimeException("发送测试邮件失败"); } } }
C. 发送带静态资源邮件
D. 发送带附件邮件
5. 常见错误
错误一:注入JavaMailSender或JavaMailSenderImpl,启动报错
原因:无法找到该类,因为没有被扫描到,无法自动注入
解决:配置bean类,并在类上加@Configuration
可参考:SpringBoot整合Mail邮件;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗