JavaMailSender发送邮件(整合SpringBoot、解决空指针异常问题)

简介: 一、邮箱开启SMTP服务以qq邮箱为例进入邮箱设置页面后选择账户

一、邮箱开启SMTP服务

qq邮箱为例

进入邮箱设置页面后选择账户

a9b414d9bf0d91630da7b0be3ae6eafd.png

移动至下方的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务


83038f033a5177c2aeee7c2f1603a4b0.png选择开启IMAP/SMTP服务,并获得授权码

二、导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

三、配置邮箱服务参数

如果没有在配置文件中配置该参数,在注入JavaMailSender的bean时会出现无法找到bean的错误

# smtp服务器
spring.mail.host=smtp.qq.com
# smtp用户名
spring.mail.username=xxxxxxxx@qq.com
# 服务授权码
spring.mail.password=xxxxxxxxx

四、编写邮件发送类

package cn.ken.blog.common.utils;
import cn.ken.blog.common.exception.BusinessException;
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;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
 * @author Ken-Chy129
 * @date 2022/4/16 16:40
 */
@Component
public class EmailUtils {
    @Autowired
    private JavaMailSender javaMailSender;
    @Value("${spring.mail.username}")
    private String from;
    public void sendEmail(String to, String subject, String context) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setFrom(from);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setText(context, true);
            javaMailSender.send(mimeMessage);
        } catch (BusinessException e) {
            throw new BusinessException(e.getErrorMessage());
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

五、测试发送邮件

package cn.ken.blog.service.impl;
import cn.ken.blog.common.domain.Result;
import cn.ken.blog.common.enums.ErrorCodeEnum;
import cn.ken.blog.common.enums.StatusEnum;
import cn.ken.blog.common.exception.BusinessException;
import cn.ken.blog.common.utils.EmailUtils;
import cn.ken.blog.entity.User;
import cn.ken.blog.mapper.UserMapper;
import cn.ken.blog.service.IUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Random;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Ken-Chy129
 * @since 2022-04-15
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private EmailUtils emailUtils;
    @Override
    public Result<String> sendOutEmail(String email) throws BusinessException {
        if (this.selectByEmail(email)) {
            return new Result<String>().error(ErrorCodeEnum.USER_EMAIL_EXISTS);
        }
        String subject = "标题:请收好您的验证码";
        String code = String.valueOf(new Random().nextInt(899999) + 100000);
        request.getSession().setAttribute("code", code);
        String msg = "<h4>欢迎您在Ken-Chy129的博客注册</h4>"+"<p style='color:#F00'>您的验证码为:"+code+"</p>";
        emailUtils.sendEmail(email, subject, msg);
        return new Result<String>().success("发送邮件成功!");
    }
    @Override
    public boolean selectByEmail(String email) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(User::getEmail,email)
                             .eq(User::getStatus, StatusEnum.NORMAL.getStatus());
        return userMapper.selectOne(queryWrapper) != null;
    }
}

进入swagger测试接口,输入要发送的邮箱,点击execute

3d2789b4a95997b23267314694e3acb7.png发送成功

1a677fde332213981a0b4df60f6c03c0.png

六、常见问题:JavaMailSend为null

问题原因:没有将写的类注入

必须要用@Component将自己写的类先用springboot容器管理

@Component
public class EmailUtils {
    @Autowired
    private JavaMailSender javaMailSender;
    @Value("${spring.mail.username}")
    private String from;
    public void sendEmail(String to, String subject, String context) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setFrom(from);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setText(context, true);
            javaMailSender.send(mimeMessage);
        } catch (BusinessException e) {
            throw new BusinessException(e.getErrorMessage());
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

相关文章
|
3月前
|
Kubernetes 关系型数据库 MySQL
seata启动问题之指针异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
65 0
项目中常见NPE空指针异常
项目中常见NPE空指针异常
|
2月前
|
消息中间件 JSON Java
如何利用springboot + rabbitmq发送邮件?
RabbitMQ相关知识请参考: RabbitMQ消息确认、消息持久化等核心知识总结 - 简书
29 2
|
2月前
|
Java
【Java专题_03】使用springboot发送邮件
【Java专题_03】使用springboot发送邮件
|
2月前
|
安全 IDE Java
终结空指针异常:Java开发者的生存指南
终结空指针异常:Java开发者的生存指南
58 1
|
2月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
45 1
|
3月前
|
安全 Java 数据安全/隐私保护
SpringBoot+Email发送邮件
邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送,以构建一个可靠的通知体系。
66 0
SpringBoot+Email发送邮件
|
4月前
|
Java
又是把Java基础知识学废的一天,new 一个对象数组,操作时报空指针异常
又是把Java基础知识学废的一天,new 一个对象数组,操作时报空指针异常
36 0
|
4月前
|
存储 缓存 NoSQL
SpringBoot整合Redis调用lua脚本出现空指针异常(序列化器问题)
一、问题描述 业务中出现需要保证原子性的一系列缓存操作,所以决定使用lua脚本来保证原子性。 但是调用过程中lua脚本抛出了异常:attempt to perform arithmetic on local ‘xxx’ (a nil value) 发生异常的lua脚本代码(部分)
|
4月前
|
Java Spring
SpringMVC控制层private方法中出现注入的service对象空指针异常
一、现象 SpringMVC中controller里的private接口中注入的service层的bean为null,而同一个controller中访问修饰符为public和protected的方法不会出现这样的问题。 controller中的方法被AOP进行了代理,普通Controller如果没有AOP,private方法中bean也是正常的。