[亲测]完美解决SpringBoot邮件发送 注入JavaMailSenderImpl时出现NullPointerException空指针异常

一、问题描述

近日在做邮件发送功能时 莫名其妙的出现了NullPointerException空指针异常

代码在测试的时候完全正常 但封装成工具类再调用的时候就报错

在解决的过程中也查找过很多相关资料 但帮助不是很大

有个方法是添加@PostConstruct注解然后初始化 但是并没有作用
还有个方法是新建一个普通类 确实能解决部分问题(如果你不是用Thymeleaf模板发送的话)

@Autowired
private static JavaMailSenderImpl javaMailSender;

改为

public static JavaMailSenderImpl JavaMailSender() {
	JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
	mailSender.setHost("邮件服务器");
	mailSender.setUsername("发件人邮箱");
	mailSender.setPassword("SMTP密码");
	return mailSender;
}

但我在邮件里需要发送Thymeleaf页面 因此需要注入TemplateEngine
随后 在用该方法注入TemplateEngine的时候:

public static TemplateEngine TemplateEngine()
{
	TemplateEngine templateEngine=new TemplateEngine();
	return templateEngine;
}

在解析模板页面的时候直接发送了字符串
比如:

templateEngine.process("mailTemplate",context);

邮件里直接发送了"mailTemplate"字符串 根本不是我要发送的页面内容 这谁顶得住呀😣
因此 该方法也被否决了

这个问题研究一整天了 然而 在我的努力下 终于在无意间成功解决了😁

二、解决方法

  • 、我在邮件发送工具类里给注入的JavaMailSenderImpl加上了static 这个static必须去掉
    因为静态方法是属于类的 普通方法才是属于实体对象(即New出来的对象)的
    spring注入是在容器中实例化对象 所以不能使用静态方法

  • 、要给工具类加上@Component注解
    用@autowired注入JavaMailSenderImpl后 将整个类交给了Spring管理
    因此类上必须加@Component
    在调用该工具类的时候也要用@Autowired注入

因此 最终的工具类代码是这样的:
@Component // 要加@Component注解
public class MailUtil {

    @Autowired
    private JavaMailSenderImpl javaMailSender;
    @Autowired
    private TemplateEngine templateEngine;

    public void sendTemplateMail() throws MessagingException, UnsupportedEncodingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setFrom(new InternetAddress("发件人邮箱","发件人昵称","UTF-8"));
        // 收件人邮箱
        mimeMessageHelper.setTo("收件人邮箱");
        mimeMessageHelper.setSubject("邮件标题");

        Context context=new Context();
        // 收件人昵称
        context.setVariable("nickname","陈涛");
        String content=templateEngine.process("mailTemplate",context);

        // true表明为HTML格式邮件
        mimeMessageHelper.setText(content, true);
        javaMailSender.send(mimeMessage);
    }
}
mailTemplate.html 模板页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
	<div th:text="${nickname}+',您好'"></div>
</body>
</html>
测试:
@SpringBootTest
@RunWith(SpringRunner.class)
public class VueBlogApplicationTests {

    @Autowired // 要先注入
    private MailUtil mailUtil;
    
    @Test
    public void test() throws UnsupportedEncodingException, MessagingException {
        mailUtil.sendTemplateMail();
    }
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值