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

  • 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.");
    }

效果如下:

邮件接收演示
求点赞转发

猜你喜欢

转载自blog.csdn.net/yumuing/article/details/129281757