目录
前言
小伙伴们大家好,最近在个人项目中引入发送邮件的功能时,遇到了问题,异常部分的代码如下,编写的时候JavaMailSender可以正常引入,配置文件中的mail信息也填好了的,但是项目启动遇到报错,报错信息如下,意思就是spring容器中找不到JavaMailSender
Description: A component required a bean of type 'org.springframework.mail.javamail.JavaMailSender' that could not be found. Action: Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration.
@Resource
private JavaMailSender javaMailSender;
@Override
public void sendMail(Email email) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(email.getSendTo());
mimeMessageHelper.setSubject(email.getSubject());
mimeMessageHelper.setText(email.getContent(),true);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
log.error("send mail error , the mail subject if -> {}",email.getSubject(),e);
throw new RuntimeException(e);
}
}
}
分析
使用的是SpringBoot框架,通常不需要手动配置JavaMailSender bean,因为Spring Boot提供了自动配置功能,可以按照以下方式进行排查和解决:
一、检查依赖:确保项目pom.xml
文件中包含了Spring Boot Mail的起步依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
二、确认配置信息:在application.yml
配置文件中填写邮件发送所需的相关信息
mail:
host: smtp.qq.com
protocol: smtp
default-encoding: UTF-8
username: xxx@qq.com
password: xxxxxx
三、检查是否排除自动配置:检查配置类,确保没有排除MailSender
相关的自动配置。
四、查看启动日志:启动应用程序时,查看控制台输出的日志信息,检查是否有关于JavaMailSender
bean创建失败的错误信息
五、手动创建Bean:尝试手动创建JavaMailSender
bean并注入
解决方案
配置检查过后没问题,最终选择手动注入,代码如下,再次重启项目,没有报错
@Configuration注解标识这是一个配置类
@Bean注解标识该方法返回一个bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;
@Configuration
public class MailConfiguration {
@Bean
public JavaMailSenderImpl JavaMailSender(){
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("smtp.qq.com");
javaMailSender.setUsername("xxx@qq.com");
javaMailSender.setPassword("xxxxxx");
return javaMailSender;
}
}
--- end ---