👏 Hi! 我是 Yumuing,一个技术的敲钟人
👨💻 每天分享技术文章,永远做技术的朝拜者
📚 欢迎关注我的博客:Yumuing's blog
- Could not autowire. No beans of 'JavaMailSender' type found.
- Incompatible types. Found: 'jakarta.mail.internet.MimeMessage', required: 'org.springframework.mail.javamail.MimeMailMessage'
两个 Bug 都是由于同一个问题,报错信息关键词是 JavaMailSender,在很多老博文中解决这两个Bug,要么就是 application.yml 没有配置好,导致报错,正确配置如下:
spring
mail:
host: smtp.qq.com
# 邮箱账号
username: xxxxxxxx
# 授权码
password: xxxxxxxxxxx
port: 465
protocol: smtps
properties:
mail:
smtp:
ssl:
enable: true
required: false
debug: true
要么就是导包缺少,当然,在 springboot 中,不会出现该问题,但是可能出现导包错误,因为 spring-boot-starter-mail 默认使用的某些包发生了变化,在 2.2.xx 版本前都是使用 javax 进行发送邮件的,而在之后,采用的是 Jakarta 进行发送邮件的,Jakarta Mail的前生是JavaMail。JavaMail最后一个版本是于2018年8月发布,已经停止更新。新项目应该使用 Jakarta Mail。而两者的接口方法几乎一致,在创建对象时却采用了不一样的包,如:javaMailSender.createMimeMessage()
,一旦发生混用就会导致以上的两个错误,所以,给大家一个正确的导包模板,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>3.0.2</version>
<dependency>
版本请从 mvn仓库查看符合自身 springboot 版本的
注意这两个包不要导错:
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.mail.javamail.MimeMessageHelper;
不要导成 javax 的包。
package top.yumuing.community.util;
import jakarta.mail.MessagingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
@Component
public class MailClient {
private static final Logger logger = LoggerFactory.getLogger(MailClient.class);
@Autowired(required = false)
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String mailFrom;
public void sendMail(String to, String subject, String content){
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
mimeMessageHelper.setFrom(mailFrom);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content, true);
javaMailSender.send(mimeMessageHelper.getMimeMessage());
logger.info("邮件发送成功!");
}catch (MessagingException e){
logger.error("发送邮件失败!");
}
}
}
其中,如果没有添加 (required = false) 也会发生报错,但不影响运行,只是存在一个红线而已,前提是你配置好了邮箱。
@Autowired(required = false)
private JavaMailSender javaMailSender;
测试方法:
@Autowired
private MailClient mailClient;
@Test
public void testTextMail() {
mailClient.sendMail("想要发给哪个邮箱", "TEST", "Welcome.");
}
效果如下: