springboot3 解决:Could not autowire. No beans of ‘JavaMailSender‘ type found

文章讲述了在SpringBoot应用中遇到的JavaMailSender相关错误,问题在于jakarta.mail.internet.MimeMessage与org.springframework.mail.javamail.MimeMailMessage类型的不兼容。解决方案包括正确配置application.yml文件,确保使用匹配的邮件发送库(JakartaMail代替旧的JavaMail),以及避免导入错误的包。示例代码展示了如何使用JavaMailSender发送邮件,并提供了测试方法。
  • 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.");
    }

效果如下:

邮件接收演示
求点赞转发

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yumuing blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值