项目场景:
在Spring Boot中使用JavaMailSender
发送邮件,出现 java.lang.NullPointerException
<!-- 邮箱依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
报错信息如下图所示:
问题描述
JavaMailSender
放在 SpringBootTests测试类里是可以运行,但是写在别的类里封装起来就会报空指针异常。
@Autowired
private JavaMailSender mailSender;
解决方案:
创建一个工具类SendEmailUtils
,用于封装和配置邮箱。
注意:此类中不需要加任何注解,不需要继承类或实现接口,不需要在application.properties或yml文件进行配置。
工具类SendEmailUtils
代码如下:
public class SendEmailUtils{
public JavaMailSenderImpl JavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.qq.com");
mailSender.setUsername("你的QQ@qq.com");
mailSender.setPassword("你的授权码");
return mailSender;
}
//一个简单的邮件,只有text信息
/**
* @Description:
* @Param: [subject:标题, text:内容, email:接收人的邮件地址]
* @return: void
* @Author: 你自己
* @Date: 2020/2/27
*/
public void SendSimpleEmail(String subject, String text, String email) {
JavaMailSenderImpl javaMailSender = JavaMailSender();
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setSubject(subject); //邮件的主题
mailMessage.setText(text);
mailMessage.setTo(email); //发送给谁
mailMessage.setFrom(Objects.requireNonNull(javaMailSender.getUsername())); //谁发送的
javaMailSender.send(mailMessage);
}
/**
* @Description:
* @Param: [subject:标题, text:内容, html,Boolean html:是否进行html解析
* email:接收人的邮件地址, attachmentMap:附件的名称和文件路径]
* @return: void
* @Author: 你自己
* @Date: 2020/2/27
*/
public void SendMimeEmail(String subject, String text, Boolean html,
String email, Map<String, String> attachmentMap) throws MessagingException {
JavaMailSenderImpl javaMailSender = JavaMailSender();
//一个复杂的邮件`
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//进行组装
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, html);
helper.setSubject(subject);
helper.setText(text, html);
//附件
if (attachmentMap != null) {
Iterator<Map.Entry<String, String>> iterator = attachmentMap.entrySet().iterator();
//map.entrySet()得到的是set集合,可以使用迭代器遍历
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
helper.addAttachment(entry.getKey(),
//附件名称,要写好文件的后缀,不要少写和写错
new File(entry.getValue()));
//附件的文件地址,可以写绝对路径,若是相对路径,如./1.png,代表的是resources下的1.png
}
}
helper.setTo(email); //发送给谁
helper.setFrom(Objects.requireNonNull(javaMailSender.getUsername())); //谁发送的
javaMailSender.send(mimeMessage);
}
}
在测试类中使用工具类发送邮件(简单邮件、附件邮件),测试类如下:
@SpringBootTest
public class SendEmailTest {
@Test
public void TestSendEmail() throws MessagingException {
// 简单邮件的发送
SendEmailUtils e = new SendEmailUtils ();
e.SendSimpleEmail("标题","内容","接收邮箱的@qq.com");
// 复杂邮件的发送
HashMap<String, String> map = new HashMap<>(); //定义附件
map.put("1.png","./1.png"); //相对路径,相对于resources目录下
map.put("11.png","C:\\Users\\HP\\Pictures\\Saved Pictures\\11.png"); //绝对路径
e.SendMimeEmail("s","s",true,"接收邮箱的@qq.com", map);
}
}
这样就可以了
最后直接在需要使用发送邮件功能的类中new
一个工具类SendEmailUtils
调用发送邮件的方法就OK啦!
本文转载自【已解决: springBoot使用邮件发送进行封装时,报空指针异常】,原文链接:[https://www.codeleading.com/article/84722979296/]
特别感谢原文作者提供这篇优秀的文章!
因为借用了其他人的文章在这里真诚的感谢,我只是记录文章以后遇见问题的时候回来看看,非常感谢。