SpringBoot实现邮件任务(以验证码发送为例)

项目示例已上传至GitHub,可见github项目地址。

项目配置

  1. 新建一个SpringBoot的Web项目,在pom.xml文件中引入mail依赖。

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-mailartifactId>
dependency>
  1. 这里使用QQ邮箱进行邮件发送,需要在邮箱中开启POP3/SMTP服务。
    SpringBoot实现邮件任务(以验证码发送为例)_第1张图片
  2. 配置邮件服务,在application.properties中加入以下配置,需要注意的是这里的password是QQ邮箱SMTP服务访问密码,而非QQ密码。
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.stmp.ssl.enable=true

功能实现

  1. 编写一个EmailService服务类,负责邮件的发送,这里使用@Async异步的原因是合法的请求会在发送邮件的同时返回返回值,无需让请求发送者等待邮件发送完成后才获得返回值,减少等待时间。(如果你还不了解@Async注解,可参考我另一篇博文SpringBoot实现异步任务(@Async注解))
@Service
public class EmailService {
    @Autowired
    JavaMailSenderImpl mailSender;

    /**
     * 从配置文件中获取发件人
     */
    @Value("${spring.mail.username}")
    private String sender;
    
    /**
     * 邮件发送
     * @param receiver 收件人
     * @param verCode 验证码
     * @throws MailSendException 邮件发送错误
     */
    @Async
    public void sendEmailVerCode(String receiver, String verCode) throws MailSendException {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("验证码");	//设置邮件标题
        message.setText("尊敬的用户,您好:\n"
                + "\n本次请求的邮件验证码为:" + verCode + ",本验证码5分钟内有效,请及时输入。(请勿泄露此验证码)\n"
                + "\n如非本人操作,请忽略该邮件。\n(这是一封自动发送的邮件,请不要直接回复)");	//设置邮件正文
        message.setTo(receiver);	//设置收件人
        message.setFrom(sender);	//设置发件人
        mailSender.send(message);	//发送邮件
    }
}
  1. 编写一个VerCodeGenerateUtil类,负责生成6位数字验证码。这里采用SecureRandom类而不采用Math.random的原因如下。

Math.random生成的是一般随机数,采用的是类似于统计学的随机数生成规则,其输出结果很容易预测,因此可能导致被攻击者击中。而SecureRandom是真随机数,采用的是类似于密码学的随机数生成规则,其输出结果较难预测,若想要预防被攻击者攻击,最好做到使攻击者根本无法,或不可能鉴别生成的随机值和真正的随机值。

public class VerCodeGenerateUtil {
    private static final String SYMBOLS = "0123456789";
    private static final Random RANDOM = new SecureRandom();

    /**
     * 生成6位随机数字
     * @return 返回6位数字验证码
     */
    public static String generateVerCode() {
        char[] nonceChars = new char[6];
        for (int index = 0; index < nonceChars.length; ++index) {
            nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
        }
        return new String(nonceChars);
    }
}
  1. 编写一个EmailController控制器类,负责处理邮件发送请求。
@RestController
public class EmailController {
    @Autowired
    EmailService emailService;
    
    @PostMapping("/email")
    public Object sendEmail(@RequestParam("emailAddress") String emailAddress) {
        try {
            emailService.sendEmailVerCode(emailAddress,generateVerCode());
            return "邮件发送成功";
        } catch (Exception e) {
            return "邮件发送失败";
        }
    }
}
  1. 使用Postman测试邮件发送,可以看到邮件发送成功。
SpringBoot实现邮件任务(以验证码发送为例)_第2张图片
  1. 进入收件箱,可以看到成功收到了邮件。
SpringBoot实现邮件任务(以验证码发送为例)_第3张图片

你可能感兴趣的:(SpringBoot)